├── app_template
├── css
│ ├── main.css
│ └── bootstrap.css
├── templates
│ └── main_page.handlebars
├── lib
│ ├── library.js
│ ├── core.js
│ ├── main.js
│ └── ext.js
├── tests
│ ├── core.js
│ └── library_test.js
├── static
│ └── img
│ │ ├── glyphicons-halflings.png
│ │ └── glyphicons-halflings-white.png
└── plugins
│ └── loader.js
├── .gitignore
├── Guardfile
├── templates
├── index.html
└── Assetfile
├── config.ru
├── Gemfile
├── Initfile
├── LICENSE
├── tests
├── index.html
└── qunit
│ ├── run-qunit.js
│ ├── qunit.css
│ └── qunit.js
├── README.md
├── Gemfile.lock
├── Rakefile
└── lib
└── github_uploader.rb
/app_template/css/main.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app_template/templates/main_page.handlebars:
--------------------------------------------------------------------------------
1 | My library
2 |
--------------------------------------------------------------------------------
/app_template/lib/library.js:
--------------------------------------------------------------------------------
1 | Library = Ember.Namespace.create();
--------------------------------------------------------------------------------
/app_template/tests/core.js:
--------------------------------------------------------------------------------
1 | require('#{LIBRARYNAME}/core');
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | tmp/
3 | assets/
4 |
5 | .github-upload-token
--------------------------------------------------------------------------------
/Guardfile:
--------------------------------------------------------------------------------
1 | guard :rake, :task => :test do
2 | watch(%r{^app/.+\.js$})
3 | end
4 |
--------------------------------------------------------------------------------
/app_template/lib/core.js:
--------------------------------------------------------------------------------
1 | require('jquery');
2 | require('ember');
3 |
4 | require('#{LIBRARYNAME}/ext');
--------------------------------------------------------------------------------
/app_template/static/img/glyphicons-halflings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pangratz/ember-library-template/master/app_template/static/img/glyphicons-halflings.png
--------------------------------------------------------------------------------
/app_template/static/img/glyphicons-halflings-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pangratz/ember-library-template/master/app_template/static/img/glyphicons-halflings-white.png
--------------------------------------------------------------------------------
/app_template/lib/main.js:
--------------------------------------------------------------------------------
1 | require('#{LIBRARYNAME}/core');
2 | require('#{LIBRARYNAME}/#{LIBRARYNAME}');
3 |
4 | Ember.View.create({
5 | templateName: '#{LIBRARYNAME}/~templates/main_page'
6 | }).append();
--------------------------------------------------------------------------------
/app_template/tests/library_test.js:
--------------------------------------------------------------------------------
1 | require('#{APPNAME}/#{LIBRARYNAME}');
2 |
3 | module("#{LIBRARYNAME}");
4 |
5 | test("Library is defined", function () {
6 | ok(Library !== undefined, "Library is undefined");
7 | });
8 |
--------------------------------------------------------------------------------
/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Ember Skeleton
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
--------------------------------------------------------------------------------
/config.ru:
--------------------------------------------------------------------------------
1 | require 'rake-pipeline'
2 | require 'rake-pipeline/middleware'
3 | use Rake::Pipeline::Middleware, 'Assetfile'
4 |
5 | # require 'rack/streaming_proxy'
6 | # use Rack::StreamingProxy do |request|
7 | # if request.path.start_with?('/proxy')
8 | # "http://127.0.0.1:8080#{request.path}"
9 | # end
10 | # end
11 |
12 | require 'rack-rewrite'
13 | use Rack::Rewrite do
14 | rewrite %r{^(.*)\/$}, '$1/index.html'
15 | end
16 |
17 | run Rack::Directory.new('.')
18 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source :rubygems
2 |
3 | gem 'colored'
4 |
5 | gem 'guard'
6 | gem 'guard-rake'
7 |
8 | gem 'rack'
9 | gem 'rack-rewrite'
10 | # gem 'rack-streaming-proxy'
11 |
12 | gem "json"
13 | gem "nokogiri"
14 | gem "rest-client"
15 | gem "github_api"
16 |
17 | gem 'sass'
18 | gem 'compass'
19 |
20 | gem 'uglifier'
21 | gem 'yui-compressor'
22 |
23 | gem 'rake-pipeline', :git => 'https://github.com/livingsocial/rake-pipeline.git'
24 | gem 'rake-pipeline-web-filters', :git => 'https://github.com/wycats/rake-pipeline-web-filters.git'
25 |
--------------------------------------------------------------------------------
/app_template/lib/ext.js:
--------------------------------------------------------------------------------
1 | var get = Ember.get;
2 |
3 | Ember.View.reopen({
4 | templateForName: function(name, type) {
5 | if (!name) {
6 | return;
7 | }
8 |
9 | var templates = get(this, 'templates'),
10 | template = get(templates, name);
11 |
12 | if (!template) {
13 | template = require(name);
14 | if (!template) {
15 | throw new Ember.Error(fmt('%@ - Unable to find %@ "%@".', [this, type, name]));
16 | }
17 | }
18 |
19 | return template;
20 | }
21 | });
--------------------------------------------------------------------------------
/Initfile:
--------------------------------------------------------------------------------
1 | class AppNameFilter < Filter
2 | def generate_output(inputs, output)
3 | inputs.each do |input|
4 | result = input.read
5 | result.gsub!(/#\{LIBRARYNAME\}/, "#{LIBRARYNAME}")
6 | output.write(result)
7 | end
8 | end
9 | end
10 |
11 | output "app"
12 | input "app_template" do
13 | match "lib/library.js" do
14 | concat "lib/#{LIBRARYNAME}.js"
15 | end
16 |
17 | match "**/*.{js,css,html}" do
18 | filter AppNameFilter
19 | end
20 |
21 | # copy any unprocessed files over to the output directory
22 | filter Rake::Pipeline::ConcatFilter
23 | end
24 |
25 | output "."
26 | input "templates" do
27 | match "*" do
28 | filter AppNameFilter
29 | end
30 | end
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) Your Name Here
2 |
3 | Permission to use, copy, modify, and/or distribute this software for any
4 | purpose with or without fee is hereby granted, provided that the above
5 | copyright notice and this permission notice appear in all copies.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14 |
--------------------------------------------------------------------------------
/tests/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | QUnit Test Suite
6 |
7 |
8 |
9 |
10 |
11 | test markup
12 |
13 |
14 |
15 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Ember Library Template
2 | ======================
3 |
4 | A template to get started when writing a new Ember.js template. This template is based on [interline/ember-skeleton](https://github.com/interline/ember-skeleton).
5 |
6 | Get started
7 | -----------
8 |
9 | $ git clone git@github.com:pangratz/ember-library-template.git
10 | $ cd ember-library-template
11 | $ bundle install
12 |
13 | Change LIBRARYNAME in `Rakefile` to the name of your library
14 |
15 | $ bundle execute rake init
16 |
17 | This initializes your library. Afterwards delete the `init` task in the `Rakefile`.
18 |
19 | Now the template is initialized. Next: change the name of your library. To do this, update the value of the `APPNAME` variable in `Rakefile` and `Assetfile`.
20 |
21 | Run the tests
22 | -------------
23 |
24 | $ bundle exec rake test
25 |
26 | or
27 |
28 | $ bundle exec rackup && open http://localhost:9292/tests/index.html
29 |
30 | or
31 |
32 | $ bundle exec guard
33 |
34 | Develop your library
35 | --------------------
36 |
37 | Implement your awesome library in `app/lib/library.js` and don't forget to add tests in `app/tests/library_test.js`.
38 |
39 | Upload latest version of your library to GitHub
40 | -----------------------------------------------
41 |
42 | Invoke `rake upload_latest` to upload the latest version of your library to GitHub Downloads.
--------------------------------------------------------------------------------
/app_template/plugins/loader.js:
--------------------------------------------------------------------------------
1 | (function(window) {
2 | function requireWrapper(self) {
3 | var require = function() {
4 | return self.require.apply(self, arguments);
5 | };
6 | require.exists = function() {
7 | return self.exists.apply(self, arguments);
8 | };
9 | return require;
10 | }
11 |
12 | var Context = function() {
13 | return this;
14 | };
15 |
16 | var Loader = function() {
17 | this.modules = {};
18 | this.loaded = {};
19 | this.exports = {};
20 | return this;
21 | };
22 |
23 | Loader.prototype.require = function(name) {
24 | if (!this.loaded[name]) {
25 | var module = this.modules[name];
26 | if (module) {
27 | var require = requireWrapper(this);
28 | try {
29 | this.exports[name] = module.call(new Context(), require);
30 | return this.exports[name];
31 | } finally {
32 | this.loaded[name] = true;
33 | }
34 | } else {
35 | throw "The module '" + name + "' has not been registered";
36 | }
37 | }
38 | return this.exports[name];
39 | };
40 |
41 | Loader.prototype.register = function(name, module) {
42 | if (this.exists(name)) {
43 | throw "The module '"+ "' has already been registered";
44 | }
45 | this.modules[name] = module;
46 | return true;
47 | };
48 |
49 | Loader.prototype.unregister = function(name) {
50 | var loaded = !!this.loaded[name];
51 | if (loaded) {
52 | delete this.exports[name];
53 | delete this.modules[name];
54 | delete this.loaded[name];
55 | }
56 | return loaded;
57 | };
58 |
59 | Loader.prototype.exists = function(name) {
60 | return name in this.modules;
61 | };
62 |
63 | window.loader = new Loader();
64 | })(this);
65 |
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GIT
2 | remote: https://github.com/livingsocial/rake-pipeline.git
3 | revision: b70ca6cad7655e58d13031f3e24df7dfc74f9030
4 | specs:
5 | rake-pipeline (0.6.0)
6 | rake (~> 0.9.0)
7 | thor
8 |
9 | GIT
10 | remote: https://github.com/wycats/rake-pipeline-web-filters.git
11 | revision: ba0b8a00356b4c854930a8e849b5629d51ffd70f
12 | specs:
13 | rake-pipeline-web-filters (0.6.0)
14 | rack
15 | rake-pipeline (~> 0.6)
16 |
17 | GEM
18 | remote: http://rubygems.org/
19 | specs:
20 | POpen4 (0.1.4)
21 | Platform (>= 0.4.0)
22 | open4
23 | Platform (0.4.0)
24 | addressable (2.2.8)
25 | chunky_png (1.2.5)
26 | colored (1.2)
27 | compass (0.12.1)
28 | chunky_png (~> 1.2)
29 | fssm (>= 0.2.7)
30 | sass (~> 3.1)
31 | execjs (1.3.0)
32 | multi_json (~> 1.0)
33 | faraday (0.7.6)
34 | addressable (~> 2.2)
35 | multipart-post (~> 1.1)
36 | rack (~> 1.1)
37 | ffi (1.0.11)
38 | fssm (0.2.8.1)
39 | github_api (0.4.10)
40 | faraday (~> 0.7.6)
41 | hashie (~> 1.2.0)
42 | multi_json (~> 1.0)
43 | oauth2 (~> 0.5.2)
44 | guard (1.0.1)
45 | ffi (>= 0.5.0)
46 | thor (~> 0.14.6)
47 | guard-rake (0.0.5)
48 | guard
49 | rake
50 | hashie (1.2.0)
51 | json (1.7.3)
52 | mime-types (1.18)
53 | multi_json (1.2.0)
54 | multipart-post (1.1.5)
55 | nokogiri (1.5.2)
56 | oauth2 (0.5.2)
57 | faraday (~> 0.7)
58 | multi_json (~> 1.0)
59 | open4 (1.3.0)
60 | rack (1.4.1)
61 | rack-rewrite (1.2.1)
62 | rake (0.9.2.2)
63 | rest-client (1.6.7)
64 | mime-types (>= 1.16)
65 | sass (3.1.15)
66 | thor (0.14.6)
67 | uglifier (1.2.4)
68 | execjs (>= 0.3.0)
69 | multi_json (>= 1.0.2)
70 | yui-compressor (0.9.6)
71 | POpen4 (>= 0.1.4)
72 |
73 | PLATFORMS
74 | ruby
75 |
76 | DEPENDENCIES
77 | colored
78 | compass
79 | github_api
80 | guard
81 | guard-rake
82 | json
83 | nokogiri
84 | rack
85 | rack-rewrite
86 | rake-pipeline!
87 | rake-pipeline-web-filters!
88 | rest-client
89 | sass
90 | uglifier
91 | yui-compressor
92 |
--------------------------------------------------------------------------------
/tests/qunit/run-qunit.js:
--------------------------------------------------------------------------------
1 | // PhantomJS QUnit Test Runner
2 |
3 | var args = phantom.args;
4 | if (args.length < 1 || args.length > 2) {
5 | console.log("Usage: " + phantom.scriptName + " ");
6 | phantom.exit(1);
7 | }
8 |
9 | var page = require('webpage').create();
10 |
11 | var depRe = /^DEPRECATION:/;
12 | page.onConsoleMessage = function(msg) {
13 | if (!depRe.test(msg)) console.log(msg);
14 | };
15 |
16 | page.open(args[0], function(status) {
17 | if (status !== 'success') {
18 | console.error("Unable to access network");
19 | phantom.exit(1);
20 | } else {
21 | page.evaluate(addLogging);
22 |
23 | var timeout = parseInt(args[1] || 30000, 10);
24 | var start = Date.now();
25 | var interval = setInterval(function() {
26 | if (Date.now() > start + timeout) {
27 | console.error("Tests timed out");
28 | phantom.exit(1);
29 | } else {
30 | var qunitDone = page.evaluate(function() {
31 | return window.qunitDone;
32 | });
33 |
34 | if (qunitDone) {
35 | clearInterval(interval);
36 | if (qunitDone.failed > 0) {
37 | phantom.exit(1);
38 | } else {
39 | phantom.exit();
40 | }
41 | }
42 | }
43 | }, 500);
44 | }
45 | });
46 |
47 | function addLogging() {
48 | var testErrors = [];
49 | var assertionErrors = [];
50 |
51 | QUnit.moduleDone(function(context) {
52 | if (context.failed) {
53 | var msg = "Module Failed: " + context.name + "\n" + testErrors.join("\n");
54 | console.error(msg);
55 | testErrors = [];
56 | }
57 | });
58 |
59 | QUnit.testDone(function(context) {
60 | if (context.failed) {
61 | var msg = " Test Failed: " + context.name + assertionErrors.join(" ");
62 | testErrors.push(msg);
63 | assertionErrors = [];
64 | }
65 | });
66 |
67 | QUnit.log(function(context) {
68 | if (context.result) return;
69 |
70 | var msg = "\n Assertion Failed:";
71 | if (context.message) {
72 | msg += " " + context.message;
73 | }
74 |
75 | if (context.expected) {
76 | msg += "\n Expected: " + context.expected + ", Actual: " + context.actual;
77 | }
78 |
79 | assertionErrors.push(msg);
80 | });
81 |
82 | QUnit.done(function(context) {
83 | var stats = [
84 | "Time: " + context.runtime + "ms",
85 | "Total: " + context.total,
86 | "Passed: " + context.passed,
87 | "Failed: " + context.failed
88 | ];
89 | console.log(stats.join(", "));
90 | window.qunitDone = context;
91 | });
92 | }
93 |
--------------------------------------------------------------------------------
/Rakefile:
--------------------------------------------------------------------------------
1 | LIBRARYNAME = 'my-library'
2 |
3 | require 'colored'
4 | require 'rake-pipeline'
5 |
6 | desc "Build #{LIBRARYNAME}"
7 | task :build do
8 | Rake::Pipeline::Project.new('Assetfile').invoke
9 | end
10 |
11 | desc "Clean #{LIBRARYNAME}"
12 | task :clean do
13 | Rake::Pipeline::Project.new('Assetfile').clean
14 | end
15 |
16 | desc "Run tests with PhantomJS"
17 | task :test => :build do
18 | unless system("which phantomjs > /dev/null 2>&1")
19 | abort "PhantomJS is not installed. Download from http://phantomjs.org/"
20 | end
21 |
22 | cmd = "phantomjs tests/qunit/run-qunit.js \"file://#{File.dirname(__FILE__)}/tests/index.html\""
23 |
24 | # Run the tests
25 | puts "Running #{LIBRARYNAME} tests"
26 | success = system(cmd)
27 |
28 | if success
29 | puts "Tests Passed".green
30 | else
31 | puts "Tests Failed".red
32 | exit(1)
33 | end
34 | end
35 |
36 | def setup_uploader(root=Dir.pwd)
37 | require './lib/github_uploader'
38 |
39 | login = origin = nil
40 |
41 | Dir.chdir(root) do
42 | # get the github user name
43 | login = `git config github.user`.chomp
44 |
45 | # get repo from git config's origin url
46 | origin = `git config remote.origin.url`.chomp # url to origin
47 | # extract USERNAME/REPO_NAME
48 | # sample urls: https://github.com/emberjs/ember.js.git
49 | # git://github.com/emberjs/ember.js.git
50 | # git@github.com:emberjs/ember.js.git
51 | # git@github.com:emberjs/ember.js
52 | end
53 |
54 | repoUrl = origin.match(/github\.com[\/:]((.+?)\/(.+?))(\.git)?$/)
55 | username = repoUrl[2] # username part of origin url
56 | repo = repoUrl[3] # repository name part of origin url
57 |
58 | token = ENV["GH_OAUTH_TOKEN"]
59 | uploader = GithubUploader.new(login, username, repo, token)
60 | uploader.authorize
61 |
62 | uploader
63 | end
64 |
65 | def upload_file(uploader, filename, description, file)
66 | print "Uploading #{filename}..."
67 | if uploader.upload_file(filename, description, file)
68 | puts "Success"
69 | else
70 | puts "Failure"
71 | end
72 | end
73 |
74 | desc "Upload latest build of #{LIBRARYNAME} to GitHub repository"
75 | task :upload_latest do
76 | uploader = setup_uploader
77 |
78 | upload_file(uploader, "#{LIBRARYNAME}-latest.js", "#{LIBRARYNAME} Master", "app/lib/#{LIBRARYNAME}.js")
79 | end
80 |
81 | desc "Init app"
82 | task :init do
83 | Rake::Pipeline::Project.new('Initfile').invoke
84 |
85 | FileUtils.rm_rf('app_template')
86 | FileUtils.rm_rf('templates')
87 |
88 | FileUtils.rm_rf('.git')
89 | `git init`
90 |
91 | puts "App initialized. Remove 'init' task from Rakefile"
92 | end
93 |
--------------------------------------------------------------------------------
/lib/github_uploader.rb:
--------------------------------------------------------------------------------
1 | require "rest-client"
2 | require "github_api"
3 | require "json"
4 |
5 | class GithubUploader
6 |
7 | def initialize(login, username, repo, token=nil, root=Dir.pwd)
8 | @login = login
9 | @username = username
10 | @repo = repo
11 | @root = root
12 | @token = token || check_token
13 | end
14 |
15 | def authorized?
16 | !!@token
17 | end
18 |
19 | def token_path
20 | File.expand_path(".github-upload-token", @root)
21 | end
22 |
23 | def check_token
24 | File.exist?(token_path) ? File.open(token_path, "rb").read : nil
25 | end
26 |
27 | def authorize
28 | return if authorized?
29 |
30 | puts "There is no file named .github-upload-token in this folder. This file holds the OAuth token needed to communicate with GitHub."
31 | puts "You will be asked to enter your GitHub password so a new OAuth token will be created."
32 | print "GitHub Password: "
33 | system "stty -echo" # disable echoing of entered chars so password is not shown on console
34 | pw = STDIN.gets.chomp
35 | system "stty echo" # enable echoing of entered chars
36 | puts ""
37 |
38 | # check if the user already granted access for Ember.js Uploader by checking the available authorizations
39 | response = RestClient.get "https://#{@login}:#{pw}@api.github.com/authorizations"
40 | JSON.parse(response.to_str).each do |auth|
41 | if auth["note"] == "Ember.js Uploader"
42 | # user already granted access, so we reuse the existing token
43 | @token = auth["token"]
44 | end
45 | end
46 |
47 | ## we need to create a new token
48 | unless @token
49 | payload = {
50 | :scopes => ["public_repo"],
51 | :note => "Ember.js Uploader",
52 | :note_url => "https://github.com/#{@username}/#{@repo}"
53 | }
54 | response = RestClient.post "https://#{@login}:#{pw}@api.github.com/authorizations", payload.to_json, :content_type => :json
55 | @token = JSON.parse(response.to_str)["token"]
56 | end
57 |
58 | # finally save the token into .github-upload-token
59 | File.open(".github-upload-token", 'w') {|f| f.write(@token)}
60 | end
61 |
62 | def upload_file(filename, description, file)
63 | return false unless authorized?
64 |
65 | gh = Github.new :user => @username, :repo => @repo, :oauth_token => @token
66 |
67 | # remvove previous download with the same name
68 | gh.repos.downloads do |download|
69 | if filename == download.name
70 | gh.repos.delete_download @username, @repo, download.id
71 | break
72 | end
73 | end
74 |
75 | # step 1
76 | hash = gh.repos.create_download @username, @repo,
77 | "name" => filename,
78 | "size" => File.size(file),
79 | "description" => description
80 |
81 | # step 2
82 | gh.repos.upload hash, file
83 |
84 | return true
85 | end
86 |
87 | end
88 |
--------------------------------------------------------------------------------
/templates/Assetfile:
--------------------------------------------------------------------------------
1 | APPNAME = "#{LIBRARYNAME}"
2 |
3 | require 'json'
4 | require 'rake-pipeline-web-filters'
5 |
6 | WebFilters = Rake::Pipeline::Web::Filters
7 |
8 | class AppNameFilter < Filter
9 | def generate_output(inputs, output)
10 | inputs.each do |input|
11 | result = input.read
12 | result.gsub!(/#\{APPNAME\}/, "#{APPNAME}")
13 | output.write(result)
14 | end
15 | end
16 | end
17 |
18 | class LoaderFilter < WebFilters::MinispadeFilter
19 | def generate_output(inputs, output)
20 | inputs.each do |input|
21 | code = input.read
22 | module_id = @module_id_generator.call(input)
23 | contents = "function(require) {\n#{code}\n}"
24 | ret = "\nloader.register('#{module_id}', #{contents});\n"
25 | output.write ret
26 | end
27 | end
28 | end
29 |
30 | class EmberAssertFilter < Filter
31 | def generate_output(inputs, output)
32 | inputs.each do |input|
33 | result = input.read
34 | result.gsub!(/ember_assert\((.*)\);/, '')
35 | output.write(result)
36 | end
37 | end
38 | end
39 |
40 | class HandlebarsFilter < Filter
41 | def generate_output(inputs, output)
42 | inputs.each do |input|
43 | code = input.read.to_json
44 | name = File.basename(input.path, '.handlebars')
45 | output.write "\nreturn Ember.Handlebars.compile(#{code});\n"
46 | end
47 | end
48 | end
49 |
50 | output 'assets'
51 |
52 | input 'app' do
53 | match 'lib/**/*.js' do
54 | filter AppNameFilter
55 | filter LoaderFilter,
56 | :module_id_generator => proc { |input|
57 | input.path.sub(/^lib\//, "#{APPNAME}/").sub(/\.js$/, '')
58 | }
59 |
60 | if ENV['RAKEP_MODE'] == 'production'
61 | filter EmberAssertFilter
62 | uglify {|input| input}
63 | end
64 | concat 'app.js'
65 | end
66 |
67 | match 'vendor/**/*.js' do
68 | filter LoaderFilter,
69 | :module_id_generator => proc { |input|
70 | input.path.sub(/^vendor\//, '').sub(/\.js$/, '')
71 | }
72 |
73 | if ENV['RAKEP_MODE'] == 'production'
74 | filter EmberAssertFilter
75 | uglify {|input| input}
76 | end
77 | concat 'app.js'
78 | end
79 |
80 | match 'modules/**/*.js' do
81 | if ENV['RAKEP_MODE'] == 'production'
82 | filter EmberAssertFilter
83 | uglify {|input| input}
84 | end
85 | concat 'app.js'
86 | end
87 |
88 | match 'plugins/**/*.js' do
89 | if ENV['RAKEP_MODE'] == 'production'
90 | uglify {|input| input}
91 | end
92 | concat do |input|
93 | input.sub(/plugins\//, '')
94 | end
95 | end
96 |
97 | match 'templates/**/*.handlebars' do
98 | filter HandlebarsFilter
99 | filter LoaderFilter,
100 | :module_id_generator => proc { |input|
101 | input.path.sub(/^templates\//, "#{APPNAME}/~templates/").sub(/\.handlebars$/, '')
102 | }
103 | if ENV['RAKEP_MODE'] == 'production'
104 | uglify {|input| input}
105 | end
106 | concat 'app.js'
107 | end
108 |
109 | match 'tests/**/*.js' do
110 | filter AppNameFilter
111 | filter LoaderFilter,
112 | :module_id_generator => proc { |input|
113 | input.path.sub(/^lib\//, "#{APPNAME}/").sub(/\.js$/, '')
114 | }
115 | concat 'app-tests.js'
116 | end
117 |
118 | match 'css/**/*.css' do
119 | if ENV['RAKEP_MODE'] == 'production'
120 | yui_css
121 | end
122 | concat 'app.css'
123 | end
124 |
125 | match 'css/**/*.scss' do
126 | sass
127 | if ENV['RAKEP_MODE'] == 'production'
128 | yui_css
129 | end
130 | concat 'app.css'
131 | end
132 |
133 | match "static/**/*" do
134 | concat do |input|
135 | input.sub(/static\//, '')
136 | end
137 | end
138 | end
139 |
140 | # vim: filetype=ruby
141 |
--------------------------------------------------------------------------------
/tests/qunit/qunit.css:
--------------------------------------------------------------------------------
1 | /**
2 | * QUnit v1.4.0 - A JavaScript Unit Testing Framework
3 | *
4 | * http://docs.jquery.com/QUnit
5 | *
6 | * Copyright (c) 2012 John Resig, Jörn Zaefferer
7 | * Dual licensed under the MIT (MIT-LICENSE.txt)
8 | * or GPL (GPL-LICENSE.txt) licenses.
9 | */
10 |
11 | /** Font Family and Sizes */
12 |
13 | #qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
14 | font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
15 | }
16 |
17 | #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
18 | #qunit-tests { font-size: smaller; }
19 |
20 |
21 | /** Resets */
22 |
23 | #qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
24 | margin: 0;
25 | padding: 0;
26 | }
27 |
28 |
29 | /** Header */
30 |
31 | #qunit-header {
32 | padding: 0.5em 0 0.5em 1em;
33 |
34 | color: #8699a4;
35 | background-color: #0d3349;
36 |
37 | font-size: 1.5em;
38 | line-height: 1em;
39 | font-weight: normal;
40 |
41 | border-radius: 15px 15px 0 0;
42 | -moz-border-radius: 15px 15px 0 0;
43 | -webkit-border-top-right-radius: 15px;
44 | -webkit-border-top-left-radius: 15px;
45 | }
46 |
47 | #qunit-header a {
48 | text-decoration: none;
49 | color: #c2ccd1;
50 | }
51 |
52 | #qunit-header a:hover,
53 | #qunit-header a:focus {
54 | color: #fff;
55 | }
56 |
57 | #qunit-header label {
58 | display: inline-block;
59 | }
60 |
61 | #qunit-banner {
62 | height: 5px;
63 | }
64 |
65 | #qunit-testrunner-toolbar {
66 | padding: 0.5em 0 0.5em 2em;
67 | color: #5E740B;
68 | background-color: #eee;
69 | }
70 |
71 | #qunit-userAgent {
72 | padding: 0.5em 0 0.5em 2.5em;
73 | background-color: #2b81af;
74 | color: #fff;
75 | text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
76 | }
77 |
78 |
79 | /** Tests: Pass/Fail */
80 |
81 | #qunit-tests {
82 | list-style-position: inside;
83 | }
84 |
85 | #qunit-tests li {
86 | padding: 0.4em 0.5em 0.4em 2.5em;
87 | border-bottom: 1px solid #fff;
88 | list-style-position: inside;
89 | }
90 |
91 | #qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
92 | display: none;
93 | }
94 |
95 | #qunit-tests li strong {
96 | cursor: pointer;
97 | }
98 |
99 | #qunit-tests li a {
100 | padding: 0.5em;
101 | color: #c2ccd1;
102 | text-decoration: none;
103 | }
104 | #qunit-tests li a:hover,
105 | #qunit-tests li a:focus {
106 | color: #000;
107 | }
108 |
109 | #qunit-tests ol {
110 | margin-top: 0.5em;
111 | padding: 0.5em;
112 |
113 | background-color: #fff;
114 |
115 | border-radius: 15px;
116 | -moz-border-radius: 15px;
117 | -webkit-border-radius: 15px;
118 |
119 | box-shadow: inset 0px 2px 13px #999;
120 | -moz-box-shadow: inset 0px 2px 13px #999;
121 | -webkit-box-shadow: inset 0px 2px 13px #999;
122 | }
123 |
124 | #qunit-tests table {
125 | border-collapse: collapse;
126 | margin-top: .2em;
127 | }
128 |
129 | #qunit-tests th {
130 | text-align: right;
131 | vertical-align: top;
132 | padding: 0 .5em 0 0;
133 | }
134 |
135 | #qunit-tests td {
136 | vertical-align: top;
137 | }
138 |
139 | #qunit-tests pre {
140 | margin: 0;
141 | white-space: pre-wrap;
142 | word-wrap: break-word;
143 | }
144 |
145 | #qunit-tests del {
146 | background-color: #e0f2be;
147 | color: #374e0c;
148 | text-decoration: none;
149 | }
150 |
151 | #qunit-tests ins {
152 | background-color: #ffcaca;
153 | color: #500;
154 | text-decoration: none;
155 | }
156 |
157 | /*** Test Counts */
158 |
159 | #qunit-tests b.counts { color: black; }
160 | #qunit-tests b.passed { color: #5E740B; }
161 | #qunit-tests b.failed { color: #710909; }
162 |
163 | #qunit-tests li li {
164 | margin: 0.5em;
165 | padding: 0.4em 0.5em 0.4em 0.5em;
166 | background-color: #fff;
167 | border-bottom: none;
168 | list-style-position: inside;
169 | }
170 |
171 | /*** Passing Styles */
172 |
173 | #qunit-tests li li.pass {
174 | color: #5E740B;
175 | background-color: #fff;
176 | border-left: 26px solid #C6E746;
177 | }
178 |
179 | #qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
180 | #qunit-tests .pass .test-name { color: #366097; }
181 |
182 | #qunit-tests .pass .test-actual,
183 | #qunit-tests .pass .test-expected { color: #999999; }
184 |
185 | #qunit-banner.qunit-pass { background-color: #C6E746; }
186 |
187 | /*** Failing Styles */
188 |
189 | #qunit-tests li li.fail {
190 | color: #710909;
191 | background-color: #fff;
192 | border-left: 26px solid #EE5757;
193 | white-space: pre;
194 | }
195 |
196 | #qunit-tests > li:last-child {
197 | border-radius: 0 0 15px 15px;
198 | -moz-border-radius: 0 0 15px 15px;
199 | -webkit-border-bottom-right-radius: 15px;
200 | -webkit-border-bottom-left-radius: 15px;
201 | }
202 |
203 | #qunit-tests .fail { color: #000000; background-color: #EE5757; }
204 | #qunit-tests .fail .test-name,
205 | #qunit-tests .fail .module-name { color: #000000; }
206 |
207 | #qunit-tests .fail .test-actual { color: #EE5757; }
208 | #qunit-tests .fail .test-expected { color: green; }
209 |
210 | #qunit-banner.qunit-fail { background-color: #EE5757; }
211 |
212 |
213 | /** Result */
214 |
215 | #qunit-testresult {
216 | padding: 0.5em 0.5em 0.5em 2.5em;
217 |
218 | color: #2b81af;
219 | background-color: #D2E0E6;
220 |
221 | border-bottom: 1px solid white;
222 | }
223 |
224 | /** Fixture */
225 |
226 | #qunit-fixture {
227 | position: absolute;
228 | top: -10000px;
229 | left: -10000px;
230 | width: 1000px;
231 | height: 1000px;
232 | }
233 |
--------------------------------------------------------------------------------
/tests/qunit/qunit.js:
--------------------------------------------------------------------------------
1 | /**
2 | * QUnit v1.4.0 - A JavaScript Unit Testing Framework
3 | *
4 | * http://docs.jquery.com/QUnit
5 | *
6 | * Copyright (c) 2012 John Resig, Jörn Zaefferer
7 | * Dual licensed under the MIT (MIT-LICENSE.txt)
8 | * or GPL (GPL-LICENSE.txt) licenses.
9 | */
10 |
11 | (function(window) {
12 |
13 | var defined = {
14 | setTimeout: typeof window.setTimeout !== "undefined",
15 | sessionStorage: (function() {
16 | var x = "qunit-test-string";
17 | try {
18 | sessionStorage.setItem(x, x);
19 | sessionStorage.removeItem(x);
20 | return true;
21 | } catch(e) {
22 | return false;
23 | }
24 | }())
25 | };
26 |
27 | var testId = 0,
28 | toString = Object.prototype.toString,
29 | hasOwn = Object.prototype.hasOwnProperty;
30 |
31 | var Test = function(name, testName, expected, async, callback) {
32 | this.name = name;
33 | this.testName = testName;
34 | this.expected = expected;
35 | this.async = async;
36 | this.callback = callback;
37 | this.assertions = [];
38 | };
39 | Test.prototype = {
40 | init: function() {
41 | var tests = id("qunit-tests");
42 | if (tests) {
43 | var b = document.createElement("strong");
44 | b.innerHTML = "Running " + this.name;
45 | var li = document.createElement("li");
46 | li.appendChild( b );
47 | li.className = "running";
48 | li.id = this.id = "test-output" + testId++;
49 | tests.appendChild( li );
50 | }
51 | },
52 | setup: function() {
53 | if (this.module != config.previousModule) {
54 | if ( config.previousModule ) {
55 | runLoggingCallbacks('moduleDone', QUnit, {
56 | name: config.previousModule,
57 | failed: config.moduleStats.bad,
58 | passed: config.moduleStats.all - config.moduleStats.bad,
59 | total: config.moduleStats.all
60 | } );
61 | }
62 | config.previousModule = this.module;
63 | config.moduleStats = { all: 0, bad: 0 };
64 | runLoggingCallbacks( 'moduleStart', QUnit, {
65 | name: this.module
66 | } );
67 | } else if (config.autorun) {
68 | runLoggingCallbacks( 'moduleStart', QUnit, {
69 | name: this.module
70 | } );
71 | }
72 |
73 | config.current = this;
74 | this.testEnvironment = extend({
75 | setup: function() {},
76 | teardown: function() {}
77 | }, this.moduleTestEnvironment);
78 |
79 | runLoggingCallbacks( 'testStart', QUnit, {
80 | name: this.testName,
81 | module: this.module
82 | });
83 |
84 | // allow utility functions to access the current test environment
85 | // TODO why??
86 | QUnit.current_testEnvironment = this.testEnvironment;
87 |
88 | if ( !config.pollution ) {
89 | saveGlobal();
90 | }
91 | if ( config.notrycatch ) {
92 | this.testEnvironment.setup.call(this.testEnvironment);
93 | return;
94 | }
95 | try {
96 | this.testEnvironment.setup.call(this.testEnvironment);
97 | } catch(e) {
98 | QUnit.pushFailure( "Setup failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) );
99 | }
100 | },
101 | run: function() {
102 | config.current = this;
103 | if ( this.async ) {
104 | QUnit.stop();
105 | }
106 |
107 | if ( config.notrycatch ) {
108 | this.callback.call(this.testEnvironment);
109 | return;
110 | }
111 | try {
112 | this.callback.call(this.testEnvironment);
113 | } catch(e) {
114 | QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + ": " + e.message, extractStacktrace( e, 1 ) );
115 | // else next test will carry the responsibility
116 | saveGlobal();
117 |
118 | // Restart the tests if they're blocking
119 | if ( config.blocking ) {
120 | QUnit.start();
121 | }
122 | }
123 | },
124 | teardown: function() {
125 | config.current = this;
126 | if ( config.notrycatch ) {
127 | this.testEnvironment.teardown.call(this.testEnvironment);
128 | return;
129 | } else {
130 | try {
131 | this.testEnvironment.teardown.call(this.testEnvironment);
132 | } catch(e) {
133 | QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) );
134 | }
135 | }
136 | checkPollution();
137 | },
138 | finish: function() {
139 | config.current = this;
140 | if ( this.expected != null && this.expected != this.assertions.length ) {
141 | QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run" );
142 | } else if ( this.expected == null && !this.assertions.length ) {
143 | QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions." );
144 | }
145 |
146 | var good = 0, bad = 0,
147 | li, i,
148 | tests = id("qunit-tests");
149 |
150 | config.stats.all += this.assertions.length;
151 | config.moduleStats.all += this.assertions.length;
152 |
153 | if ( tests ) {
154 | var ol = document.createElement("ol");
155 |
156 | for ( i = 0; i < this.assertions.length; i++ ) {
157 | var assertion = this.assertions[i];
158 |
159 | li = document.createElement("li");
160 | li.className = assertion.result ? "pass" : "fail";
161 | li.innerHTML = assertion.message || (assertion.result ? "okay" : "failed");
162 | ol.appendChild( li );
163 |
164 | if ( assertion.result ) {
165 | good++;
166 | } else {
167 | bad++;
168 | config.stats.bad++;
169 | config.moduleStats.bad++;
170 | }
171 | }
172 |
173 | // store result when possible
174 | if ( QUnit.config.reorder && defined.sessionStorage ) {
175 | if (bad) {
176 | sessionStorage.setItem("qunit-test-" + this.module + "-" + this.testName, bad);
177 | } else {
178 | sessionStorage.removeItem("qunit-test-" + this.module + "-" + this.testName);
179 | }
180 | }
181 |
182 | if (bad === 0) {
183 | ol.style.display = "none";
184 | }
185 |
186 | var b = document.createElement("strong");
187 | b.innerHTML = this.name + " (" + bad + ", " + good + ", " + this.assertions.length + ")";
188 |
189 | var a = document.createElement("a");
190 | a.innerHTML = "Rerun";
191 | a.href = QUnit.url({ filter: getText([b]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
192 |
193 | addEvent(b, "click", function() {
194 | var next = b.nextSibling.nextSibling,
195 | display = next.style.display;
196 | next.style.display = display === "none" ? "block" : "none";
197 | });
198 |
199 | addEvent(b, "dblclick", function(e) {
200 | var target = e && e.target ? e.target : window.event.srcElement;
201 | if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) {
202 | target = target.parentNode;
203 | }
204 | if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
205 | window.location = QUnit.url({ filter: getText([target]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
206 | }
207 | });
208 |
209 | li = id(this.id);
210 | li.className = bad ? "fail" : "pass";
211 | li.removeChild( li.firstChild );
212 | li.appendChild( b );
213 | li.appendChild( a );
214 | li.appendChild( ol );
215 |
216 | } else {
217 | for ( i = 0; i < this.assertions.length; i++ ) {
218 | if ( !this.assertions[i].result ) {
219 | bad++;
220 | config.stats.bad++;
221 | config.moduleStats.bad++;
222 | }
223 | }
224 | }
225 |
226 | QUnit.reset();
227 |
228 | runLoggingCallbacks( 'testDone', QUnit, {
229 | name: this.testName,
230 | module: this.module,
231 | failed: bad,
232 | passed: this.assertions.length - bad,
233 | total: this.assertions.length
234 | } );
235 | },
236 |
237 | queue: function() {
238 | var test = this;
239 | synchronize(function() {
240 | test.init();
241 | });
242 | function run() {
243 | // each of these can by async
244 | synchronize(function() {
245 | test.setup();
246 | });
247 | synchronize(function() {
248 | test.run();
249 | });
250 | synchronize(function() {
251 | test.teardown();
252 | });
253 | synchronize(function() {
254 | test.finish();
255 | });
256 | }
257 | // defer when previous test run passed, if storage is available
258 | var bad = QUnit.config.reorder && defined.sessionStorage && +sessionStorage.getItem("qunit-test-" + this.module + "-" + this.testName);
259 | if (bad) {
260 | run();
261 | } else {
262 | synchronize(run, true);
263 | }
264 | }
265 |
266 | };
267 |
268 | var QUnit = {
269 |
270 | // call on start of module test to prepend name to all tests
271 | module: function(name, testEnvironment) {
272 | config.currentModule = name;
273 | config.currentModuleTestEnviroment = testEnvironment;
274 | },
275 |
276 | asyncTest: function(testName, expected, callback) {
277 | if ( arguments.length === 2 ) {
278 | callback = expected;
279 | expected = null;
280 | }
281 |
282 | QUnit.test(testName, expected, callback, true);
283 | },
284 |
285 | test: function(testName, expected, callback, async) {
286 | var name = '' + escapeInnerText(testName) + '';
287 |
288 | if ( arguments.length === 2 ) {
289 | callback = expected;
290 | expected = null;
291 | }
292 |
293 | if ( config.currentModule ) {
294 | name = '' + config.currentModule + ": " + name;
295 | }
296 |
297 | if ( !validTest(config.currentModule + ": " + testName) ) {
298 | return;
299 | }
300 |
301 | var test = new Test(name, testName, expected, async, callback);
302 | test.module = config.currentModule;
303 | test.moduleTestEnvironment = config.currentModuleTestEnviroment;
304 | test.queue();
305 | },
306 |
307 | // Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
308 | expect: function(asserts) {
309 | config.current.expected = asserts;
310 | },
311 |
312 | // Asserts true.
313 | // @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
314 | ok: function(result, msg) {
315 | if (!config.current) {
316 | throw new Error("ok() assertion outside test context, was " + sourceFromStacktrace(2));
317 | }
318 | result = !!result;
319 | var details = {
320 | result: result,
321 | message: msg
322 | };
323 | msg = escapeInnerText(msg || (result ? "okay" : "failed"));
324 | if ( !result ) {
325 | var source = sourceFromStacktrace(2);
326 | if (source) {
327 | details.source = source;
328 | msg += '| Source: | ' + escapeInnerText(source) + ' |
|---|
';
329 | }
330 | }
331 | runLoggingCallbacks( 'log', QUnit, details );
332 | config.current.assertions.push({
333 | result: result,
334 | message: msg
335 | });
336 | },
337 |
338 | // Checks that the first two arguments are equal, with an optional message. Prints out both actual and expected values.
339 | // @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." );
340 | equal: function(actual, expected, message) {
341 | QUnit.push(expected == actual, actual, expected, message);
342 | },
343 |
344 | notEqual: function(actual, expected, message) {
345 | QUnit.push(expected != actual, actual, expected, message);
346 | },
347 |
348 | deepEqual: function(actual, expected, message) {
349 | QUnit.push(QUnit.equiv(actual, expected), actual, expected, message);
350 | },
351 |
352 | notDeepEqual: function(actual, expected, message) {
353 | QUnit.push(!QUnit.equiv(actual, expected), actual, expected, message);
354 | },
355 |
356 | strictEqual: function(actual, expected, message) {
357 | QUnit.push(expected === actual, actual, expected, message);
358 | },
359 |
360 | notStrictEqual: function(actual, expected, message) {
361 | QUnit.push(expected !== actual, actual, expected, message);
362 | },
363 |
364 | raises: function(block, expected, message) {
365 | var actual, ok = false;
366 |
367 | if (typeof expected === 'string') {
368 | message = expected;
369 | expected = null;
370 | }
371 |
372 | try {
373 | block();
374 | } catch (e) {
375 | actual = e;
376 | }
377 |
378 | if (actual) {
379 | // we don't want to validate thrown error
380 | if (!expected) {
381 | ok = true;
382 | // expected is a regexp
383 | } else if (QUnit.objectType(expected) === "regexp") {
384 | ok = expected.test(actual);
385 | // expected is a constructor
386 | } else if (actual instanceof expected) {
387 | ok = true;
388 | // expected is a validation function which returns true is validation passed
389 | } else if (expected.call({}, actual) === true) {
390 | ok = true;
391 | }
392 | }
393 |
394 | QUnit.ok(ok, message);
395 | },
396 |
397 | start: function(count) {
398 | config.semaphore -= count || 1;
399 | if (config.semaphore > 0) {
400 | // don't start until equal number of stop-calls
401 | return;
402 | }
403 | if (config.semaphore < 0) {
404 | // ignore if start is called more often then stop
405 | config.semaphore = 0;
406 | }
407 | // A slight delay, to avoid any current callbacks
408 | if ( defined.setTimeout ) {
409 | window.setTimeout(function() {
410 | if (config.semaphore > 0) {
411 | return;
412 | }
413 | if ( config.timeout ) {
414 | clearTimeout(config.timeout);
415 | }
416 |
417 | config.blocking = false;
418 | process(true);
419 | }, 13);
420 | } else {
421 | config.blocking = false;
422 | process(true);
423 | }
424 | },
425 |
426 | stop: function(count) {
427 | config.semaphore += count || 1;
428 | config.blocking = true;
429 |
430 | if ( config.testTimeout && defined.setTimeout ) {
431 | clearTimeout(config.timeout);
432 | config.timeout = window.setTimeout(function() {
433 | QUnit.ok( false, "Test timed out" );
434 | config.semaphore = 1;
435 | QUnit.start();
436 | }, config.testTimeout);
437 | }
438 | }
439 | };
440 |
441 | //We want access to the constructor's prototype
442 | (function() {
443 | function F(){}
444 | F.prototype = QUnit;
445 | QUnit = new F();
446 | //Make F QUnit's constructor so that we can add to the prototype later
447 | QUnit.constructor = F;
448 | }());
449 |
450 | // deprecated; still export them to window to provide clear error messages
451 | // next step: remove entirely
452 | QUnit.equals = function() {
453 | QUnit.push(false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead");
454 | };
455 | QUnit.same = function() {
456 | QUnit.push(false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead");
457 | };
458 |
459 | // Maintain internal state
460 | var config = {
461 | // The queue of tests to run
462 | queue: [],
463 |
464 | // block until document ready
465 | blocking: true,
466 |
467 | // when enabled, show only failing tests
468 | // gets persisted through sessionStorage and can be changed in UI via checkbox
469 | hidepassed: false,
470 |
471 | // by default, run previously failed tests first
472 | // very useful in combination with "Hide passed tests" checked
473 | reorder: true,
474 |
475 | // by default, modify document.title when suite is done
476 | altertitle: true,
477 |
478 | urlConfig: ['noglobals', 'notrycatch'],
479 |
480 | //logging callback queues
481 | begin: [],
482 | done: [],
483 | log: [],
484 | testStart: [],
485 | testDone: [],
486 | moduleStart: [],
487 | moduleDone: []
488 | };
489 |
490 | // Load paramaters
491 | (function() {
492 | var location = window.location || { search: "", protocol: "file:" },
493 | params = location.search.slice( 1 ).split( "&" ),
494 | length = params.length,
495 | urlParams = {},
496 | current;
497 |
498 | if ( params[ 0 ] ) {
499 | for ( var i = 0; i < length; i++ ) {
500 | current = params[ i ].split( "=" );
501 | current[ 0 ] = decodeURIComponent( current[ 0 ] );
502 | // allow just a key to turn on a flag, e.g., test.html?noglobals
503 | current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
504 | urlParams[ current[ 0 ] ] = current[ 1 ];
505 | }
506 | }
507 |
508 | QUnit.urlParams = urlParams;
509 | config.filter = urlParams.filter;
510 |
511 | // Figure out if we're running the tests from a server or not
512 | QUnit.isLocal = location.protocol === 'file:';
513 | }());
514 |
515 | // Expose the API as global variables, unless an 'exports'
516 | // object exists, in that case we assume we're in CommonJS - export everything at the end
517 | if ( typeof exports === "undefined" || typeof require === "undefined" ) {
518 | extend(window, QUnit);
519 | window.QUnit = QUnit;
520 | }
521 |
522 | // define these after exposing globals to keep them in these QUnit namespace only
523 | extend(QUnit, {
524 | config: config,
525 |
526 | // Initialize the configuration options
527 | init: function() {
528 | extend(config, {
529 | stats: { all: 0, bad: 0 },
530 | moduleStats: { all: 0, bad: 0 },
531 | started: +new Date(),
532 | updateRate: 1000,
533 | blocking: false,
534 | autostart: true,
535 | autorun: false,
536 | filter: "",
537 | queue: [],
538 | semaphore: 0
539 | });
540 |
541 | var qunit = id( "qunit" );
542 | if ( qunit ) {
543 | qunit.innerHTML =
544 | '' +
545 | '' +
546 | '' +
547 | '' +
548 | '
';
549 | }
550 |
551 | var tests = id( "qunit-tests" ),
552 | banner = id( "qunit-banner" ),
553 | result = id( "qunit-testresult" );
554 |
555 | if ( tests ) {
556 | tests.innerHTML = "";
557 | }
558 |
559 | if ( banner ) {
560 | banner.className = "";
561 | }
562 |
563 | if ( result ) {
564 | result.parentNode.removeChild( result );
565 | }
566 |
567 | if ( tests ) {
568 | result = document.createElement( "p" );
569 | result.id = "qunit-testresult";
570 | result.className = "result";
571 | tests.parentNode.insertBefore( result, tests );
572 | result.innerHTML = 'Running...
';
573 | }
574 | },
575 |
576 | // Resets the test setup. Useful for tests that modify the DOM.
577 | // If jQuery is available, uses jQuery's html(), otherwise just innerHTML.
578 | reset: function() {
579 | if ( window.jQuery ) {
580 | jQuery( "#qunit-fixture" ).html( config.fixture );
581 | } else {
582 | var main = id( 'qunit-fixture' );
583 | if ( main ) {
584 | main.innerHTML = config.fixture;
585 | }
586 | }
587 | },
588 |
589 | // Trigger an event on an element.
590 | // @example triggerEvent( document.body, "click" );
591 | triggerEvent: function( elem, type, event ) {
592 | if ( document.createEvent ) {
593 | event = document.createEvent("MouseEvents");
594 | event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
595 | 0, 0, 0, 0, 0, false, false, false, false, 0, null);
596 | elem.dispatchEvent( event );
597 |
598 | } else if ( elem.fireEvent ) {
599 | elem.fireEvent("on"+type);
600 | }
601 | },
602 |
603 | // Safe object type checking
604 | is: function( type, obj ) {
605 | return QUnit.objectType( obj ) == type;
606 | },
607 |
608 | objectType: function( obj ) {
609 | if (typeof obj === "undefined") {
610 | return "undefined";
611 |
612 | // consider: typeof null === object
613 | }
614 | if (obj === null) {
615 | return "null";
616 | }
617 |
618 | var type = toString.call( obj ).match(/^\[object\s(.*)\]$/)[1] || '';
619 |
620 | switch (type) {
621 | case 'Number':
622 | if (isNaN(obj)) {
623 | return "nan";
624 | }
625 | return "number";
626 | case 'String':
627 | case 'Boolean':
628 | case 'Array':
629 | case 'Date':
630 | case 'RegExp':
631 | case 'Function':
632 | return type.toLowerCase();
633 | }
634 | if (typeof obj === "object") {
635 | return "object";
636 | }
637 | return undefined;
638 | },
639 |
640 | push: function(result, actual, expected, message) {
641 | if (!config.current) {
642 | throw new Error("assertion outside test context, was " + sourceFromStacktrace());
643 | }
644 | var details = {
645 | result: result,
646 | message: message,
647 | actual: actual,
648 | expected: expected
649 | };
650 |
651 | message = escapeInnerText(message) || (result ? "okay" : "failed");
652 | message = '' + message + "";
653 | var output = message;
654 | if (!result) {
655 | expected = escapeInnerText(QUnit.jsDump.parse(expected));
656 | actual = escapeInnerText(QUnit.jsDump.parse(actual));
657 | output += '| Expected: | ' + expected + ' |
';
658 | if (actual != expected) {
659 | output += '| Result: | ' + actual + ' |
';
660 | output += '| Diff: | ' + QUnit.diff(expected, actual) +' |
';
661 | }
662 | var source = sourceFromStacktrace();
663 | if (source) {
664 | details.source = source;
665 | output += '| Source: | ' + escapeInnerText(source) + ' |
';
666 | }
667 | output += "
";
668 | }
669 |
670 | runLoggingCallbacks( 'log', QUnit, details );
671 |
672 | config.current.assertions.push({
673 | result: !!result,
674 | message: output
675 | });
676 | },
677 |
678 | pushFailure: function(message, source) {
679 | var details = {
680 | result: false,
681 | message: message
682 | };
683 | var output = escapeInnerText(message);
684 | if (source) {
685 | details.source = source;
686 | output += '| Source: | ' + escapeInnerText(source) + ' |
|---|
';
687 | }
688 | runLoggingCallbacks( 'log', QUnit, details );
689 | config.current.assertions.push({
690 | result: false,
691 | message: output
692 | });
693 | },
694 |
695 | url: function( params ) {
696 | params = extend( extend( {}, QUnit.urlParams ), params );
697 | var querystring = "?",
698 | key;
699 | for ( key in params ) {
700 | if ( !hasOwn.call( params, key ) ) {
701 | continue;
702 | }
703 | querystring += encodeURIComponent( key ) + "=" +
704 | encodeURIComponent( params[ key ] ) + "&";
705 | }
706 | return window.location.pathname + querystring.slice( 0, -1 );
707 | },
708 |
709 | extend: extend,
710 | id: id,
711 | addEvent: addEvent
712 | });
713 |
714 | //QUnit.constructor is set to the empty F() above so that we can add to it's prototype later
715 | //Doing this allows us to tell if the following methods have been overwritten on the actual
716 | //QUnit object, which is a deprecated way of using the callbacks.
717 | extend(QUnit.constructor.prototype, {
718 | // Logging callbacks; all receive a single argument with the listed properties
719 | // run test/logs.html for any related changes
720 | begin: registerLoggingCallback('begin'),
721 | // done: { failed, passed, total, runtime }
722 | done: registerLoggingCallback('done'),
723 | // log: { result, actual, expected, message }
724 | log: registerLoggingCallback('log'),
725 | // testStart: { name }
726 | testStart: registerLoggingCallback('testStart'),
727 | // testDone: { name, failed, passed, total }
728 | testDone: registerLoggingCallback('testDone'),
729 | // moduleStart: { name }
730 | moduleStart: registerLoggingCallback('moduleStart'),
731 | // moduleDone: { name, failed, passed, total }
732 | moduleDone: registerLoggingCallback('moduleDone')
733 | });
734 |
735 | if ( typeof document === "undefined" || document.readyState === "complete" ) {
736 | config.autorun = true;
737 | }
738 |
739 | QUnit.load = function() {
740 | runLoggingCallbacks( 'begin', QUnit, {} );
741 |
742 | // Initialize the config, saving the execution queue
743 | var oldconfig = extend({}, config);
744 | QUnit.init();
745 | extend(config, oldconfig);
746 |
747 | config.blocking = false;
748 |
749 | var urlConfigHtml = '', len = config.urlConfig.length;
750 | for ( var i = 0, val; i < len; i++ ) {
751 | val = config.urlConfig[i];
752 | config[val] = QUnit.urlParams[val];
753 | urlConfigHtml += '';
754 | }
755 |
756 | var userAgent = id("qunit-userAgent");
757 | if ( userAgent ) {
758 | userAgent.innerHTML = navigator.userAgent;
759 | }
760 | var banner = id("qunit-header");
761 | if ( banner ) {
762 | banner.innerHTML = ' ' + banner.innerHTML + ' ' + urlConfigHtml;
763 | addEvent( banner, "change", function( event ) {
764 | var params = {};
765 | params[ event.target.name ] = event.target.checked ? true : undefined;
766 | window.location = QUnit.url( params );
767 | });
768 | }
769 |
770 | var toolbar = id("qunit-testrunner-toolbar");
771 | if ( toolbar ) {
772 | var filter = document.createElement("input");
773 | filter.type = "checkbox";
774 | filter.id = "qunit-filter-pass";
775 | addEvent( filter, "click", function() {
776 | var ol = document.getElementById("qunit-tests");
777 | if ( filter.checked ) {
778 | ol.className = ol.className + " hidepass";
779 | } else {
780 | var tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
781 | ol.className = tmp.replace(/ hidepass /, " ");
782 | }
783 | if ( defined.sessionStorage ) {
784 | if (filter.checked) {
785 | sessionStorage.setItem("qunit-filter-passed-tests", "true");
786 | } else {
787 | sessionStorage.removeItem("qunit-filter-passed-tests");
788 | }
789 | }
790 | });
791 | if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem("qunit-filter-passed-tests") ) {
792 | filter.checked = true;
793 | var ol = document.getElementById("qunit-tests");
794 | ol.className = ol.className + " hidepass";
795 | }
796 | toolbar.appendChild( filter );
797 |
798 | var label = document.createElement("label");
799 | label.setAttribute("for", "qunit-filter-pass");
800 | label.innerHTML = "Hide passed tests";
801 | toolbar.appendChild( label );
802 | }
803 |
804 | var main = id('qunit-fixture');
805 | if ( main ) {
806 | config.fixture = main.innerHTML;
807 | }
808 |
809 | if (config.autostart) {
810 | QUnit.start();
811 | }
812 | };
813 |
814 | addEvent(window, "load", QUnit.load);
815 |
816 | // addEvent(window, "error") gives us a useless event object
817 | window.onerror = function( message, file, line ) {
818 | if ( QUnit.config.current ) {
819 | QUnit.pushFailure( message, file + ":" + line );
820 | } else {
821 | QUnit.test( "global failure", function() {
822 | QUnit.pushFailure( message, file + ":" + line );
823 | });
824 | }
825 | };
826 |
827 | function done() {
828 | config.autorun = true;
829 |
830 | // Log the last module results
831 | if ( config.currentModule ) {
832 | runLoggingCallbacks( 'moduleDone', QUnit, {
833 | name: config.currentModule,
834 | failed: config.moduleStats.bad,
835 | passed: config.moduleStats.all - config.moduleStats.bad,
836 | total: config.moduleStats.all
837 | } );
838 | }
839 |
840 | var banner = id("qunit-banner"),
841 | tests = id("qunit-tests"),
842 | runtime = +new Date() - config.started,
843 | passed = config.stats.all - config.stats.bad,
844 | html = [
845 | 'Tests completed in ',
846 | runtime,
847 | ' milliseconds.
',
848 | '',
849 | passed,
850 | ' tests of ',
851 | config.stats.all,
852 | ' passed, ',
853 | config.stats.bad,
854 | ' failed.'
855 | ].join('');
856 |
857 | if ( banner ) {
858 | banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass");
859 | }
860 |
861 | if ( tests ) {
862 | id( "qunit-testresult" ).innerHTML = html;
863 | }
864 |
865 | if ( config.altertitle && typeof document !== "undefined" && document.title ) {
866 | // show ✖ for good, ✔ for bad suite result in title
867 | // use escape sequences in case file gets loaded with non-utf-8-charset
868 | document.title = [
869 | (config.stats.bad ? "\u2716" : "\u2714"),
870 | document.title.replace(/^[\u2714\u2716] /i, "")
871 | ].join(" ");
872 | }
873 |
874 | // clear own sessionStorage items if all tests passed
875 | if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
876 | for (var key in sessionStorage) {
877 | if (sessionStorage.hasOwnProperty(key) && key.indexOf("qunit-test-") === 0 ) {
878 | sessionStorage.removeItem(key);
879 | }
880 | }
881 | }
882 |
883 | runLoggingCallbacks( 'done', QUnit, {
884 | failed: config.stats.bad,
885 | passed: passed,
886 | total: config.stats.all,
887 | runtime: runtime
888 | } );
889 | }
890 |
891 | function validTest( name ) {
892 | var filter = config.filter,
893 | run = false;
894 |
895 | if ( !filter ) {
896 | return true;
897 | }
898 |
899 | var not = filter.charAt( 0 ) === "!";
900 | if ( not ) {
901 | filter = filter.slice( 1 );
902 | }
903 |
904 | if ( name.indexOf( filter ) !== -1 ) {
905 | return !not;
906 | }
907 |
908 | if ( not ) {
909 | run = true;
910 | }
911 |
912 | return run;
913 | }
914 |
915 | // so far supports only Firefox, Chrome and Opera (buggy)
916 | // could be extended in the future to use something like https://github.com/csnover/TraceKit
917 | function extractStacktrace( e, offset ) {
918 | offset = offset || 3;
919 | if (e.stacktrace) {
920 | // Opera
921 | return e.stacktrace.split("\n")[offset + 3];
922 | } else if (e.stack) {
923 | // Firefox, Chrome
924 | var stack = e.stack.split("\n");
925 | if (/^error$/i.test(stack[0])) {
926 | stack.shift();
927 | }
928 | return stack[offset];
929 | } else if (e.sourceURL) {
930 | // Safari, PhantomJS
931 | // hopefully one day Safari provides actual stacktraces
932 | // exclude useless self-reference for generated Error objects
933 | if ( /qunit.js$/.test( e.sourceURL ) ) {
934 | return;
935 | }
936 | // for actual exceptions, this is useful
937 | return e.sourceURL + ":" + e.line;
938 | }
939 | }
940 | function sourceFromStacktrace(offset) {
941 | try {
942 | throw new Error();
943 | } catch ( e ) {
944 | return extractStacktrace( e, offset );
945 | }
946 | }
947 |
948 | function escapeInnerText(s) {
949 | if (!s) {
950 | return "";
951 | }
952 | s = s + "";
953 | return s.replace(/[\&<>]/g, function(s) {
954 | switch(s) {
955 | case "&": return "&";
956 | case "<": return "<";
957 | case ">": return ">";
958 | default: return s;
959 | }
960 | });
961 | }
962 |
963 | function synchronize( callback, last ) {
964 | config.queue.push( callback );
965 |
966 | if ( config.autorun && !config.blocking ) {
967 | process(last);
968 | }
969 | }
970 |
971 | function process( last ) {
972 | function next() {
973 | process( last );
974 | }
975 | var start = new Date().getTime();
976 | config.depth = config.depth ? config.depth + 1 : 1;
977 |
978 | while ( config.queue.length && !config.blocking ) {
979 | if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
980 | config.queue.shift()();
981 | } else {
982 | window.setTimeout( next, 13 );
983 | break;
984 | }
985 | }
986 | config.depth--;
987 | if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
988 | done();
989 | }
990 | }
991 |
992 | function saveGlobal() {
993 | config.pollution = [];
994 |
995 | if ( config.noglobals ) {
996 | for ( var key in window ) {
997 | if ( !hasOwn.call( window, key ) ) {
998 | continue;
999 | }
1000 | config.pollution.push( key );
1001 | }
1002 | }
1003 | }
1004 |
1005 | function checkPollution( name ) {
1006 | var old = config.pollution;
1007 | saveGlobal();
1008 |
1009 | var newGlobals = diff( config.pollution, old );
1010 | if ( newGlobals.length > 0 ) {
1011 | QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );
1012 | }
1013 |
1014 | var deletedGlobals = diff( old, config.pollution );
1015 | if ( deletedGlobals.length > 0 ) {
1016 | QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );
1017 | }
1018 | }
1019 |
1020 | // returns a new Array with the elements that are in a but not in b
1021 | function diff( a, b ) {
1022 | var result = a.slice();
1023 | for ( var i = 0; i < result.length; i++ ) {
1024 | for ( var j = 0; j < b.length; j++ ) {
1025 | if ( result[i] === b[j] ) {
1026 | result.splice(i, 1);
1027 | i--;
1028 | break;
1029 | }
1030 | }
1031 | }
1032 | return result;
1033 | }
1034 |
1035 | function extend(a, b) {
1036 | for ( var prop in b ) {
1037 | if ( b[prop] === undefined ) {
1038 | delete a[prop];
1039 |
1040 | // Avoid "Member not found" error in IE8 caused by setting window.constructor
1041 | } else if ( prop !== "constructor" || a !== window ) {
1042 | a[prop] = b[prop];
1043 | }
1044 | }
1045 |
1046 | return a;
1047 | }
1048 |
1049 | function addEvent(elem, type, fn) {
1050 | if ( elem.addEventListener ) {
1051 | elem.addEventListener( type, fn, false );
1052 | } else if ( elem.attachEvent ) {
1053 | elem.attachEvent( "on" + type, fn );
1054 | } else {
1055 | fn();
1056 | }
1057 | }
1058 |
1059 | function id(name) {
1060 | return !!(typeof document !== "undefined" && document && document.getElementById) &&
1061 | document.getElementById( name );
1062 | }
1063 |
1064 | function registerLoggingCallback(key){
1065 | return function(callback){
1066 | config[key].push( callback );
1067 | };
1068 | }
1069 |
1070 | // Supports deprecated method of completely overwriting logging callbacks
1071 | function runLoggingCallbacks(key, scope, args) {
1072 | //debugger;
1073 | var callbacks;
1074 | if ( QUnit.hasOwnProperty(key) ) {
1075 | QUnit[key].call(scope, args);
1076 | } else {
1077 | callbacks = config[key];
1078 | for( var i = 0; i < callbacks.length; i++ ) {
1079 | callbacks[i].call( scope, args );
1080 | }
1081 | }
1082 | }
1083 |
1084 | // Test for equality any JavaScript type.
1085 | // Author: Philippe Rathé
1086 | QUnit.equiv = (function() {
1087 |
1088 | var innerEquiv; // the real equiv function
1089 | var callers = []; // stack to decide between skip/abort functions
1090 | var parents = []; // stack to avoiding loops from circular referencing
1091 |
1092 | // Call the o related callback with the given arguments.
1093 | function bindCallbacks(o, callbacks, args) {
1094 | var prop = QUnit.objectType(o);
1095 | if (prop) {
1096 | if (QUnit.objectType(callbacks[prop]) === "function") {
1097 | return callbacks[prop].apply(callbacks, args);
1098 | } else {
1099 | return callbacks[prop]; // or undefined
1100 | }
1101 | }
1102 | }
1103 |
1104 | var getProto = Object.getPrototypeOf || function (obj) {
1105 | return obj.__proto__;
1106 | };
1107 |
1108 | var callbacks = (function () {
1109 |
1110 | // for string, boolean, number and null
1111 | function useStrictEquality(b, a) {
1112 | if (b instanceof a.constructor || a instanceof b.constructor) {
1113 | // to catch short annotaion VS 'new' annotation of a
1114 | // declaration
1115 | // e.g. var i = 1;
1116 | // var j = new Number(1);
1117 | return a == b;
1118 | } else {
1119 | return a === b;
1120 | }
1121 | }
1122 |
1123 | return {
1124 | "string" : useStrictEquality,
1125 | "boolean" : useStrictEquality,
1126 | "number" : useStrictEquality,
1127 | "null" : useStrictEquality,
1128 | "undefined" : useStrictEquality,
1129 |
1130 | "nan" : function(b) {
1131 | return isNaN(b);
1132 | },
1133 |
1134 | "date" : function(b, a) {
1135 | return QUnit.objectType(b) === "date" && a.valueOf() === b.valueOf();
1136 | },
1137 |
1138 | "regexp" : function(b, a) {
1139 | return QUnit.objectType(b) === "regexp" &&
1140 | // the regex itself
1141 | a.source === b.source &&
1142 | // and its modifers
1143 | a.global === b.global &&
1144 | // (gmi) ...
1145 | a.ignoreCase === b.ignoreCase &&
1146 | a.multiline === b.multiline;
1147 | },
1148 |
1149 | // - skip when the property is a method of an instance (OOP)
1150 | // - abort otherwise,
1151 | // initial === would have catch identical references anyway
1152 | "function" : function() {
1153 | var caller = callers[callers.length - 1];
1154 | return caller !== Object && typeof caller !== "undefined";
1155 | },
1156 |
1157 | "array" : function(b, a) {
1158 | var i, j, loop;
1159 | var len;
1160 |
1161 | // b could be an object literal here
1162 | if (QUnit.objectType(b) !== "array") {
1163 | return false;
1164 | }
1165 |
1166 | len = a.length;
1167 | if (len !== b.length) { // safe and faster
1168 | return false;
1169 | }
1170 |
1171 | // track reference to avoid circular references
1172 | parents.push(a);
1173 | for (i = 0; i < len; i++) {
1174 | loop = false;
1175 | for (j = 0; j < parents.length; j++) {
1176 | if (parents[j] === a[i]) {
1177 | loop = true;// dont rewalk array
1178 | }
1179 | }
1180 | if (!loop && !innerEquiv(a[i], b[i])) {
1181 | parents.pop();
1182 | return false;
1183 | }
1184 | }
1185 | parents.pop();
1186 | return true;
1187 | },
1188 |
1189 | "object" : function(b, a) {
1190 | var i, j, loop;
1191 | var eq = true; // unless we can proove it
1192 | var aProperties = [], bProperties = []; // collection of
1193 | // strings
1194 |
1195 | // comparing constructors is more strict than using
1196 | // instanceof
1197 | if (a.constructor !== b.constructor) {
1198 | // Allow objects with no prototype to be equivalent to
1199 | // objects with Object as their constructor.
1200 | if (!((getProto(a) === null && getProto(b) === Object.prototype) ||
1201 | (getProto(b) === null && getProto(a) === Object.prototype)))
1202 | {
1203 | return false;
1204 | }
1205 | }
1206 |
1207 | // stack constructor before traversing properties
1208 | callers.push(a.constructor);
1209 | // track reference to avoid circular references
1210 | parents.push(a);
1211 |
1212 | for (i in a) { // be strict: don't ensures hasOwnProperty
1213 | // and go deep
1214 | loop = false;
1215 | for (j = 0; j < parents.length; j++) {
1216 | if (parents[j] === a[i]) {
1217 | // don't go down the same path twice
1218 | loop = true;
1219 | }
1220 | }
1221 | aProperties.push(i); // collect a's properties
1222 |
1223 | if (!loop && !innerEquiv(a[i], b[i])) {
1224 | eq = false;
1225 | break;
1226 | }
1227 | }
1228 |
1229 | callers.pop(); // unstack, we are done
1230 | parents.pop();
1231 |
1232 | for (i in b) {
1233 | bProperties.push(i); // collect b's properties
1234 | }
1235 |
1236 | // Ensures identical properties name
1237 | return eq && innerEquiv(aProperties.sort(), bProperties.sort());
1238 | }
1239 | };
1240 | }());
1241 |
1242 | innerEquiv = function() { // can take multiple arguments
1243 | var args = Array.prototype.slice.apply(arguments);
1244 | if (args.length < 2) {
1245 | return true; // end transition
1246 | }
1247 |
1248 | return (function(a, b) {
1249 | if (a === b) {
1250 | return true; // catch the most you can
1251 | } else if (a === null || b === null || typeof a === "undefined" ||
1252 | typeof b === "undefined" ||
1253 | QUnit.objectType(a) !== QUnit.objectType(b)) {
1254 | return false; // don't lose time with error prone cases
1255 | } else {
1256 | return bindCallbacks(a, callbacks, [ b, a ]);
1257 | }
1258 |
1259 | // apply transition with (1..n) arguments
1260 | }(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length - 1)));
1261 | };
1262 |
1263 | return innerEquiv;
1264 |
1265 | }());
1266 |
1267 | /**
1268 | * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
1269 | * http://flesler.blogspot.com Licensed under BSD
1270 | * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
1271 | *
1272 | * @projectDescription Advanced and extensible data dumping for Javascript.
1273 | * @version 1.0.0
1274 | * @author Ariel Flesler
1275 | * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
1276 | */
1277 | QUnit.jsDump = (function() {
1278 | function quote( str ) {
1279 | return '"' + str.toString().replace(/"/g, '\\"') + '"';
1280 | }
1281 | function literal( o ) {
1282 | return o + '';
1283 | }
1284 | function join( pre, arr, post ) {
1285 | var s = jsDump.separator(),
1286 | base = jsDump.indent(),
1287 | inner = jsDump.indent(1);
1288 | if ( arr.join ) {
1289 | arr = arr.join( ',' + s + inner );
1290 | }
1291 | if ( !arr ) {
1292 | return pre + post;
1293 | }
1294 | return [ pre, inner + arr, base + post ].join(s);
1295 | }
1296 | function array( arr, stack ) {
1297 | var i = arr.length, ret = new Array(i);
1298 | this.up();
1299 | while ( i-- ) {
1300 | ret[i] = this.parse( arr[i] , undefined , stack);
1301 | }
1302 | this.down();
1303 | return join( '[', ret, ']' );
1304 | }
1305 |
1306 | var reName = /^function (\w+)/;
1307 |
1308 | var jsDump = {
1309 | parse: function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance
1310 | stack = stack || [ ];
1311 | var parser = this.parsers[ type || this.typeOf(obj) ];
1312 | type = typeof parser;
1313 | var inStack = inArray(obj, stack);
1314 | if (inStack != -1) {
1315 | return 'recursion('+(inStack - stack.length)+')';
1316 | }
1317 | //else
1318 | if (type == 'function') {
1319 | stack.push(obj);
1320 | var res = parser.call( this, obj, stack );
1321 | stack.pop();
1322 | return res;
1323 | }
1324 | // else
1325 | return (type == 'string') ? parser : this.parsers.error;
1326 | },
1327 | typeOf: function( obj ) {
1328 | var type;
1329 | if ( obj === null ) {
1330 | type = "null";
1331 | } else if (typeof obj === "undefined") {
1332 | type = "undefined";
1333 | } else if (QUnit.is("RegExp", obj)) {
1334 | type = "regexp";
1335 | } else if (QUnit.is("Date", obj)) {
1336 | type = "date";
1337 | } else if (QUnit.is("Function", obj)) {
1338 | type = "function";
1339 | } else if (typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined") {
1340 | type = "window";
1341 | } else if (obj.nodeType === 9) {
1342 | type = "document";
1343 | } else if (obj.nodeType) {
1344 | type = "node";
1345 | } else if (
1346 | // native arrays
1347 | toString.call( obj ) === "[object Array]" ||
1348 | // NodeList objects
1349 | ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
1350 | ) {
1351 | type = "array";
1352 | } else {
1353 | type = typeof obj;
1354 | }
1355 | return type;
1356 | },
1357 | separator: function() {
1358 | return this.multiline ? this.HTML ? '
' : '\n' : this.HTML ? ' ' : ' ';
1359 | },
1360 | indent: function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing
1361 | if ( !this.multiline ) {
1362 | return '';
1363 | }
1364 | var chr = this.indentChar;
1365 | if ( this.HTML ) {
1366 | chr = chr.replace(/\t/g,' ').replace(/ /g,' ');
1367 | }
1368 | return new Array( this._depth_ + (extra||0) ).join(chr);
1369 | },
1370 | up: function( a ) {
1371 | this._depth_ += a || 1;
1372 | },
1373 | down: function( a ) {
1374 | this._depth_ -= a || 1;
1375 | },
1376 | setParser: function( name, parser ) {
1377 | this.parsers[name] = parser;
1378 | },
1379 | // The next 3 are exposed so you can use them
1380 | quote: quote,
1381 | literal: literal,
1382 | join: join,
1383 | //
1384 | _depth_: 1,
1385 | // This is the list of parsers, to modify them, use jsDump.setParser
1386 | parsers: {
1387 | window: '[Window]',
1388 | document: '[Document]',
1389 | error: '[ERROR]', //when no parser is found, shouldn't happen
1390 | unknown: '[Unknown]',
1391 | 'null': 'null',
1392 | 'undefined': 'undefined',
1393 | 'function': function( fn ) {
1394 | var ret = 'function',
1395 | name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE
1396 | if ( name ) {
1397 | ret += ' ' + name;
1398 | }
1399 | ret += '(';
1400 |
1401 | ret = [ ret, QUnit.jsDump.parse( fn, 'functionArgs' ), '){'].join('');
1402 | return join( ret, QUnit.jsDump.parse(fn,'functionCode'), '}' );
1403 | },
1404 | array: array,
1405 | nodelist: array,
1406 | 'arguments': array,
1407 | object: function( map, stack ) {
1408 | var ret = [ ], keys, key, val, i;
1409 | QUnit.jsDump.up();
1410 | if (Object.keys) {
1411 | keys = Object.keys( map );
1412 | } else {
1413 | keys = [];
1414 | for (key in map) { keys.push( key ); }
1415 | }
1416 | keys.sort();
1417 | for (i = 0; i < keys.length; i++) {
1418 | key = keys[ i ];
1419 | val = map[ key ];
1420 | ret.push( QUnit.jsDump.parse( key, 'key' ) + ': ' + QUnit.jsDump.parse( val, undefined, stack ) );
1421 | }
1422 | QUnit.jsDump.down();
1423 | return join( '{', ret, '}' );
1424 | },
1425 | node: function( node ) {
1426 | var open = QUnit.jsDump.HTML ? '<' : '<',
1427 | close = QUnit.jsDump.HTML ? '>' : '>';
1428 |
1429 | var tag = node.nodeName.toLowerCase(),
1430 | ret = open + tag;
1431 |
1432 | for ( var a in QUnit.jsDump.DOMAttrs ) {
1433 | var val = node[QUnit.jsDump.DOMAttrs[a]];
1434 | if ( val ) {
1435 | ret += ' ' + a + '=' + QUnit.jsDump.parse( val, 'attribute' );
1436 | }
1437 | }
1438 | return ret + close + open + '/' + tag + close;
1439 | },
1440 | functionArgs: function( fn ) {//function calls it internally, it's the arguments part of the function
1441 | var l = fn.length;
1442 | if ( !l ) {
1443 | return '';
1444 | }
1445 |
1446 | var args = new Array(l);
1447 | while ( l-- ) {
1448 | args[l] = String.fromCharCode(97+l);//97 is 'a'
1449 | }
1450 | return ' ' + args.join(', ') + ' ';
1451 | },
1452 | key: quote, //object calls it internally, the key part of an item in a map
1453 | functionCode: '[code]', //function calls it internally, it's the content of the function
1454 | attribute: quote, //node calls it internally, it's an html attribute value
1455 | string: quote,
1456 | date: quote,
1457 | regexp: literal, //regex
1458 | number: literal,
1459 | 'boolean': literal
1460 | },
1461 | DOMAttrs:{//attributes to dump from nodes, name=>realName
1462 | id:'id',
1463 | name:'name',
1464 | 'class':'className'
1465 | },
1466 | HTML:false,//if true, entities are escaped ( <, >, \t, space and \n )
1467 | indentChar:' ',//indentation unit
1468 | multiline:true //if true, items in a collection, are separated by a \n, else just a space.
1469 | };
1470 |
1471 | return jsDump;
1472 | }());
1473 |
1474 | // from Sizzle.js
1475 | function getText( elems ) {
1476 | var ret = "", elem;
1477 |
1478 | for ( var i = 0; elems[i]; i++ ) {
1479 | elem = elems[i];
1480 |
1481 | // Get the text from text nodes and CDATA nodes
1482 | if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
1483 | ret += elem.nodeValue;
1484 |
1485 | // Traverse everything else, except comment nodes
1486 | } else if ( elem.nodeType !== 8 ) {
1487 | ret += getText( elem.childNodes );
1488 | }
1489 | }
1490 |
1491 | return ret;
1492 | }
1493 |
1494 | //from jquery.js
1495 | function inArray( elem, array ) {
1496 | if ( array.indexOf ) {
1497 | return array.indexOf( elem );
1498 | }
1499 |
1500 | for ( var i = 0, length = array.length; i < length; i++ ) {
1501 | if ( array[ i ] === elem ) {
1502 | return i;
1503 | }
1504 | }
1505 |
1506 | return -1;
1507 | }
1508 |
1509 | /*
1510 | * Javascript Diff Algorithm
1511 | * By John Resig (http://ejohn.org/)
1512 | * Modified by Chu Alan "sprite"
1513 | *
1514 | * Released under the MIT license.
1515 | *
1516 | * More Info:
1517 | * http://ejohn.org/projects/javascript-diff-algorithm/
1518 | *
1519 | * Usage: QUnit.diff(expected, actual)
1520 | *
1521 | * QUnit.diff("the quick brown fox jumped over", "the quick fox jumps over") == "the quick brown fox jumped jumps over"
1522 | */
1523 | QUnit.diff = (function() {
1524 | function diff(o, n) {
1525 | var ns = {};
1526 | var os = {};
1527 | var i;
1528 |
1529 | for (i = 0; i < n.length; i++) {
1530 | if (ns[n[i]] == null) {
1531 | ns[n[i]] = {
1532 | rows: [],
1533 | o: null
1534 | };
1535 | }
1536 | ns[n[i]].rows.push(i);
1537 | }
1538 |
1539 | for (i = 0; i < o.length; i++) {
1540 | if (os[o[i]] == null) {
1541 | os[o[i]] = {
1542 | rows: [],
1543 | n: null
1544 | };
1545 | }
1546 | os[o[i]].rows.push(i);
1547 | }
1548 |
1549 | for (i in ns) {
1550 | if ( !hasOwn.call( ns, i ) ) {
1551 | continue;
1552 | }
1553 | if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) {
1554 | n[ns[i].rows[0]] = {
1555 | text: n[ns[i].rows[0]],
1556 | row: os[i].rows[0]
1557 | };
1558 | o[os[i].rows[0]] = {
1559 | text: o[os[i].rows[0]],
1560 | row: ns[i].rows[0]
1561 | };
1562 | }
1563 | }
1564 |
1565 | for (i = 0; i < n.length - 1; i++) {
1566 | if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null &&
1567 | n[i + 1] == o[n[i].row + 1]) {
1568 | n[i + 1] = {
1569 | text: n[i + 1],
1570 | row: n[i].row + 1
1571 | };
1572 | o[n[i].row + 1] = {
1573 | text: o[n[i].row + 1],
1574 | row: i + 1
1575 | };
1576 | }
1577 | }
1578 |
1579 | for (i = n.length - 1; i > 0; i--) {
1580 | if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null &&
1581 | n[i - 1] == o[n[i].row - 1]) {
1582 | n[i - 1] = {
1583 | text: n[i - 1],
1584 | row: n[i].row - 1
1585 | };
1586 | o[n[i].row - 1] = {
1587 | text: o[n[i].row - 1],
1588 | row: i - 1
1589 | };
1590 | }
1591 | }
1592 |
1593 | return {
1594 | o: o,
1595 | n: n
1596 | };
1597 | }
1598 |
1599 | return function(o, n) {
1600 | o = o.replace(/\s+$/, '');
1601 | n = n.replace(/\s+$/, '');
1602 | var out = diff(o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/));
1603 |
1604 | var str = "";
1605 | var i;
1606 |
1607 | var oSpace = o.match(/\s+/g);
1608 | if (oSpace == null) {
1609 | oSpace = [" "];
1610 | }
1611 | else {
1612 | oSpace.push(" ");
1613 | }
1614 | var nSpace = n.match(/\s+/g);
1615 | if (nSpace == null) {
1616 | nSpace = [" "];
1617 | }
1618 | else {
1619 | nSpace.push(" ");
1620 | }
1621 |
1622 | if (out.n.length === 0) {
1623 | for (i = 0; i < out.o.length; i++) {
1624 | str += '' + out.o[i] + oSpace[i] + "";
1625 | }
1626 | }
1627 | else {
1628 | if (out.n[0].text == null) {
1629 | for (n = 0; n < out.o.length && out.o[n].text == null; n++) {
1630 | str += '' + out.o[n] + oSpace[n] + "";
1631 | }
1632 | }
1633 |
1634 | for (i = 0; i < out.n.length; i++) {
1635 | if (out.n[i].text == null) {
1636 | str += '' + out.n[i] + nSpace[i] + "";
1637 | }
1638 | else {
1639 | var pre = "";
1640 |
1641 | for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) {
1642 | pre += '' + out.o[n] + oSpace[n] + "";
1643 | }
1644 | str += " " + out.n[i].text + nSpace[i] + pre;
1645 | }
1646 | }
1647 | }
1648 |
1649 | return str;
1650 | };
1651 | }());
1652 |
1653 | // for CommonJS enviroments, export everything
1654 | if ( typeof exports !== "undefined" || typeof require !== "undefined" ) {
1655 | extend(exports, QUnit);
1656 | }
1657 |
1658 | // get at whatever the global object is, like window in browsers
1659 | }( (function() {return this;}.call()) ));
1660 |
--------------------------------------------------------------------------------
/app_template/css/bootstrap.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v2.0.2
3 | *
4 | * Copyright 2012 Twitter, Inc
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 | */
10 | article,
11 | aside,
12 | details,
13 | figcaption,
14 | figure,
15 | footer,
16 | header,
17 | hgroup,
18 | nav,
19 | section {
20 | display: block;
21 | }
22 | audio,
23 | canvas,
24 | video {
25 | display: inline-block;
26 | *display: inline;
27 | *zoom: 1;
28 | }
29 | audio:not([controls]) {
30 | display: none;
31 | }
32 | html {
33 | font-size: 100%;
34 | -webkit-text-size-adjust: 100%;
35 | -ms-text-size-adjust: 100%;
36 | }
37 | a:focus {
38 | outline: thin dotted #333;
39 | outline: 5px auto -webkit-focus-ring-color;
40 | outline-offset: -2px;
41 | }
42 | a:hover,
43 | a:active {
44 | outline: 0;
45 | }
46 | sub,
47 | sup {
48 | position: relative;
49 | font-size: 75%;
50 | line-height: 0;
51 | vertical-align: baseline;
52 | }
53 | sup {
54 | top: -0.5em;
55 | }
56 | sub {
57 | bottom: -0.25em;
58 | }
59 | img {
60 | height: auto;
61 | border: 0;
62 | -ms-interpolation-mode: bicubic;
63 | vertical-align: middle;
64 | }
65 | button,
66 | input,
67 | select,
68 | textarea {
69 | margin: 0;
70 | font-size: 100%;
71 | vertical-align: middle;
72 | }
73 | button,
74 | input {
75 | *overflow: visible;
76 | line-height: normal;
77 | }
78 | button::-moz-focus-inner,
79 | input::-moz-focus-inner {
80 | padding: 0;
81 | border: 0;
82 | }
83 | button,
84 | input[type="button"],
85 | input[type="reset"],
86 | input[type="submit"] {
87 | cursor: pointer;
88 | -webkit-appearance: button;
89 | }
90 | input[type="search"] {
91 | -webkit-appearance: textfield;
92 | -webkit-box-sizing: content-box;
93 | -moz-box-sizing: content-box;
94 | box-sizing: content-box;
95 | }
96 | input[type="search"]::-webkit-search-decoration,
97 | input[type="search"]::-webkit-search-cancel-button {
98 | -webkit-appearance: none;
99 | }
100 | textarea {
101 | overflow: auto;
102 | vertical-align: top;
103 | }
104 | .clearfix {
105 | *zoom: 1;
106 | }
107 | .clearfix:before,
108 | .clearfix:after {
109 | display: table;
110 | content: "";
111 | }
112 | .clearfix:after {
113 | clear: both;
114 | }
115 | .hide-text {
116 | overflow: hidden;
117 | text-indent: 100%;
118 | white-space: nowrap;
119 | }
120 | .input-block-level {
121 | display: block;
122 | width: 100%;
123 | min-height: 28px;
124 | /* Make inputs at least the height of their button counterpart */
125 |
126 | /* Makes inputs behave like true block-level elements */
127 |
128 | -webkit-box-sizing: border-box;
129 | -moz-box-sizing: border-box;
130 | -ms-box-sizing: border-box;
131 | box-sizing: border-box;
132 | }
133 | body {
134 | margin: 0;
135 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
136 | font-size: 13px;
137 | line-height: 18px;
138 | color: #333333;
139 | background-color: #ffffff;
140 | }
141 | a {
142 | color: #0088cc;
143 | text-decoration: none;
144 | }
145 | a:hover {
146 | color: #005580;
147 | text-decoration: underline;
148 | }
149 | .row {
150 | margin-left: -20px;
151 | *zoom: 1;
152 | }
153 | .row:before,
154 | .row:after {
155 | display: table;
156 | content: "";
157 | }
158 | .row:after {
159 | clear: both;
160 | }
161 | [class*="span"] {
162 | float: left;
163 | margin-left: 20px;
164 | }
165 | .container,
166 | .navbar-fixed-top .container,
167 | .navbar-fixed-bottom .container {
168 | width: 940px;
169 | }
170 | .span12 {
171 | width: 940px;
172 | }
173 | .span11 {
174 | width: 860px;
175 | }
176 | .span10 {
177 | width: 780px;
178 | }
179 | .span9 {
180 | width: 700px;
181 | }
182 | .span8 {
183 | width: 620px;
184 | }
185 | .span7 {
186 | width: 540px;
187 | }
188 | .span6 {
189 | width: 460px;
190 | }
191 | .span5 {
192 | width: 380px;
193 | }
194 | .span4 {
195 | width: 300px;
196 | }
197 | .span3 {
198 | width: 220px;
199 | }
200 | .span2 {
201 | width: 140px;
202 | }
203 | .span1 {
204 | width: 60px;
205 | }
206 | .offset12 {
207 | margin-left: 980px;
208 | }
209 | .offset11 {
210 | margin-left: 900px;
211 | }
212 | .offset10 {
213 | margin-left: 820px;
214 | }
215 | .offset9 {
216 | margin-left: 740px;
217 | }
218 | .offset8 {
219 | margin-left: 660px;
220 | }
221 | .offset7 {
222 | margin-left: 580px;
223 | }
224 | .offset6 {
225 | margin-left: 500px;
226 | }
227 | .offset5 {
228 | margin-left: 420px;
229 | }
230 | .offset4 {
231 | margin-left: 340px;
232 | }
233 | .offset3 {
234 | margin-left: 260px;
235 | }
236 | .offset2 {
237 | margin-left: 180px;
238 | }
239 | .offset1 {
240 | margin-left: 100px;
241 | }
242 | .row-fluid {
243 | width: 100%;
244 | *zoom: 1;
245 | }
246 | .row-fluid:before,
247 | .row-fluid:after {
248 | display: table;
249 | content: "";
250 | }
251 | .row-fluid:after {
252 | clear: both;
253 | }
254 | .row-fluid > [class*="span"] {
255 | float: left;
256 | margin-left: 2.127659574%;
257 | }
258 | .row-fluid > [class*="span"]:first-child {
259 | margin-left: 0;
260 | }
261 | .row-fluid > .span12 {
262 | width: 99.99999998999999%;
263 | }
264 | .row-fluid > .span11 {
265 | width: 91.489361693%;
266 | }
267 | .row-fluid > .span10 {
268 | width: 82.97872339599999%;
269 | }
270 | .row-fluid > .span9 {
271 | width: 74.468085099%;
272 | }
273 | .row-fluid > .span8 {
274 | width: 65.95744680199999%;
275 | }
276 | .row-fluid > .span7 {
277 | width: 57.446808505%;
278 | }
279 | .row-fluid > .span6 {
280 | width: 48.93617020799999%;
281 | }
282 | .row-fluid > .span5 {
283 | width: 40.425531911%;
284 | }
285 | .row-fluid > .span4 {
286 | width: 31.914893614%;
287 | }
288 | .row-fluid > .span3 {
289 | width: 23.404255317%;
290 | }
291 | .row-fluid > .span2 {
292 | width: 14.89361702%;
293 | }
294 | .row-fluid > .span1 {
295 | width: 6.382978723%;
296 | }
297 | .container {
298 | margin-left: auto;
299 | margin-right: auto;
300 | *zoom: 1;
301 | }
302 | .container:before,
303 | .container:after {
304 | display: table;
305 | content: "";
306 | }
307 | .container:after {
308 | clear: both;
309 | }
310 | .container-fluid {
311 | padding-left: 20px;
312 | padding-right: 20px;
313 | *zoom: 1;
314 | }
315 | .container-fluid:before,
316 | .container-fluid:after {
317 | display: table;
318 | content: "";
319 | }
320 | .container-fluid:after {
321 | clear: both;
322 | }
323 | p {
324 | margin: 0 0 9px;
325 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
326 | font-size: 13px;
327 | line-height: 18px;
328 | }
329 | p small {
330 | font-size: 11px;
331 | color: #999999;
332 | }
333 | .lead {
334 | margin-bottom: 18px;
335 | font-size: 20px;
336 | font-weight: 200;
337 | line-height: 27px;
338 | }
339 | h1,
340 | h2,
341 | h3,
342 | h4,
343 | h5,
344 | h6 {
345 | margin: 0;
346 | font-family: inherit;
347 | font-weight: bold;
348 | color: inherit;
349 | text-rendering: optimizelegibility;
350 | }
351 | h1 small,
352 | h2 small,
353 | h3 small,
354 | h4 small,
355 | h5 small,
356 | h6 small {
357 | font-weight: normal;
358 | color: #999999;
359 | }
360 | h1 {
361 | font-size: 30px;
362 | line-height: 36px;
363 | }
364 | h1 small {
365 | font-size: 18px;
366 | }
367 | h2 {
368 | font-size: 24px;
369 | line-height: 36px;
370 | }
371 | h2 small {
372 | font-size: 18px;
373 | }
374 | h3 {
375 | line-height: 27px;
376 | font-size: 18px;
377 | }
378 | h3 small {
379 | font-size: 14px;
380 | }
381 | h4,
382 | h5,
383 | h6 {
384 | line-height: 18px;
385 | }
386 | h4 {
387 | font-size: 14px;
388 | }
389 | h4 small {
390 | font-size: 12px;
391 | }
392 | h5 {
393 | font-size: 12px;
394 | }
395 | h6 {
396 | font-size: 11px;
397 | color: #999999;
398 | text-transform: uppercase;
399 | }
400 | .page-header {
401 | padding-bottom: 17px;
402 | margin: 18px 0;
403 | border-bottom: 1px solid #eeeeee;
404 | }
405 | .page-header h1 {
406 | line-height: 1;
407 | }
408 | ul,
409 | ol {
410 | padding: 0;
411 | margin: 0 0 9px 25px;
412 | }
413 | ul ul,
414 | ul ol,
415 | ol ol,
416 | ol ul {
417 | margin-bottom: 0;
418 | }
419 | ul {
420 | list-style: disc;
421 | }
422 | ol {
423 | list-style: decimal;
424 | }
425 | li {
426 | line-height: 18px;
427 | }
428 | ul.unstyled,
429 | ol.unstyled {
430 | margin-left: 0;
431 | list-style: none;
432 | }
433 | dl {
434 | margin-bottom: 18px;
435 | }
436 | dt,
437 | dd {
438 | line-height: 18px;
439 | }
440 | dt {
441 | font-weight: bold;
442 | line-height: 17px;
443 | }
444 | dd {
445 | margin-left: 9px;
446 | }
447 | .dl-horizontal dt {
448 | float: left;
449 | clear: left;
450 | width: 120px;
451 | text-align: right;
452 | }
453 | .dl-horizontal dd {
454 | margin-left: 130px;
455 | }
456 | hr {
457 | margin: 18px 0;
458 | border: 0;
459 | border-top: 1px solid #eeeeee;
460 | border-bottom: 1px solid #ffffff;
461 | }
462 | strong {
463 | font-weight: bold;
464 | }
465 | em {
466 | font-style: italic;
467 | }
468 | .muted {
469 | color: #999999;
470 | }
471 | abbr[title] {
472 | border-bottom: 1px dotted #ddd;
473 | cursor: help;
474 | }
475 | abbr.initialism {
476 | font-size: 90%;
477 | text-transform: uppercase;
478 | }
479 | blockquote {
480 | padding: 0 0 0 15px;
481 | margin: 0 0 18px;
482 | border-left: 5px solid #eeeeee;
483 | }
484 | blockquote p {
485 | margin-bottom: 0;
486 | font-size: 16px;
487 | font-weight: 300;
488 | line-height: 22.5px;
489 | }
490 | blockquote small {
491 | display: block;
492 | line-height: 18px;
493 | color: #999999;
494 | }
495 | blockquote small:before {
496 | content: '\2014 \00A0';
497 | }
498 | blockquote.pull-right {
499 | float: right;
500 | padding-left: 0;
501 | padding-right: 15px;
502 | border-left: 0;
503 | border-right: 5px solid #eeeeee;
504 | }
505 | blockquote.pull-right p,
506 | blockquote.pull-right small {
507 | text-align: right;
508 | }
509 | q:before,
510 | q:after,
511 | blockquote:before,
512 | blockquote:after {
513 | content: "";
514 | }
515 | address {
516 | display: block;
517 | margin-bottom: 18px;
518 | line-height: 18px;
519 | font-style: normal;
520 | }
521 | small {
522 | font-size: 100%;
523 | }
524 | cite {
525 | font-style: normal;
526 | }
527 | code,
528 | pre {
529 | padding: 0 3px 2px;
530 | font-family: Menlo, Monaco, "Courier New", monospace;
531 | font-size: 12px;
532 | color: #333333;
533 | -webkit-border-radius: 3px;
534 | -moz-border-radius: 3px;
535 | border-radius: 3px;
536 | }
537 | code {
538 | padding: 2px 4px;
539 | color: #d14;
540 | background-color: #f7f7f9;
541 | border: 1px solid #e1e1e8;
542 | }
543 | pre {
544 | display: block;
545 | padding: 8.5px;
546 | margin: 0 0 9px;
547 | font-size: 12.025px;
548 | line-height: 18px;
549 | background-color: #f5f5f5;
550 | border: 1px solid #ccc;
551 | border: 1px solid rgba(0, 0, 0, 0.15);
552 | -webkit-border-radius: 4px;
553 | -moz-border-radius: 4px;
554 | border-radius: 4px;
555 | white-space: pre;
556 | white-space: pre-wrap;
557 | word-break: break-all;
558 | word-wrap: break-word;
559 | }
560 | pre.prettyprint {
561 | margin-bottom: 18px;
562 | }
563 | pre code {
564 | padding: 0;
565 | color: inherit;
566 | background-color: transparent;
567 | border: 0;
568 | }
569 | .pre-scrollable {
570 | max-height: 340px;
571 | overflow-y: scroll;
572 | }
573 | form {
574 | margin: 0 0 18px;
575 | }
576 | fieldset {
577 | padding: 0;
578 | margin: 0;
579 | border: 0;
580 | }
581 | legend {
582 | display: block;
583 | width: 100%;
584 | padding: 0;
585 | margin-bottom: 27px;
586 | font-size: 19.5px;
587 | line-height: 36px;
588 | color: #333333;
589 | border: 0;
590 | border-bottom: 1px solid #eee;
591 | }
592 | legend small {
593 | font-size: 13.5px;
594 | color: #999999;
595 | }
596 | label,
597 | input,
598 | button,
599 | select,
600 | textarea {
601 | font-size: 13px;
602 | font-weight: normal;
603 | line-height: 18px;
604 | }
605 | input,
606 | button,
607 | select,
608 | textarea {
609 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
610 | }
611 | label {
612 | display: block;
613 | margin-bottom: 5px;
614 | color: #333333;
615 | }
616 | input,
617 | textarea,
618 | select,
619 | .uneditable-input {
620 | display: inline-block;
621 | width: 210px;
622 | height: 18px;
623 | padding: 4px;
624 | margin-bottom: 9px;
625 | font-size: 13px;
626 | line-height: 18px;
627 | color: #555555;
628 | border: 1px solid #cccccc;
629 | -webkit-border-radius: 3px;
630 | -moz-border-radius: 3px;
631 | border-radius: 3px;
632 | }
633 | .uneditable-textarea {
634 | width: auto;
635 | height: auto;
636 | }
637 | label input,
638 | label textarea,
639 | label select {
640 | display: block;
641 | }
642 | input[type="image"],
643 | input[type="checkbox"],
644 | input[type="radio"] {
645 | width: auto;
646 | height: auto;
647 | padding: 0;
648 | margin: 3px 0;
649 | *margin-top: 0;
650 | /* IE7 */
651 |
652 | line-height: normal;
653 | cursor: pointer;
654 | -webkit-border-radius: 0;
655 | -moz-border-radius: 0;
656 | border-radius: 0;
657 | border: 0 \9;
658 | /* IE9 and down */
659 |
660 | }
661 | input[type="image"] {
662 | border: 0;
663 | }
664 | input[type="file"] {
665 | width: auto;
666 | padding: initial;
667 | line-height: initial;
668 | border: initial;
669 | background-color: #ffffff;
670 | background-color: initial;
671 | -webkit-box-shadow: none;
672 | -moz-box-shadow: none;
673 | box-shadow: none;
674 | }
675 | input[type="button"],
676 | input[type="reset"],
677 | input[type="submit"] {
678 | width: auto;
679 | height: auto;
680 | }
681 | select,
682 | input[type="file"] {
683 | height: 28px;
684 | /* In IE7, the height of the select element cannot be changed by height, only font-size */
685 |
686 | *margin-top: 4px;
687 | /* For IE7, add top margin to align select with labels */
688 |
689 | line-height: 28px;
690 | }
691 | input[type="file"] {
692 | line-height: 18px \9;
693 | }
694 | select {
695 | width: 220px;
696 | background-color: #ffffff;
697 | }
698 | select[multiple],
699 | select[size] {
700 | height: auto;
701 | }
702 | input[type="image"] {
703 | -webkit-box-shadow: none;
704 | -moz-box-shadow: none;
705 | box-shadow: none;
706 | }
707 | textarea {
708 | height: auto;
709 | }
710 | input[type="hidden"] {
711 | display: none;
712 | }
713 | .radio,
714 | .checkbox {
715 | padding-left: 18px;
716 | }
717 | .radio input[type="radio"],
718 | .checkbox input[type="checkbox"] {
719 | float: left;
720 | margin-left: -18px;
721 | }
722 | .controls > .radio:first-child,
723 | .controls > .checkbox:first-child {
724 | padding-top: 5px;
725 | }
726 | .radio.inline,
727 | .checkbox.inline {
728 | display: inline-block;
729 | padding-top: 5px;
730 | margin-bottom: 0;
731 | vertical-align: middle;
732 | }
733 | .radio.inline + .radio.inline,
734 | .checkbox.inline + .checkbox.inline {
735 | margin-left: 10px;
736 | }
737 | input,
738 | textarea {
739 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
740 | -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
741 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
742 | -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
743 | -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
744 | -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
745 | -o-transition: border linear 0.2s, box-shadow linear 0.2s;
746 | transition: border linear 0.2s, box-shadow linear 0.2s;
747 | }
748 | input:focus,
749 | textarea:focus {
750 | border-color: rgba(82, 168, 236, 0.8);
751 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
752 | -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
753 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
754 | outline: 0;
755 | outline: thin dotted \9;
756 | /* IE6-9 */
757 |
758 | }
759 | input[type="file"]:focus,
760 | input[type="radio"]:focus,
761 | input[type="checkbox"]:focus,
762 | select:focus {
763 | -webkit-box-shadow: none;
764 | -moz-box-shadow: none;
765 | box-shadow: none;
766 | outline: thin dotted #333;
767 | outline: 5px auto -webkit-focus-ring-color;
768 | outline-offset: -2px;
769 | }
770 | .input-mini {
771 | width: 60px;
772 | }
773 | .input-small {
774 | width: 90px;
775 | }
776 | .input-medium {
777 | width: 150px;
778 | }
779 | .input-large {
780 | width: 210px;
781 | }
782 | .input-xlarge {
783 | width: 270px;
784 | }
785 | .input-xxlarge {
786 | width: 530px;
787 | }
788 | input[class*="span"],
789 | select[class*="span"],
790 | textarea[class*="span"],
791 | .uneditable-input {
792 | float: none;
793 | margin-left: 0;
794 | }
795 | input,
796 | textarea,
797 | .uneditable-input {
798 | margin-left: 0;
799 | }
800 | input.span12, textarea.span12, .uneditable-input.span12 {
801 | width: 930px;
802 | }
803 | input.span11, textarea.span11, .uneditable-input.span11 {
804 | width: 850px;
805 | }
806 | input.span10, textarea.span10, .uneditable-input.span10 {
807 | width: 770px;
808 | }
809 | input.span9, textarea.span9, .uneditable-input.span9 {
810 | width: 690px;
811 | }
812 | input.span8, textarea.span8, .uneditable-input.span8 {
813 | width: 610px;
814 | }
815 | input.span7, textarea.span7, .uneditable-input.span7 {
816 | width: 530px;
817 | }
818 | input.span6, textarea.span6, .uneditable-input.span6 {
819 | width: 450px;
820 | }
821 | input.span5, textarea.span5, .uneditable-input.span5 {
822 | width: 370px;
823 | }
824 | input.span4, textarea.span4, .uneditable-input.span4 {
825 | width: 290px;
826 | }
827 | input.span3, textarea.span3, .uneditable-input.span3 {
828 | width: 210px;
829 | }
830 | input.span2, textarea.span2, .uneditable-input.span2 {
831 | width: 130px;
832 | }
833 | input.span1, textarea.span1, .uneditable-input.span1 {
834 | width: 50px;
835 | }
836 | input[disabled],
837 | select[disabled],
838 | textarea[disabled],
839 | input[readonly],
840 | select[readonly],
841 | textarea[readonly] {
842 | background-color: #eeeeee;
843 | border-color: #ddd;
844 | cursor: not-allowed;
845 | }
846 | .control-group.warning > label,
847 | .control-group.warning .help-block,
848 | .control-group.warning .help-inline {
849 | color: #c09853;
850 | }
851 | .control-group.warning input,
852 | .control-group.warning select,
853 | .control-group.warning textarea {
854 | color: #c09853;
855 | border-color: #c09853;
856 | }
857 | .control-group.warning input:focus,
858 | .control-group.warning select:focus,
859 | .control-group.warning textarea:focus {
860 | border-color: #a47e3c;
861 | -webkit-box-shadow: 0 0 6px #dbc59e;
862 | -moz-box-shadow: 0 0 6px #dbc59e;
863 | box-shadow: 0 0 6px #dbc59e;
864 | }
865 | .control-group.warning .input-prepend .add-on,
866 | .control-group.warning .input-append .add-on {
867 | color: #c09853;
868 | background-color: #fcf8e3;
869 | border-color: #c09853;
870 | }
871 | .control-group.error > label,
872 | .control-group.error .help-block,
873 | .control-group.error .help-inline {
874 | color: #b94a48;
875 | }
876 | .control-group.error input,
877 | .control-group.error select,
878 | .control-group.error textarea {
879 | color: #b94a48;
880 | border-color: #b94a48;
881 | }
882 | .control-group.error input:focus,
883 | .control-group.error select:focus,
884 | .control-group.error textarea:focus {
885 | border-color: #953b39;
886 | -webkit-box-shadow: 0 0 6px #d59392;
887 | -moz-box-shadow: 0 0 6px #d59392;
888 | box-shadow: 0 0 6px #d59392;
889 | }
890 | .control-group.error .input-prepend .add-on,
891 | .control-group.error .input-append .add-on {
892 | color: #b94a48;
893 | background-color: #f2dede;
894 | border-color: #b94a48;
895 | }
896 | .control-group.success > label,
897 | .control-group.success .help-block,
898 | .control-group.success .help-inline {
899 | color: #468847;
900 | }
901 | .control-group.success input,
902 | .control-group.success select,
903 | .control-group.success textarea {
904 | color: #468847;
905 | border-color: #468847;
906 | }
907 | .control-group.success input:focus,
908 | .control-group.success select:focus,
909 | .control-group.success textarea:focus {
910 | border-color: #356635;
911 | -webkit-box-shadow: 0 0 6px #7aba7b;
912 | -moz-box-shadow: 0 0 6px #7aba7b;
913 | box-shadow: 0 0 6px #7aba7b;
914 | }
915 | .control-group.success .input-prepend .add-on,
916 | .control-group.success .input-append .add-on {
917 | color: #468847;
918 | background-color: #dff0d8;
919 | border-color: #468847;
920 | }
921 | input:focus:required:invalid,
922 | textarea:focus:required:invalid,
923 | select:focus:required:invalid {
924 | color: #b94a48;
925 | border-color: #ee5f5b;
926 | }
927 | input:focus:required:invalid:focus,
928 | textarea:focus:required:invalid:focus,
929 | select:focus:required:invalid:focus {
930 | border-color: #e9322d;
931 | -webkit-box-shadow: 0 0 6px #f8b9b7;
932 | -moz-box-shadow: 0 0 6px #f8b9b7;
933 | box-shadow: 0 0 6px #f8b9b7;
934 | }
935 | .form-actions {
936 | padding: 17px 20px 18px;
937 | margin-top: 18px;
938 | margin-bottom: 18px;
939 | background-color: #eeeeee;
940 | border-top: 1px solid #ddd;
941 | *zoom: 1;
942 | }
943 | .form-actions:before,
944 | .form-actions:after {
945 | display: table;
946 | content: "";
947 | }
948 | .form-actions:after {
949 | clear: both;
950 | }
951 | .uneditable-input {
952 | display: block;
953 | background-color: #ffffff;
954 | border-color: #eee;
955 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
956 | -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
957 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
958 | cursor: not-allowed;
959 | }
960 | :-moz-placeholder {
961 | color: #999999;
962 | }
963 | ::-webkit-input-placeholder {
964 | color: #999999;
965 | }
966 | .help-block,
967 | .help-inline {
968 | color: #555555;
969 | }
970 | .help-block {
971 | display: block;
972 | margin-bottom: 9px;
973 | }
974 | .help-inline {
975 | display: inline-block;
976 | *display: inline;
977 | /* IE7 inline-block hack */
978 |
979 | *zoom: 1;
980 | vertical-align: middle;
981 | padding-left: 5px;
982 | }
983 | .input-prepend,
984 | .input-append {
985 | margin-bottom: 5px;
986 | }
987 | .input-prepend input,
988 | .input-append input,
989 | .input-prepend select,
990 | .input-append select,
991 | .input-prepend .uneditable-input,
992 | .input-append .uneditable-input {
993 | *margin-left: 0;
994 | -webkit-border-radius: 0 3px 3px 0;
995 | -moz-border-radius: 0 3px 3px 0;
996 | border-radius: 0 3px 3px 0;
997 | }
998 | .input-prepend input:focus,
999 | .input-append input:focus,
1000 | .input-prepend select:focus,
1001 | .input-append select:focus,
1002 | .input-prepend .uneditable-input:focus,
1003 | .input-append .uneditable-input:focus {
1004 | position: relative;
1005 | z-index: 2;
1006 | }
1007 | .input-prepend .uneditable-input,
1008 | .input-append .uneditable-input {
1009 | border-left-color: #ccc;
1010 | }
1011 | .input-prepend .add-on,
1012 | .input-append .add-on {
1013 | display: inline-block;
1014 | width: auto;
1015 | min-width: 16px;
1016 | height: 18px;
1017 | padding: 4px 5px;
1018 | font-weight: normal;
1019 | line-height: 18px;
1020 | text-align: center;
1021 | text-shadow: 0 1px 0 #ffffff;
1022 | vertical-align: middle;
1023 | background-color: #eeeeee;
1024 | border: 1px solid #ccc;
1025 | }
1026 | .input-prepend .add-on,
1027 | .input-append .add-on,
1028 | .input-prepend .btn,
1029 | .input-append .btn {
1030 | -webkit-border-radius: 3px 0 0 3px;
1031 | -moz-border-radius: 3px 0 0 3px;
1032 | border-radius: 3px 0 0 3px;
1033 | }
1034 | .input-prepend .active,
1035 | .input-append .active {
1036 | background-color: #a9dba9;
1037 | border-color: #46a546;
1038 | }
1039 | .input-prepend .add-on,
1040 | .input-prepend .btn {
1041 | margin-right: -1px;
1042 | }
1043 | .input-append input,
1044 | .input-append select .uneditable-input {
1045 | -webkit-border-radius: 3px 0 0 3px;
1046 | -moz-border-radius: 3px 0 0 3px;
1047 | border-radius: 3px 0 0 3px;
1048 | }
1049 | .input-append .uneditable-input {
1050 | border-left-color: #eee;
1051 | border-right-color: #ccc;
1052 | }
1053 | .input-append .add-on,
1054 | .input-append .btn {
1055 | margin-left: -1px;
1056 | -webkit-border-radius: 0 3px 3px 0;
1057 | -moz-border-radius: 0 3px 3px 0;
1058 | border-radius: 0 3px 3px 0;
1059 | }
1060 | .input-prepend.input-append input,
1061 | .input-prepend.input-append select,
1062 | .input-prepend.input-append .uneditable-input {
1063 | -webkit-border-radius: 0;
1064 | -moz-border-radius: 0;
1065 | border-radius: 0;
1066 | }
1067 | .input-prepend.input-append .add-on:first-child,
1068 | .input-prepend.input-append .btn:first-child {
1069 | margin-right: -1px;
1070 | -webkit-border-radius: 3px 0 0 3px;
1071 | -moz-border-radius: 3px 0 0 3px;
1072 | border-radius: 3px 0 0 3px;
1073 | }
1074 | .input-prepend.input-append .add-on:last-child,
1075 | .input-prepend.input-append .btn:last-child {
1076 | margin-left: -1px;
1077 | -webkit-border-radius: 0 3px 3px 0;
1078 | -moz-border-radius: 0 3px 3px 0;
1079 | border-radius: 0 3px 3px 0;
1080 | }
1081 | .search-query {
1082 | padding-left: 14px;
1083 | padding-right: 14px;
1084 | margin-bottom: 0;
1085 | -webkit-border-radius: 14px;
1086 | -moz-border-radius: 14px;
1087 | border-radius: 14px;
1088 | }
1089 | .form-search input,
1090 | .form-inline input,
1091 | .form-horizontal input,
1092 | .form-search textarea,
1093 | .form-inline textarea,
1094 | .form-horizontal textarea,
1095 | .form-search select,
1096 | .form-inline select,
1097 | .form-horizontal select,
1098 | .form-search .help-inline,
1099 | .form-inline .help-inline,
1100 | .form-horizontal .help-inline,
1101 | .form-search .uneditable-input,
1102 | .form-inline .uneditable-input,
1103 | .form-horizontal .uneditable-input,
1104 | .form-search .input-prepend,
1105 | .form-inline .input-prepend,
1106 | .form-horizontal .input-prepend,
1107 | .form-search .input-append,
1108 | .form-inline .input-append,
1109 | .form-horizontal .input-append {
1110 | display: inline-block;
1111 | margin-bottom: 0;
1112 | }
1113 | .form-search .hide,
1114 | .form-inline .hide,
1115 | .form-horizontal .hide {
1116 | display: none;
1117 | }
1118 | .form-search label,
1119 | .form-inline label {
1120 | display: inline-block;
1121 | }
1122 | .form-search .input-append,
1123 | .form-inline .input-append,
1124 | .form-search .input-prepend,
1125 | .form-inline .input-prepend {
1126 | margin-bottom: 0;
1127 | }
1128 | .form-search .radio,
1129 | .form-search .checkbox,
1130 | .form-inline .radio,
1131 | .form-inline .checkbox {
1132 | padding-left: 0;
1133 | margin-bottom: 0;
1134 | vertical-align: middle;
1135 | }
1136 | .form-search .radio input[type="radio"],
1137 | .form-search .checkbox input[type="checkbox"],
1138 | .form-inline .radio input[type="radio"],
1139 | .form-inline .checkbox input[type="checkbox"] {
1140 | float: left;
1141 | margin-left: 0;
1142 | margin-right: 3px;
1143 | }
1144 | .control-group {
1145 | margin-bottom: 9px;
1146 | }
1147 | legend + .control-group {
1148 | margin-top: 18px;
1149 | -webkit-margin-top-collapse: separate;
1150 | }
1151 | .form-horizontal .control-group {
1152 | margin-bottom: 18px;
1153 | *zoom: 1;
1154 | }
1155 | .form-horizontal .control-group:before,
1156 | .form-horizontal .control-group:after {
1157 | display: table;
1158 | content: "";
1159 | }
1160 | .form-horizontal .control-group:after {
1161 | clear: both;
1162 | }
1163 | .form-horizontal .control-label {
1164 | float: left;
1165 | width: 140px;
1166 | padding-top: 5px;
1167 | text-align: right;
1168 | }
1169 | .form-horizontal .controls {
1170 | margin-left: 160px;
1171 | /* Super jank IE7 fix to ensure the inputs in .input-append and input-prepend don't inherit the margin of the parent, in this case .controls */
1172 |
1173 | *display: inline-block;
1174 | *margin-left: 0;
1175 | *padding-left: 20px;
1176 | }
1177 | .form-horizontal .help-block {
1178 | margin-top: 9px;
1179 | margin-bottom: 0;
1180 | }
1181 | .form-horizontal .form-actions {
1182 | padding-left: 160px;
1183 | }
1184 | table {
1185 | max-width: 100%;
1186 | border-collapse: collapse;
1187 | border-spacing: 0;
1188 | background-color: transparent;
1189 | }
1190 | .table {
1191 | width: 100%;
1192 | margin-bottom: 18px;
1193 | }
1194 | .table th,
1195 | .table td {
1196 | padding: 8px;
1197 | line-height: 18px;
1198 | text-align: left;
1199 | vertical-align: top;
1200 | border-top: 1px solid #dddddd;
1201 | }
1202 | .table th {
1203 | font-weight: bold;
1204 | }
1205 | .table thead th {
1206 | vertical-align: bottom;
1207 | }
1208 | .table colgroup + thead tr:first-child th,
1209 | .table colgroup + thead tr:first-child td,
1210 | .table thead:first-child tr:first-child th,
1211 | .table thead:first-child tr:first-child td {
1212 | border-top: 0;
1213 | }
1214 | .table tbody + tbody {
1215 | border-top: 2px solid #dddddd;
1216 | }
1217 | .table-condensed th,
1218 | .table-condensed td {
1219 | padding: 4px 5px;
1220 | }
1221 | .table-bordered {
1222 | border: 1px solid #dddddd;
1223 | border-left: 0;
1224 | border-collapse: separate;
1225 | *border-collapse: collapsed;
1226 | -webkit-border-radius: 4px;
1227 | -moz-border-radius: 4px;
1228 | border-radius: 4px;
1229 | }
1230 | .table-bordered th,
1231 | .table-bordered td {
1232 | border-left: 1px solid #dddddd;
1233 | }
1234 | .table-bordered thead:first-child tr:first-child th,
1235 | .table-bordered tbody:first-child tr:first-child th,
1236 | .table-bordered tbody:first-child tr:first-child td {
1237 | border-top: 0;
1238 | }
1239 | .table-bordered thead:first-child tr:first-child th:first-child,
1240 | .table-bordered tbody:first-child tr:first-child td:first-child {
1241 | -webkit-border-radius: 4px 0 0 0;
1242 | -moz-border-radius: 4px 0 0 0;
1243 | border-radius: 4px 0 0 0;
1244 | }
1245 | .table-bordered thead:first-child tr:first-child th:last-child,
1246 | .table-bordered tbody:first-child tr:first-child td:last-child {
1247 | -webkit-border-radius: 0 4px 0 0;
1248 | -moz-border-radius: 0 4px 0 0;
1249 | border-radius: 0 4px 0 0;
1250 | }
1251 | .table-bordered thead:last-child tr:last-child th:first-child,
1252 | .table-bordered tbody:last-child tr:last-child td:first-child {
1253 | -webkit-border-radius: 0 0 0 4px;
1254 | -moz-border-radius: 0 0 0 4px;
1255 | border-radius: 0 0 0 4px;
1256 | }
1257 | .table-bordered thead:last-child tr:last-child th:last-child,
1258 | .table-bordered tbody:last-child tr:last-child td:last-child {
1259 | -webkit-border-radius: 0 0 4px 0;
1260 | -moz-border-radius: 0 0 4px 0;
1261 | border-radius: 0 0 4px 0;
1262 | }
1263 | .table-striped tbody tr:nth-child(odd) td,
1264 | .table-striped tbody tr:nth-child(odd) th {
1265 | background-color: #f9f9f9;
1266 | }
1267 | .table tbody tr:hover td,
1268 | .table tbody tr:hover th {
1269 | background-color: #f5f5f5;
1270 | }
1271 | table .span1 {
1272 | float: none;
1273 | width: 44px;
1274 | margin-left: 0;
1275 | }
1276 | table .span2 {
1277 | float: none;
1278 | width: 124px;
1279 | margin-left: 0;
1280 | }
1281 | table .span3 {
1282 | float: none;
1283 | width: 204px;
1284 | margin-left: 0;
1285 | }
1286 | table .span4 {
1287 | float: none;
1288 | width: 284px;
1289 | margin-left: 0;
1290 | }
1291 | table .span5 {
1292 | float: none;
1293 | width: 364px;
1294 | margin-left: 0;
1295 | }
1296 | table .span6 {
1297 | float: none;
1298 | width: 444px;
1299 | margin-left: 0;
1300 | }
1301 | table .span7 {
1302 | float: none;
1303 | width: 524px;
1304 | margin-left: 0;
1305 | }
1306 | table .span8 {
1307 | float: none;
1308 | width: 604px;
1309 | margin-left: 0;
1310 | }
1311 | table .span9 {
1312 | float: none;
1313 | width: 684px;
1314 | margin-left: 0;
1315 | }
1316 | table .span10 {
1317 | float: none;
1318 | width: 764px;
1319 | margin-left: 0;
1320 | }
1321 | table .span11 {
1322 | float: none;
1323 | width: 844px;
1324 | margin-left: 0;
1325 | }
1326 | table .span12 {
1327 | float: none;
1328 | width: 924px;
1329 | margin-left: 0;
1330 | }
1331 | table .span13 {
1332 | float: none;
1333 | width: 1004px;
1334 | margin-left: 0;
1335 | }
1336 | table .span14 {
1337 | float: none;
1338 | width: 1084px;
1339 | margin-left: 0;
1340 | }
1341 | table .span15 {
1342 | float: none;
1343 | width: 1164px;
1344 | margin-left: 0;
1345 | }
1346 | table .span16 {
1347 | float: none;
1348 | width: 1244px;
1349 | margin-left: 0;
1350 | }
1351 | table .span17 {
1352 | float: none;
1353 | width: 1324px;
1354 | margin-left: 0;
1355 | }
1356 | table .span18 {
1357 | float: none;
1358 | width: 1404px;
1359 | margin-left: 0;
1360 | }
1361 | table .span19 {
1362 | float: none;
1363 | width: 1484px;
1364 | margin-left: 0;
1365 | }
1366 | table .span20 {
1367 | float: none;
1368 | width: 1564px;
1369 | margin-left: 0;
1370 | }
1371 | table .span21 {
1372 | float: none;
1373 | width: 1644px;
1374 | margin-left: 0;
1375 | }
1376 | table .span22 {
1377 | float: none;
1378 | width: 1724px;
1379 | margin-left: 0;
1380 | }
1381 | table .span23 {
1382 | float: none;
1383 | width: 1804px;
1384 | margin-left: 0;
1385 | }
1386 | table .span24 {
1387 | float: none;
1388 | width: 1884px;
1389 | margin-left: 0;
1390 | }
1391 | [class^="icon-"],
1392 | [class*=" icon-"] {
1393 | display: inline-block;
1394 | width: 14px;
1395 | height: 14px;
1396 | line-height: 14px;
1397 | vertical-align: text-top;
1398 | background-image: url("../img/glyphicons-halflings.png");
1399 | background-position: 14px 14px;
1400 | background-repeat: no-repeat;
1401 | *margin-right: .3em;
1402 | }
1403 | [class^="icon-"]:last-child,
1404 | [class*=" icon-"]:last-child {
1405 | *margin-left: 0;
1406 | }
1407 | .icon-white {
1408 | background-image: url("../img/glyphicons-halflings-white.png");
1409 | }
1410 | .icon-glass {
1411 | background-position: 0 0;
1412 | }
1413 | .icon-music {
1414 | background-position: -24px 0;
1415 | }
1416 | .icon-search {
1417 | background-position: -48px 0;
1418 | }
1419 | .icon-envelope {
1420 | background-position: -72px 0;
1421 | }
1422 | .icon-heart {
1423 | background-position: -96px 0;
1424 | }
1425 | .icon-star {
1426 | background-position: -120px 0;
1427 | }
1428 | .icon-star-empty {
1429 | background-position: -144px 0;
1430 | }
1431 | .icon-user {
1432 | background-position: -168px 0;
1433 | }
1434 | .icon-film {
1435 | background-position: -192px 0;
1436 | }
1437 | .icon-th-large {
1438 | background-position: -216px 0;
1439 | }
1440 | .icon-th {
1441 | background-position: -240px 0;
1442 | }
1443 | .icon-th-list {
1444 | background-position: -264px 0;
1445 | }
1446 | .icon-ok {
1447 | background-position: -288px 0;
1448 | }
1449 | .icon-remove {
1450 | background-position: -312px 0;
1451 | }
1452 | .icon-zoom-in {
1453 | background-position: -336px 0;
1454 | }
1455 | .icon-zoom-out {
1456 | background-position: -360px 0;
1457 | }
1458 | .icon-off {
1459 | background-position: -384px 0;
1460 | }
1461 | .icon-signal {
1462 | background-position: -408px 0;
1463 | }
1464 | .icon-cog {
1465 | background-position: -432px 0;
1466 | }
1467 | .icon-trash {
1468 | background-position: -456px 0;
1469 | }
1470 | .icon-home {
1471 | background-position: 0 -24px;
1472 | }
1473 | .icon-file {
1474 | background-position: -24px -24px;
1475 | }
1476 | .icon-time {
1477 | background-position: -48px -24px;
1478 | }
1479 | .icon-road {
1480 | background-position: -72px -24px;
1481 | }
1482 | .icon-download-alt {
1483 | background-position: -96px -24px;
1484 | }
1485 | .icon-download {
1486 | background-position: -120px -24px;
1487 | }
1488 | .icon-upload {
1489 | background-position: -144px -24px;
1490 | }
1491 | .icon-inbox {
1492 | background-position: -168px -24px;
1493 | }
1494 | .icon-play-circle {
1495 | background-position: -192px -24px;
1496 | }
1497 | .icon-repeat {
1498 | background-position: -216px -24px;
1499 | }
1500 | .icon-refresh {
1501 | background-position: -240px -24px;
1502 | }
1503 | .icon-list-alt {
1504 | background-position: -264px -24px;
1505 | }
1506 | .icon-lock {
1507 | background-position: -287px -24px;
1508 | }
1509 | .icon-flag {
1510 | background-position: -312px -24px;
1511 | }
1512 | .icon-headphones {
1513 | background-position: -336px -24px;
1514 | }
1515 | .icon-volume-off {
1516 | background-position: -360px -24px;
1517 | }
1518 | .icon-volume-down {
1519 | background-position: -384px -24px;
1520 | }
1521 | .icon-volume-up {
1522 | background-position: -408px -24px;
1523 | }
1524 | .icon-qrcode {
1525 | background-position: -432px -24px;
1526 | }
1527 | .icon-barcode {
1528 | background-position: -456px -24px;
1529 | }
1530 | .icon-tag {
1531 | background-position: 0 -48px;
1532 | }
1533 | .icon-tags {
1534 | background-position: -25px -48px;
1535 | }
1536 | .icon-book {
1537 | background-position: -48px -48px;
1538 | }
1539 | .icon-bookmark {
1540 | background-position: -72px -48px;
1541 | }
1542 | .icon-print {
1543 | background-position: -96px -48px;
1544 | }
1545 | .icon-camera {
1546 | background-position: -120px -48px;
1547 | }
1548 | .icon-font {
1549 | background-position: -144px -48px;
1550 | }
1551 | .icon-bold {
1552 | background-position: -167px -48px;
1553 | }
1554 | .icon-italic {
1555 | background-position: -192px -48px;
1556 | }
1557 | .icon-text-height {
1558 | background-position: -216px -48px;
1559 | }
1560 | .icon-text-width {
1561 | background-position: -240px -48px;
1562 | }
1563 | .icon-align-left {
1564 | background-position: -264px -48px;
1565 | }
1566 | .icon-align-center {
1567 | background-position: -288px -48px;
1568 | }
1569 | .icon-align-right {
1570 | background-position: -312px -48px;
1571 | }
1572 | .icon-align-justify {
1573 | background-position: -336px -48px;
1574 | }
1575 | .icon-list {
1576 | background-position: -360px -48px;
1577 | }
1578 | .icon-indent-left {
1579 | background-position: -384px -48px;
1580 | }
1581 | .icon-indent-right {
1582 | background-position: -408px -48px;
1583 | }
1584 | .icon-facetime-video {
1585 | background-position: -432px -48px;
1586 | }
1587 | .icon-picture {
1588 | background-position: -456px -48px;
1589 | }
1590 | .icon-pencil {
1591 | background-position: 0 -72px;
1592 | }
1593 | .icon-map-marker {
1594 | background-position: -24px -72px;
1595 | }
1596 | .icon-adjust {
1597 | background-position: -48px -72px;
1598 | }
1599 | .icon-tint {
1600 | background-position: -72px -72px;
1601 | }
1602 | .icon-edit {
1603 | background-position: -96px -72px;
1604 | }
1605 | .icon-share {
1606 | background-position: -120px -72px;
1607 | }
1608 | .icon-check {
1609 | background-position: -144px -72px;
1610 | }
1611 | .icon-move {
1612 | background-position: -168px -72px;
1613 | }
1614 | .icon-step-backward {
1615 | background-position: -192px -72px;
1616 | }
1617 | .icon-fast-backward {
1618 | background-position: -216px -72px;
1619 | }
1620 | .icon-backward {
1621 | background-position: -240px -72px;
1622 | }
1623 | .icon-play {
1624 | background-position: -264px -72px;
1625 | }
1626 | .icon-pause {
1627 | background-position: -288px -72px;
1628 | }
1629 | .icon-stop {
1630 | background-position: -312px -72px;
1631 | }
1632 | .icon-forward {
1633 | background-position: -336px -72px;
1634 | }
1635 | .icon-fast-forward {
1636 | background-position: -360px -72px;
1637 | }
1638 | .icon-step-forward {
1639 | background-position: -384px -72px;
1640 | }
1641 | .icon-eject {
1642 | background-position: -408px -72px;
1643 | }
1644 | .icon-chevron-left {
1645 | background-position: -432px -72px;
1646 | }
1647 | .icon-chevron-right {
1648 | background-position: -456px -72px;
1649 | }
1650 | .icon-plus-sign {
1651 | background-position: 0 -96px;
1652 | }
1653 | .icon-minus-sign {
1654 | background-position: -24px -96px;
1655 | }
1656 | .icon-remove-sign {
1657 | background-position: -48px -96px;
1658 | }
1659 | .icon-ok-sign {
1660 | background-position: -72px -96px;
1661 | }
1662 | .icon-question-sign {
1663 | background-position: -96px -96px;
1664 | }
1665 | .icon-info-sign {
1666 | background-position: -120px -96px;
1667 | }
1668 | .icon-screenshot {
1669 | background-position: -144px -96px;
1670 | }
1671 | .icon-remove-circle {
1672 | background-position: -168px -96px;
1673 | }
1674 | .icon-ok-circle {
1675 | background-position: -192px -96px;
1676 | }
1677 | .icon-ban-circle {
1678 | background-position: -216px -96px;
1679 | }
1680 | .icon-arrow-left {
1681 | background-position: -240px -96px;
1682 | }
1683 | .icon-arrow-right {
1684 | background-position: -264px -96px;
1685 | }
1686 | .icon-arrow-up {
1687 | background-position: -289px -96px;
1688 | }
1689 | .icon-arrow-down {
1690 | background-position: -312px -96px;
1691 | }
1692 | .icon-share-alt {
1693 | background-position: -336px -96px;
1694 | }
1695 | .icon-resize-full {
1696 | background-position: -360px -96px;
1697 | }
1698 | .icon-resize-small {
1699 | background-position: -384px -96px;
1700 | }
1701 | .icon-plus {
1702 | background-position: -408px -96px;
1703 | }
1704 | .icon-minus {
1705 | background-position: -433px -96px;
1706 | }
1707 | .icon-asterisk {
1708 | background-position: -456px -96px;
1709 | }
1710 | .icon-exclamation-sign {
1711 | background-position: 0 -120px;
1712 | }
1713 | .icon-gift {
1714 | background-position: -24px -120px;
1715 | }
1716 | .icon-leaf {
1717 | background-position: -48px -120px;
1718 | }
1719 | .icon-fire {
1720 | background-position: -72px -120px;
1721 | }
1722 | .icon-eye-open {
1723 | background-position: -96px -120px;
1724 | }
1725 | .icon-eye-close {
1726 | background-position: -120px -120px;
1727 | }
1728 | .icon-warning-sign {
1729 | background-position: -144px -120px;
1730 | }
1731 | .icon-plane {
1732 | background-position: -168px -120px;
1733 | }
1734 | .icon-calendar {
1735 | background-position: -192px -120px;
1736 | }
1737 | .icon-random {
1738 | background-position: -216px -120px;
1739 | }
1740 | .icon-comment {
1741 | background-position: -240px -120px;
1742 | }
1743 | .icon-magnet {
1744 | background-position: -264px -120px;
1745 | }
1746 | .icon-chevron-up {
1747 | background-position: -288px -120px;
1748 | }
1749 | .icon-chevron-down {
1750 | background-position: -313px -119px;
1751 | }
1752 | .icon-retweet {
1753 | background-position: -336px -120px;
1754 | }
1755 | .icon-shopping-cart {
1756 | background-position: -360px -120px;
1757 | }
1758 | .icon-folder-close {
1759 | background-position: -384px -120px;
1760 | }
1761 | .icon-folder-open {
1762 | background-position: -408px -120px;
1763 | }
1764 | .icon-resize-vertical {
1765 | background-position: -432px -119px;
1766 | }
1767 | .icon-resize-horizontal {
1768 | background-position: -456px -118px;
1769 | }
1770 | .dropdown {
1771 | position: relative;
1772 | }
1773 | .dropdown-toggle {
1774 | *margin-bottom: -3px;
1775 | }
1776 | .dropdown-toggle:active,
1777 | .open .dropdown-toggle {
1778 | outline: 0;
1779 | }
1780 | .caret {
1781 | display: inline-block;
1782 | width: 0;
1783 | height: 0;
1784 | vertical-align: top;
1785 | border-left: 4px solid transparent;
1786 | border-right: 4px solid transparent;
1787 | border-top: 4px solid #000000;
1788 | opacity: 0.3;
1789 | filter: alpha(opacity=30);
1790 | content: "";
1791 | }
1792 | .dropdown .caret {
1793 | margin-top: 8px;
1794 | margin-left: 2px;
1795 | }
1796 | .dropdown:hover .caret,
1797 | .open.dropdown .caret {
1798 | opacity: 1;
1799 | filter: alpha(opacity=100);
1800 | }
1801 | .dropdown-menu {
1802 | position: absolute;
1803 | top: 100%;
1804 | left: 0;
1805 | z-index: 1000;
1806 | float: left;
1807 | display: none;
1808 | min-width: 160px;
1809 | padding: 4px 0;
1810 | margin: 0;
1811 | list-style: none;
1812 | background-color: #ffffff;
1813 | border-color: #ccc;
1814 | border-color: rgba(0, 0, 0, 0.2);
1815 | border-style: solid;
1816 | border-width: 1px;
1817 | -webkit-border-radius: 0 0 5px 5px;
1818 | -moz-border-radius: 0 0 5px 5px;
1819 | border-radius: 0 0 5px 5px;
1820 | -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
1821 | -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
1822 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
1823 | -webkit-background-clip: padding-box;
1824 | -moz-background-clip: padding;
1825 | background-clip: padding-box;
1826 | *border-right-width: 2px;
1827 | *border-bottom-width: 2px;
1828 | }
1829 | .dropdown-menu.pull-right {
1830 | right: 0;
1831 | left: auto;
1832 | }
1833 | .dropdown-menu .divider {
1834 | height: 1px;
1835 | margin: 8px 1px;
1836 | overflow: hidden;
1837 | background-color: #e5e5e5;
1838 | border-bottom: 1px solid #ffffff;
1839 | *width: 100%;
1840 | *margin: -5px 0 5px;
1841 | }
1842 | .dropdown-menu a {
1843 | display: block;
1844 | padding: 3px 15px;
1845 | clear: both;
1846 | font-weight: normal;
1847 | line-height: 18px;
1848 | color: #333333;
1849 | white-space: nowrap;
1850 | }
1851 | .dropdown-menu li > a:hover,
1852 | .dropdown-menu .active > a,
1853 | .dropdown-menu .active > a:hover {
1854 | color: #ffffff;
1855 | text-decoration: none;
1856 | background-color: #0088cc;
1857 | }
1858 | .dropdown.open {
1859 | *z-index: 1000;
1860 | }
1861 | .dropdown.open .dropdown-toggle {
1862 | color: #ffffff;
1863 | background: #ccc;
1864 | background: rgba(0, 0, 0, 0.3);
1865 | }
1866 | .dropdown.open .dropdown-menu {
1867 | display: block;
1868 | }
1869 | .pull-right .dropdown-menu {
1870 | left: auto;
1871 | right: 0;
1872 | }
1873 | .dropup .caret,
1874 | .navbar-fixed-bottom .dropdown .caret {
1875 | border-top: 0;
1876 | border-bottom: 4px solid #000000;
1877 | content: "\2191";
1878 | }
1879 | .dropup .dropdown-menu,
1880 | .navbar-fixed-bottom .dropdown .dropdown-menu {
1881 | top: auto;
1882 | bottom: 100%;
1883 | margin-bottom: 1px;
1884 | }
1885 | .typeahead {
1886 | margin-top: 2px;
1887 | -webkit-border-radius: 4px;
1888 | -moz-border-radius: 4px;
1889 | border-radius: 4px;
1890 | }
1891 | .well {
1892 | min-height: 20px;
1893 | padding: 19px;
1894 | margin-bottom: 20px;
1895 | background-color: #f5f5f5;
1896 | border: 1px solid #eee;
1897 | border: 1px solid rgba(0, 0, 0, 0.05);
1898 | -webkit-border-radius: 4px;
1899 | -moz-border-radius: 4px;
1900 | border-radius: 4px;
1901 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
1902 | -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
1903 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
1904 | }
1905 | .well blockquote {
1906 | border-color: #ddd;
1907 | border-color: rgba(0, 0, 0, 0.15);
1908 | }
1909 | .well-large {
1910 | padding: 24px;
1911 | -webkit-border-radius: 6px;
1912 | -moz-border-radius: 6px;
1913 | border-radius: 6px;
1914 | }
1915 | .well-small {
1916 | padding: 9px;
1917 | -webkit-border-radius: 3px;
1918 | -moz-border-radius: 3px;
1919 | border-radius: 3px;
1920 | }
1921 | .fade {
1922 | -webkit-transition: opacity 0.15s linear;
1923 | -moz-transition: opacity 0.15s linear;
1924 | -ms-transition: opacity 0.15s linear;
1925 | -o-transition: opacity 0.15s linear;
1926 | transition: opacity 0.15s linear;
1927 | opacity: 0;
1928 | }
1929 | .fade.in {
1930 | opacity: 1;
1931 | }
1932 | .collapse {
1933 | -webkit-transition: height 0.35s ease;
1934 | -moz-transition: height 0.35s ease;
1935 | -ms-transition: height 0.35s ease;
1936 | -o-transition: height 0.35s ease;
1937 | transition: height 0.35s ease;
1938 | position: relative;
1939 | overflow: hidden;
1940 | height: 0;
1941 | }
1942 | .collapse.in {
1943 | height: auto;
1944 | }
1945 | .close {
1946 | float: right;
1947 | font-size: 20px;
1948 | font-weight: bold;
1949 | line-height: 18px;
1950 | color: #000000;
1951 | text-shadow: 0 1px 0 #ffffff;
1952 | opacity: 0.2;
1953 | filter: alpha(opacity=20);
1954 | }
1955 | .close:hover {
1956 | color: #000000;
1957 | text-decoration: none;
1958 | opacity: 0.4;
1959 | filter: alpha(opacity=40);
1960 | cursor: pointer;
1961 | }
1962 | .btn {
1963 | display: inline-block;
1964 | *display: inline;
1965 | /* IE7 inline-block hack */
1966 |
1967 | *zoom: 1;
1968 | padding: 4px 10px 4px;
1969 | margin-bottom: 0;
1970 | font-size: 13px;
1971 | line-height: 18px;
1972 | color: #333333;
1973 | text-align: center;
1974 | text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
1975 | vertical-align: middle;
1976 | background-color: #f5f5f5;
1977 | background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
1978 | background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6);
1979 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
1980 | background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
1981 | background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
1982 | background-image: linear-gradient(top, #ffffff, #e6e6e6);
1983 | background-repeat: repeat-x;
1984 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
1985 | border-color: #e6e6e6 #e6e6e6 #bfbfbf;
1986 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
1987 | filter: progid:dximagetransform.microsoft.gradient(enabled=false);
1988 | border: 1px solid #cccccc;
1989 | border-bottom-color: #b3b3b3;
1990 | -webkit-border-radius: 4px;
1991 | -moz-border-radius: 4px;
1992 | border-radius: 4px;
1993 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
1994 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
1995 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
1996 | cursor: pointer;
1997 | *margin-left: .3em;
1998 | }
1999 | .btn:hover,
2000 | .btn:active,
2001 | .btn.active,
2002 | .btn.disabled,
2003 | .btn[disabled] {
2004 | background-color: #e6e6e6;
2005 | }
2006 | .btn:active,
2007 | .btn.active {
2008 | background-color: #cccccc \9;
2009 | }
2010 | .btn:first-child {
2011 | *margin-left: 0;
2012 | }
2013 | .btn:hover {
2014 | color: #333333;
2015 | text-decoration: none;
2016 | background-color: #e6e6e6;
2017 | background-position: 0 -15px;
2018 | -webkit-transition: background-position 0.1s linear;
2019 | -moz-transition: background-position 0.1s linear;
2020 | -ms-transition: background-position 0.1s linear;
2021 | -o-transition: background-position 0.1s linear;
2022 | transition: background-position 0.1s linear;
2023 | }
2024 | .btn:focus {
2025 | outline: thin dotted #333;
2026 | outline: 5px auto -webkit-focus-ring-color;
2027 | outline-offset: -2px;
2028 | }
2029 | .btn.active,
2030 | .btn:active {
2031 | background-image: none;
2032 | -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
2033 | -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
2034 | box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
2035 | background-color: #e6e6e6;
2036 | background-color: #d9d9d9 \9;
2037 | outline: 0;
2038 | }
2039 | .btn.disabled,
2040 | .btn[disabled] {
2041 | cursor: default;
2042 | background-image: none;
2043 | background-color: #e6e6e6;
2044 | opacity: 0.65;
2045 | filter: alpha(opacity=65);
2046 | -webkit-box-shadow: none;
2047 | -moz-box-shadow: none;
2048 | box-shadow: none;
2049 | }
2050 | .btn-large {
2051 | padding: 9px 14px;
2052 | font-size: 15px;
2053 | line-height: normal;
2054 | -webkit-border-radius: 5px;
2055 | -moz-border-radius: 5px;
2056 | border-radius: 5px;
2057 | }
2058 | .btn-large [class^="icon-"] {
2059 | margin-top: 1px;
2060 | }
2061 | .btn-small {
2062 | padding: 5px 9px;
2063 | font-size: 11px;
2064 | line-height: 16px;
2065 | }
2066 | .btn-small [class^="icon-"] {
2067 | margin-top: -1px;
2068 | }
2069 | .btn-mini {
2070 | padding: 2px 6px;
2071 | font-size: 11px;
2072 | line-height: 14px;
2073 | }
2074 | .btn-primary,
2075 | .btn-primary:hover,
2076 | .btn-warning,
2077 | .btn-warning:hover,
2078 | .btn-danger,
2079 | .btn-danger:hover,
2080 | .btn-success,
2081 | .btn-success:hover,
2082 | .btn-info,
2083 | .btn-info:hover,
2084 | .btn-inverse,
2085 | .btn-inverse:hover {
2086 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
2087 | color: #ffffff;
2088 | }
2089 | .btn-primary.active,
2090 | .btn-warning.active,
2091 | .btn-danger.active,
2092 | .btn-success.active,
2093 | .btn-info.active,
2094 | .btn-inverse.active {
2095 | color: rgba(255, 255, 255, 0.75);
2096 | }
2097 | .btn-primary {
2098 | background-color: #0074cc;
2099 | background-image: -moz-linear-gradient(top, #0088cc, #0055cc);
2100 | background-image: -ms-linear-gradient(top, #0088cc, #0055cc);
2101 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc));
2102 | background-image: -webkit-linear-gradient(top, #0088cc, #0055cc);
2103 | background-image: -o-linear-gradient(top, #0088cc, #0055cc);
2104 | background-image: linear-gradient(top, #0088cc, #0055cc);
2105 | background-repeat: repeat-x;
2106 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0);
2107 | border-color: #0055cc #0055cc #003580;
2108 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2109 | filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2110 | }
2111 | .btn-primary:hover,
2112 | .btn-primary:active,
2113 | .btn-primary.active,
2114 | .btn-primary.disabled,
2115 | .btn-primary[disabled] {
2116 | background-color: #0055cc;
2117 | }
2118 | .btn-primary:active,
2119 | .btn-primary.active {
2120 | background-color: #004099 \9;
2121 | }
2122 | .btn-warning {
2123 | background-color: #faa732;
2124 | background-image: -moz-linear-gradient(top, #fbb450, #f89406);
2125 | background-image: -ms-linear-gradient(top, #fbb450, #f89406);
2126 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
2127 | background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
2128 | background-image: -o-linear-gradient(top, #fbb450, #f89406);
2129 | background-image: linear-gradient(top, #fbb450, #f89406);
2130 | background-repeat: repeat-x;
2131 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
2132 | border-color: #f89406 #f89406 #ad6704;
2133 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2134 | filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2135 | }
2136 | .btn-warning:hover,
2137 | .btn-warning:active,
2138 | .btn-warning.active,
2139 | .btn-warning.disabled,
2140 | .btn-warning[disabled] {
2141 | background-color: #f89406;
2142 | }
2143 | .btn-warning:active,
2144 | .btn-warning.active {
2145 | background-color: #c67605 \9;
2146 | }
2147 | .btn-danger {
2148 | background-color: #da4f49;
2149 | background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
2150 | background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f);
2151 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
2152 | background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
2153 | background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
2154 | background-image: linear-gradient(top, #ee5f5b, #bd362f);
2155 | background-repeat: repeat-x;
2156 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);
2157 | border-color: #bd362f #bd362f #802420;
2158 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2159 | filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2160 | }
2161 | .btn-danger:hover,
2162 | .btn-danger:active,
2163 | .btn-danger.active,
2164 | .btn-danger.disabled,
2165 | .btn-danger[disabled] {
2166 | background-color: #bd362f;
2167 | }
2168 | .btn-danger:active,
2169 | .btn-danger.active {
2170 | background-color: #942a25 \9;
2171 | }
2172 | .btn-success {
2173 | background-color: #5bb75b;
2174 | background-image: -moz-linear-gradient(top, #62c462, #51a351);
2175 | background-image: -ms-linear-gradient(top, #62c462, #51a351);
2176 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
2177 | background-image: -webkit-linear-gradient(top, #62c462, #51a351);
2178 | background-image: -o-linear-gradient(top, #62c462, #51a351);
2179 | background-image: linear-gradient(top, #62c462, #51a351);
2180 | background-repeat: repeat-x;
2181 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);
2182 | border-color: #51a351 #51a351 #387038;
2183 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2184 | filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2185 | }
2186 | .btn-success:hover,
2187 | .btn-success:active,
2188 | .btn-success.active,
2189 | .btn-success.disabled,
2190 | .btn-success[disabled] {
2191 | background-color: #51a351;
2192 | }
2193 | .btn-success:active,
2194 | .btn-success.active {
2195 | background-color: #408140 \9;
2196 | }
2197 | .btn-info {
2198 | background-color: #49afcd;
2199 | background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
2200 | background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4);
2201 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
2202 | background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
2203 | background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
2204 | background-image: linear-gradient(top, #5bc0de, #2f96b4);
2205 | background-repeat: repeat-x;
2206 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);
2207 | border-color: #2f96b4 #2f96b4 #1f6377;
2208 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2209 | filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2210 | }
2211 | .btn-info:hover,
2212 | .btn-info:active,
2213 | .btn-info.active,
2214 | .btn-info.disabled,
2215 | .btn-info[disabled] {
2216 | background-color: #2f96b4;
2217 | }
2218 | .btn-info:active,
2219 | .btn-info.active {
2220 | background-color: #24748c \9;
2221 | }
2222 | .btn-inverse {
2223 | background-color: #414141;
2224 | background-image: -moz-linear-gradient(top, #555555, #222222);
2225 | background-image: -ms-linear-gradient(top, #555555, #222222);
2226 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222));
2227 | background-image: -webkit-linear-gradient(top, #555555, #222222);
2228 | background-image: -o-linear-gradient(top, #555555, #222222);
2229 | background-image: linear-gradient(top, #555555, #222222);
2230 | background-repeat: repeat-x;
2231 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0);
2232 | border-color: #222222 #222222 #000000;
2233 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2234 | filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2235 | }
2236 | .btn-inverse:hover,
2237 | .btn-inverse:active,
2238 | .btn-inverse.active,
2239 | .btn-inverse.disabled,
2240 | .btn-inverse[disabled] {
2241 | background-color: #222222;
2242 | }
2243 | .btn-inverse:active,
2244 | .btn-inverse.active {
2245 | background-color: #080808 \9;
2246 | }
2247 | button.btn,
2248 | input[type="submit"].btn {
2249 | *padding-top: 2px;
2250 | *padding-bottom: 2px;
2251 | }
2252 | button.btn::-moz-focus-inner,
2253 | input[type="submit"].btn::-moz-focus-inner {
2254 | padding: 0;
2255 | border: 0;
2256 | }
2257 | button.btn.btn-large,
2258 | input[type="submit"].btn.btn-large {
2259 | *padding-top: 7px;
2260 | *padding-bottom: 7px;
2261 | }
2262 | button.btn.btn-small,
2263 | input[type="submit"].btn.btn-small {
2264 | *padding-top: 3px;
2265 | *padding-bottom: 3px;
2266 | }
2267 | button.btn.btn-mini,
2268 | input[type="submit"].btn.btn-mini {
2269 | *padding-top: 1px;
2270 | *padding-bottom: 1px;
2271 | }
2272 | .btn-group {
2273 | position: relative;
2274 | *zoom: 1;
2275 | *margin-left: .3em;
2276 | }
2277 | .btn-group:before,
2278 | .btn-group:after {
2279 | display: table;
2280 | content: "";
2281 | }
2282 | .btn-group:after {
2283 | clear: both;
2284 | }
2285 | .btn-group:first-child {
2286 | *margin-left: 0;
2287 | }
2288 | .btn-group + .btn-group {
2289 | margin-left: 5px;
2290 | }
2291 | .btn-toolbar {
2292 | margin-top: 9px;
2293 | margin-bottom: 9px;
2294 | }
2295 | .btn-toolbar .btn-group {
2296 | display: inline-block;
2297 | *display: inline;
2298 | /* IE7 inline-block hack */
2299 |
2300 | *zoom: 1;
2301 | }
2302 | .btn-group .btn {
2303 | position: relative;
2304 | float: left;
2305 | margin-left: -1px;
2306 | -webkit-border-radius: 0;
2307 | -moz-border-radius: 0;
2308 | border-radius: 0;
2309 | }
2310 | .btn-group .btn:first-child {
2311 | margin-left: 0;
2312 | -webkit-border-top-left-radius: 4px;
2313 | -moz-border-radius-topleft: 4px;
2314 | border-top-left-radius: 4px;
2315 | -webkit-border-bottom-left-radius: 4px;
2316 | -moz-border-radius-bottomleft: 4px;
2317 | border-bottom-left-radius: 4px;
2318 | }
2319 | .btn-group .btn:last-child,
2320 | .btn-group .dropdown-toggle {
2321 | -webkit-border-top-right-radius: 4px;
2322 | -moz-border-radius-topright: 4px;
2323 | border-top-right-radius: 4px;
2324 | -webkit-border-bottom-right-radius: 4px;
2325 | -moz-border-radius-bottomright: 4px;
2326 | border-bottom-right-radius: 4px;
2327 | }
2328 | .btn-group .btn.large:first-child {
2329 | margin-left: 0;
2330 | -webkit-border-top-left-radius: 6px;
2331 | -moz-border-radius-topleft: 6px;
2332 | border-top-left-radius: 6px;
2333 | -webkit-border-bottom-left-radius: 6px;
2334 | -moz-border-radius-bottomleft: 6px;
2335 | border-bottom-left-radius: 6px;
2336 | }
2337 | .btn-group .btn.large:last-child,
2338 | .btn-group .large.dropdown-toggle {
2339 | -webkit-border-top-right-radius: 6px;
2340 | -moz-border-radius-topright: 6px;
2341 | border-top-right-radius: 6px;
2342 | -webkit-border-bottom-right-radius: 6px;
2343 | -moz-border-radius-bottomright: 6px;
2344 | border-bottom-right-radius: 6px;
2345 | }
2346 | .btn-group .btn:hover,
2347 | .btn-group .btn:focus,
2348 | .btn-group .btn:active,
2349 | .btn-group .btn.active {
2350 | z-index: 2;
2351 | }
2352 | .btn-group .dropdown-toggle:active,
2353 | .btn-group.open .dropdown-toggle {
2354 | outline: 0;
2355 | }
2356 | .btn-group .dropdown-toggle {
2357 | padding-left: 8px;
2358 | padding-right: 8px;
2359 | -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
2360 | -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
2361 | box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
2362 | *padding-top: 3px;
2363 | *padding-bottom: 3px;
2364 | }
2365 | .btn-group .btn-mini.dropdown-toggle {
2366 | padding-left: 5px;
2367 | padding-right: 5px;
2368 | *padding-top: 1px;
2369 | *padding-bottom: 1px;
2370 | }
2371 | .btn-group .btn-small.dropdown-toggle {
2372 | *padding-top: 4px;
2373 | *padding-bottom: 4px;
2374 | }
2375 | .btn-group .btn-large.dropdown-toggle {
2376 | padding-left: 12px;
2377 | padding-right: 12px;
2378 | }
2379 | .btn-group.open {
2380 | *z-index: 1000;
2381 | }
2382 | .btn-group.open .dropdown-menu {
2383 | display: block;
2384 | margin-top: 1px;
2385 | -webkit-border-radius: 5px;
2386 | -moz-border-radius: 5px;
2387 | border-radius: 5px;
2388 | }
2389 | .btn-group.open .dropdown-toggle {
2390 | background-image: none;
2391 | -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
2392 | -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
2393 | box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
2394 | }
2395 | .btn .caret {
2396 | margin-top: 7px;
2397 | margin-left: 0;
2398 | }
2399 | .btn:hover .caret,
2400 | .open.btn-group .caret {
2401 | opacity: 1;
2402 | filter: alpha(opacity=100);
2403 | }
2404 | .btn-mini .caret {
2405 | margin-top: 5px;
2406 | }
2407 | .btn-small .caret {
2408 | margin-top: 6px;
2409 | }
2410 | .btn-large .caret {
2411 | margin-top: 6px;
2412 | border-left: 5px solid transparent;
2413 | border-right: 5px solid transparent;
2414 | border-top: 5px solid #000000;
2415 | }
2416 | .btn-primary .caret,
2417 | .btn-warning .caret,
2418 | .btn-danger .caret,
2419 | .btn-info .caret,
2420 | .btn-success .caret,
2421 | .btn-inverse .caret {
2422 | border-top-color: #ffffff;
2423 | border-bottom-color: #ffffff;
2424 | opacity: 0.75;
2425 | filter: alpha(opacity=75);
2426 | }
2427 | .alert {
2428 | padding: 8px 35px 8px 14px;
2429 | margin-bottom: 18px;
2430 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
2431 | background-color: #fcf8e3;
2432 | border: 1px solid #fbeed5;
2433 | -webkit-border-radius: 4px;
2434 | -moz-border-radius: 4px;
2435 | border-radius: 4px;
2436 | color: #c09853;
2437 | }
2438 | .alert-heading {
2439 | color: inherit;
2440 | }
2441 | .alert .close {
2442 | position: relative;
2443 | top: -2px;
2444 | right: -21px;
2445 | line-height: 18px;
2446 | }
2447 | .alert-success {
2448 | background-color: #dff0d8;
2449 | border-color: #d6e9c6;
2450 | color: #468847;
2451 | }
2452 | .alert-danger,
2453 | .alert-error {
2454 | background-color: #f2dede;
2455 | border-color: #eed3d7;
2456 | color: #b94a48;
2457 | }
2458 | .alert-info {
2459 | background-color: #d9edf7;
2460 | border-color: #bce8f1;
2461 | color: #3a87ad;
2462 | }
2463 | .alert-block {
2464 | padding-top: 14px;
2465 | padding-bottom: 14px;
2466 | }
2467 | .alert-block > p,
2468 | .alert-block > ul {
2469 | margin-bottom: 0;
2470 | }
2471 | .alert-block p + p {
2472 | margin-top: 5px;
2473 | }
2474 | .nav {
2475 | margin-left: 0;
2476 | margin-bottom: 18px;
2477 | list-style: none;
2478 | }
2479 | .nav > li > a {
2480 | display: block;
2481 | }
2482 | .nav > li > a:hover {
2483 | text-decoration: none;
2484 | background-color: #eeeeee;
2485 | }
2486 | .nav .nav-header {
2487 | display: block;
2488 | padding: 3px 15px;
2489 | font-size: 11px;
2490 | font-weight: bold;
2491 | line-height: 18px;
2492 | color: #999999;
2493 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
2494 | text-transform: uppercase;
2495 | }
2496 | .nav li + .nav-header {
2497 | margin-top: 9px;
2498 | }
2499 | .nav-list {
2500 | padding-left: 15px;
2501 | padding-right: 15px;
2502 | margin-bottom: 0;
2503 | }
2504 | .nav-list > li > a,
2505 | .nav-list .nav-header {
2506 | margin-left: -15px;
2507 | margin-right: -15px;
2508 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
2509 | }
2510 | .nav-list > li > a {
2511 | padding: 3px 15px;
2512 | }
2513 | .nav-list > .active > a,
2514 | .nav-list > .active > a:hover {
2515 | color: #ffffff;
2516 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
2517 | background-color: #0088cc;
2518 | }
2519 | .nav-list [class^="icon-"] {
2520 | margin-right: 2px;
2521 | }
2522 | .nav-list .divider {
2523 | height: 1px;
2524 | margin: 8px 1px;
2525 | overflow: hidden;
2526 | background-color: #e5e5e5;
2527 | border-bottom: 1px solid #ffffff;
2528 | *width: 100%;
2529 | *margin: -5px 0 5px;
2530 | }
2531 | .nav-tabs,
2532 | .nav-pills {
2533 | *zoom: 1;
2534 | }
2535 | .nav-tabs:before,
2536 | .nav-pills:before,
2537 | .nav-tabs:after,
2538 | .nav-pills:after {
2539 | display: table;
2540 | content: "";
2541 | }
2542 | .nav-tabs:after,
2543 | .nav-pills:after {
2544 | clear: both;
2545 | }
2546 | .nav-tabs > li,
2547 | .nav-pills > li {
2548 | float: left;
2549 | }
2550 | .nav-tabs > li > a,
2551 | .nav-pills > li > a {
2552 | padding-right: 12px;
2553 | padding-left: 12px;
2554 | margin-right: 2px;
2555 | line-height: 14px;
2556 | }
2557 | .nav-tabs {
2558 | border-bottom: 1px solid #ddd;
2559 | }
2560 | .nav-tabs > li {
2561 | margin-bottom: -1px;
2562 | }
2563 | .nav-tabs > li > a {
2564 | padding-top: 8px;
2565 | padding-bottom: 8px;
2566 | line-height: 18px;
2567 | border: 1px solid transparent;
2568 | -webkit-border-radius: 4px 4px 0 0;
2569 | -moz-border-radius: 4px 4px 0 0;
2570 | border-radius: 4px 4px 0 0;
2571 | }
2572 | .nav-tabs > li > a:hover {
2573 | border-color: #eeeeee #eeeeee #dddddd;
2574 | }
2575 | .nav-tabs > .active > a,
2576 | .nav-tabs > .active > a:hover {
2577 | color: #555555;
2578 | background-color: #ffffff;
2579 | border: 1px solid #ddd;
2580 | border-bottom-color: transparent;
2581 | cursor: default;
2582 | }
2583 | .nav-pills > li > a {
2584 | padding-top: 8px;
2585 | padding-bottom: 8px;
2586 | margin-top: 2px;
2587 | margin-bottom: 2px;
2588 | -webkit-border-radius: 5px;
2589 | -moz-border-radius: 5px;
2590 | border-radius: 5px;
2591 | }
2592 | .nav-pills > .active > a,
2593 | .nav-pills > .active > a:hover {
2594 | color: #ffffff;
2595 | background-color: #0088cc;
2596 | }
2597 | .nav-stacked > li {
2598 | float: none;
2599 | }
2600 | .nav-stacked > li > a {
2601 | margin-right: 0;
2602 | }
2603 | .nav-tabs.nav-stacked {
2604 | border-bottom: 0;
2605 | }
2606 | .nav-tabs.nav-stacked > li > a {
2607 | border: 1px solid #ddd;
2608 | -webkit-border-radius: 0;
2609 | -moz-border-radius: 0;
2610 | border-radius: 0;
2611 | }
2612 | .nav-tabs.nav-stacked > li:first-child > a {
2613 | -webkit-border-radius: 4px 4px 0 0;
2614 | -moz-border-radius: 4px 4px 0 0;
2615 | border-radius: 4px 4px 0 0;
2616 | }
2617 | .nav-tabs.nav-stacked > li:last-child > a {
2618 | -webkit-border-radius: 0 0 4px 4px;
2619 | -moz-border-radius: 0 0 4px 4px;
2620 | border-radius: 0 0 4px 4px;
2621 | }
2622 | .nav-tabs.nav-stacked > li > a:hover {
2623 | border-color: #ddd;
2624 | z-index: 2;
2625 | }
2626 | .nav-pills.nav-stacked > li > a {
2627 | margin-bottom: 3px;
2628 | }
2629 | .nav-pills.nav-stacked > li:last-child > a {
2630 | margin-bottom: 1px;
2631 | }
2632 | .nav-tabs .dropdown-menu,
2633 | .nav-pills .dropdown-menu {
2634 | margin-top: 1px;
2635 | border-width: 1px;
2636 | }
2637 | .nav-pills .dropdown-menu {
2638 | -webkit-border-radius: 4px;
2639 | -moz-border-radius: 4px;
2640 | border-radius: 4px;
2641 | }
2642 | .nav-tabs .dropdown-toggle .caret,
2643 | .nav-pills .dropdown-toggle .caret {
2644 | border-top-color: #0088cc;
2645 | border-bottom-color: #0088cc;
2646 | margin-top: 6px;
2647 | }
2648 | .nav-tabs .dropdown-toggle:hover .caret,
2649 | .nav-pills .dropdown-toggle:hover .caret {
2650 | border-top-color: #005580;
2651 | border-bottom-color: #005580;
2652 | }
2653 | .nav-tabs .active .dropdown-toggle .caret,
2654 | .nav-pills .active .dropdown-toggle .caret {
2655 | border-top-color: #333333;
2656 | border-bottom-color: #333333;
2657 | }
2658 | .nav > .dropdown.active > a:hover {
2659 | color: #000000;
2660 | cursor: pointer;
2661 | }
2662 | .nav-tabs .open .dropdown-toggle,
2663 | .nav-pills .open .dropdown-toggle,
2664 | .nav > .open.active > a:hover {
2665 | color: #ffffff;
2666 | background-color: #999999;
2667 | border-color: #999999;
2668 | }
2669 | .nav .open .caret,
2670 | .nav .open.active .caret,
2671 | .nav .open a:hover .caret {
2672 | border-top-color: #ffffff;
2673 | border-bottom-color: #ffffff;
2674 | opacity: 1;
2675 | filter: alpha(opacity=100);
2676 | }
2677 | .tabs-stacked .open > a:hover {
2678 | border-color: #999999;
2679 | }
2680 | .tabbable {
2681 | *zoom: 1;
2682 | }
2683 | .tabbable:before,
2684 | .tabbable:after {
2685 | display: table;
2686 | content: "";
2687 | }
2688 | .tabbable:after {
2689 | clear: both;
2690 | }
2691 | .tab-content {
2692 | display: table;
2693 | width: 100%;
2694 | }
2695 | .tabs-below .nav-tabs,
2696 | .tabs-right .nav-tabs,
2697 | .tabs-left .nav-tabs {
2698 | border-bottom: 0;
2699 | }
2700 | .tab-content > .tab-pane,
2701 | .pill-content > .pill-pane {
2702 | display: none;
2703 | }
2704 | .tab-content > .active,
2705 | .pill-content > .active {
2706 | display: block;
2707 | }
2708 | .tabs-below .nav-tabs {
2709 | border-top: 1px solid #ddd;
2710 | }
2711 | .tabs-below .nav-tabs > li {
2712 | margin-top: -1px;
2713 | margin-bottom: 0;
2714 | }
2715 | .tabs-below .nav-tabs > li > a {
2716 | -webkit-border-radius: 0 0 4px 4px;
2717 | -moz-border-radius: 0 0 4px 4px;
2718 | border-radius: 0 0 4px 4px;
2719 | }
2720 | .tabs-below .nav-tabs > li > a:hover {
2721 | border-bottom-color: transparent;
2722 | border-top-color: #ddd;
2723 | }
2724 | .tabs-below .nav-tabs .active > a,
2725 | .tabs-below .nav-tabs .active > a:hover {
2726 | border-color: transparent #ddd #ddd #ddd;
2727 | }
2728 | .tabs-left .nav-tabs > li,
2729 | .tabs-right .nav-tabs > li {
2730 | float: none;
2731 | }
2732 | .tabs-left .nav-tabs > li > a,
2733 | .tabs-right .nav-tabs > li > a {
2734 | min-width: 74px;
2735 | margin-right: 0;
2736 | margin-bottom: 3px;
2737 | }
2738 | .tabs-left .nav-tabs {
2739 | float: left;
2740 | margin-right: 19px;
2741 | border-right: 1px solid #ddd;
2742 | }
2743 | .tabs-left .nav-tabs > li > a {
2744 | margin-right: -1px;
2745 | -webkit-border-radius: 4px 0 0 4px;
2746 | -moz-border-radius: 4px 0 0 4px;
2747 | border-radius: 4px 0 0 4px;
2748 | }
2749 | .tabs-left .nav-tabs > li > a:hover {
2750 | border-color: #eeeeee #dddddd #eeeeee #eeeeee;
2751 | }
2752 | .tabs-left .nav-tabs .active > a,
2753 | .tabs-left .nav-tabs .active > a:hover {
2754 | border-color: #ddd transparent #ddd #ddd;
2755 | *border-right-color: #ffffff;
2756 | }
2757 | .tabs-right .nav-tabs {
2758 | float: right;
2759 | margin-left: 19px;
2760 | border-left: 1px solid #ddd;
2761 | }
2762 | .tabs-right .nav-tabs > li > a {
2763 | margin-left: -1px;
2764 | -webkit-border-radius: 0 4px 4px 0;
2765 | -moz-border-radius: 0 4px 4px 0;
2766 | border-radius: 0 4px 4px 0;
2767 | }
2768 | .tabs-right .nav-tabs > li > a:hover {
2769 | border-color: #eeeeee #eeeeee #eeeeee #dddddd;
2770 | }
2771 | .tabs-right .nav-tabs .active > a,
2772 | .tabs-right .nav-tabs .active > a:hover {
2773 | border-color: #ddd #ddd #ddd transparent;
2774 | *border-left-color: #ffffff;
2775 | }
2776 | .navbar {
2777 | *position: relative;
2778 | *z-index: 2;
2779 | overflow: visible;
2780 | margin-bottom: 18px;
2781 | }
2782 | .navbar-inner {
2783 | padding-left: 20px;
2784 | padding-right: 20px;
2785 | background-color: #2c2c2c;
2786 | background-image: -moz-linear-gradient(top, #333333, #222222);
2787 | background-image: -ms-linear-gradient(top, #333333, #222222);
2788 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));
2789 | background-image: -webkit-linear-gradient(top, #333333, #222222);
2790 | background-image: -o-linear-gradient(top, #333333, #222222);
2791 | background-image: linear-gradient(top, #333333, #222222);
2792 | background-repeat: repeat-x;
2793 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
2794 | -webkit-border-radius: 4px;
2795 | -moz-border-radius: 4px;
2796 | border-radius: 4px;
2797 | -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
2798 | -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
2799 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
2800 | }
2801 | .navbar .container {
2802 | width: auto;
2803 | }
2804 | .btn-navbar {
2805 | display: none;
2806 | float: right;
2807 | padding: 7px 10px;
2808 | margin-left: 5px;
2809 | margin-right: 5px;
2810 | background-color: #2c2c2c;
2811 | background-image: -moz-linear-gradient(top, #333333, #222222);
2812 | background-image: -ms-linear-gradient(top, #333333, #222222);
2813 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));
2814 | background-image: -webkit-linear-gradient(top, #333333, #222222);
2815 | background-image: -o-linear-gradient(top, #333333, #222222);
2816 | background-image: linear-gradient(top, #333333, #222222);
2817 | background-repeat: repeat-x;
2818 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
2819 | border-color: #222222 #222222 #000000;
2820 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2821 | filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2822 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
2823 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
2824 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
2825 | }
2826 | .btn-navbar:hover,
2827 | .btn-navbar:active,
2828 | .btn-navbar.active,
2829 | .btn-navbar.disabled,
2830 | .btn-navbar[disabled] {
2831 | background-color: #222222;
2832 | }
2833 | .btn-navbar:active,
2834 | .btn-navbar.active {
2835 | background-color: #080808 \9;
2836 | }
2837 | .btn-navbar .icon-bar {
2838 | display: block;
2839 | width: 18px;
2840 | height: 2px;
2841 | background-color: #f5f5f5;
2842 | -webkit-border-radius: 1px;
2843 | -moz-border-radius: 1px;
2844 | border-radius: 1px;
2845 | -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
2846 | -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
2847 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
2848 | }
2849 | .btn-navbar .icon-bar + .icon-bar {
2850 | margin-top: 3px;
2851 | }
2852 | .nav-collapse.collapse {
2853 | height: auto;
2854 | }
2855 | .navbar {
2856 | color: #999999;
2857 | }
2858 | .navbar .brand:hover {
2859 | text-decoration: none;
2860 | }
2861 | .navbar .brand {
2862 | float: left;
2863 | display: block;
2864 | padding: 8px 20px 12px;
2865 | margin-left: -20px;
2866 | font-size: 20px;
2867 | font-weight: 200;
2868 | line-height: 1;
2869 | color: #ffffff;
2870 | }
2871 | .navbar .navbar-text {
2872 | margin-bottom: 0;
2873 | line-height: 40px;
2874 | }
2875 | .navbar .btn,
2876 | .navbar .btn-group {
2877 | margin-top: 5px;
2878 | }
2879 | .navbar .btn-group .btn {
2880 | margin-top: 0;
2881 | }
2882 | .navbar-form {
2883 | margin-bottom: 0;
2884 | *zoom: 1;
2885 | }
2886 | .navbar-form:before,
2887 | .navbar-form:after {
2888 | display: table;
2889 | content: "";
2890 | }
2891 | .navbar-form:after {
2892 | clear: both;
2893 | }
2894 | .navbar-form input,
2895 | .navbar-form select,
2896 | .navbar-form .radio,
2897 | .navbar-form .checkbox {
2898 | margin-top: 5px;
2899 | }
2900 | .navbar-form input,
2901 | .navbar-form select {
2902 | display: inline-block;
2903 | margin-bottom: 0;
2904 | }
2905 | .navbar-form input[type="image"],
2906 | .navbar-form input[type="checkbox"],
2907 | .navbar-form input[type="radio"] {
2908 | margin-top: 3px;
2909 | }
2910 | .navbar-form .input-append,
2911 | .navbar-form .input-prepend {
2912 | margin-top: 6px;
2913 | white-space: nowrap;
2914 | }
2915 | .navbar-form .input-append input,
2916 | .navbar-form .input-prepend input {
2917 | margin-top: 0;
2918 | }
2919 | .navbar-search {
2920 | position: relative;
2921 | float: left;
2922 | margin-top: 6px;
2923 | margin-bottom: 0;
2924 | }
2925 | .navbar-search .search-query {
2926 | padding: 4px 9px;
2927 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
2928 | font-size: 13px;
2929 | font-weight: normal;
2930 | line-height: 1;
2931 | color: #ffffff;
2932 | background-color: #626262;
2933 | border: 1px solid #151515;
2934 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);
2935 | -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);
2936 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);
2937 | -webkit-transition: none;
2938 | -moz-transition: none;
2939 | -ms-transition: none;
2940 | -o-transition: none;
2941 | transition: none;
2942 | }
2943 | .navbar-search .search-query:-moz-placeholder {
2944 | color: #cccccc;
2945 | }
2946 | .navbar-search .search-query::-webkit-input-placeholder {
2947 | color: #cccccc;
2948 | }
2949 | .navbar-search .search-query:focus,
2950 | .navbar-search .search-query.focused {
2951 | padding: 5px 10px;
2952 | color: #333333;
2953 | text-shadow: 0 1px 0 #ffffff;
2954 | background-color: #ffffff;
2955 | border: 0;
2956 | -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
2957 | -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
2958 | box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
2959 | outline: 0;
2960 | }
2961 | .navbar-fixed-top,
2962 | .navbar-fixed-bottom {
2963 | position: fixed;
2964 | right: 0;
2965 | left: 0;
2966 | z-index: 1030;
2967 | margin-bottom: 0;
2968 | }
2969 | .navbar-fixed-top .navbar-inner,
2970 | .navbar-fixed-bottom .navbar-inner {
2971 | padding-left: 0;
2972 | padding-right: 0;
2973 | -webkit-border-radius: 0;
2974 | -moz-border-radius: 0;
2975 | border-radius: 0;
2976 | }
2977 | .navbar-fixed-top .container,
2978 | .navbar-fixed-bottom .container {
2979 | width: 940px;
2980 | }
2981 | .navbar-fixed-top {
2982 | top: 0;
2983 | }
2984 | .navbar-fixed-bottom {
2985 | bottom: 0;
2986 | }
2987 | .navbar .nav {
2988 | position: relative;
2989 | left: 0;
2990 | display: block;
2991 | float: left;
2992 | margin: 0 10px 0 0;
2993 | }
2994 | .navbar .nav.pull-right {
2995 | float: right;
2996 | }
2997 | .navbar .nav > li {
2998 | display: block;
2999 | float: left;
3000 | }
3001 | .navbar .nav > li > a {
3002 | float: none;
3003 | padding: 10px 10px 11px;
3004 | line-height: 19px;
3005 | color: #999999;
3006 | text-decoration: none;
3007 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
3008 | }
3009 | .navbar .nav > li > a:hover {
3010 | background-color: transparent;
3011 | color: #ffffff;
3012 | text-decoration: none;
3013 | }
3014 | .navbar .nav .active > a,
3015 | .navbar .nav .active > a:hover {
3016 | color: #ffffff;
3017 | text-decoration: none;
3018 | background-color: #222222;
3019 | }
3020 | .navbar .divider-vertical {
3021 | height: 40px;
3022 | width: 1px;
3023 | margin: 0 9px;
3024 | overflow: hidden;
3025 | background-color: #222222;
3026 | border-right: 1px solid #333333;
3027 | }
3028 | .navbar .nav.pull-right {
3029 | margin-left: 10px;
3030 | margin-right: 0;
3031 | }
3032 | .navbar .dropdown-menu {
3033 | margin-top: 1px;
3034 | -webkit-border-radius: 4px;
3035 | -moz-border-radius: 4px;
3036 | border-radius: 4px;
3037 | }
3038 | .navbar .dropdown-menu:before {
3039 | content: '';
3040 | display: inline-block;
3041 | border-left: 7px solid transparent;
3042 | border-right: 7px solid transparent;
3043 | border-bottom: 7px solid #ccc;
3044 | border-bottom-color: rgba(0, 0, 0, 0.2);
3045 | position: absolute;
3046 | top: -7px;
3047 | left: 9px;
3048 | }
3049 | .navbar .dropdown-menu:after {
3050 | content: '';
3051 | display: inline-block;
3052 | border-left: 6px solid transparent;
3053 | border-right: 6px solid transparent;
3054 | border-bottom: 6px solid #ffffff;
3055 | position: absolute;
3056 | top: -6px;
3057 | left: 10px;
3058 | }
3059 | .navbar-fixed-bottom .dropdown-menu:before {
3060 | border-top: 7px solid #ccc;
3061 | border-top-color: rgba(0, 0, 0, 0.2);
3062 | border-bottom: 0;
3063 | bottom: -7px;
3064 | top: auto;
3065 | }
3066 | .navbar-fixed-bottom .dropdown-menu:after {
3067 | border-top: 6px solid #ffffff;
3068 | border-bottom: 0;
3069 | bottom: -6px;
3070 | top: auto;
3071 | }
3072 | .navbar .nav .dropdown-toggle .caret,
3073 | .navbar .nav .open.dropdown .caret {
3074 | border-top-color: #ffffff;
3075 | border-bottom-color: #ffffff;
3076 | }
3077 | .navbar .nav .active .caret {
3078 | opacity: 1;
3079 | filter: alpha(opacity=100);
3080 | }
3081 | .navbar .nav .open > .dropdown-toggle,
3082 | .navbar .nav .active > .dropdown-toggle,
3083 | .navbar .nav .open.active > .dropdown-toggle {
3084 | background-color: transparent;
3085 | }
3086 | .navbar .nav .active > .dropdown-toggle:hover {
3087 | color: #ffffff;
3088 | }
3089 | .navbar .nav.pull-right .dropdown-menu,
3090 | .navbar .nav .dropdown-menu.pull-right {
3091 | left: auto;
3092 | right: 0;
3093 | }
3094 | .navbar .nav.pull-right .dropdown-menu:before,
3095 | .navbar .nav .dropdown-menu.pull-right:before {
3096 | left: auto;
3097 | right: 12px;
3098 | }
3099 | .navbar .nav.pull-right .dropdown-menu:after,
3100 | .navbar .nav .dropdown-menu.pull-right:after {
3101 | left: auto;
3102 | right: 13px;
3103 | }
3104 | .breadcrumb {
3105 | padding: 7px 14px;
3106 | margin: 0 0 18px;
3107 | list-style: none;
3108 | background-color: #fbfbfb;
3109 | background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
3110 | background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
3111 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));
3112 | background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
3113 | background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
3114 | background-image: linear-gradient(top, #ffffff, #f5f5f5);
3115 | background-repeat: repeat-x;
3116 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);
3117 | border: 1px solid #ddd;
3118 | -webkit-border-radius: 3px;
3119 | -moz-border-radius: 3px;
3120 | border-radius: 3px;
3121 | -webkit-box-shadow: inset 0 1px 0 #ffffff;
3122 | -moz-box-shadow: inset 0 1px 0 #ffffff;
3123 | box-shadow: inset 0 1px 0 #ffffff;
3124 | }
3125 | .breadcrumb li {
3126 | display: inline-block;
3127 | *display: inline;
3128 | /* IE7 inline-block hack */
3129 |
3130 | *zoom: 1;
3131 | text-shadow: 0 1px 0 #ffffff;
3132 | }
3133 | .breadcrumb .divider {
3134 | padding: 0 5px;
3135 | color: #999999;
3136 | }
3137 | .breadcrumb .active a {
3138 | color: #333333;
3139 | }
3140 | .pagination {
3141 | height: 36px;
3142 | margin: 18px 0;
3143 | }
3144 | .pagination ul {
3145 | display: inline-block;
3146 | *display: inline;
3147 | /* IE7 inline-block hack */
3148 |
3149 | *zoom: 1;
3150 | margin-left: 0;
3151 | margin-bottom: 0;
3152 | -webkit-border-radius: 3px;
3153 | -moz-border-radius: 3px;
3154 | border-radius: 3px;
3155 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
3156 | -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
3157 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
3158 | }
3159 | .pagination li {
3160 | display: inline;
3161 | }
3162 | .pagination a {
3163 | float: left;
3164 | padding: 0 14px;
3165 | line-height: 34px;
3166 | text-decoration: none;
3167 | border: 1px solid #ddd;
3168 | border-left-width: 0;
3169 | }
3170 | .pagination a:hover,
3171 | .pagination .active a {
3172 | background-color: #f5f5f5;
3173 | }
3174 | .pagination .active a {
3175 | color: #999999;
3176 | cursor: default;
3177 | }
3178 | .pagination .disabled span,
3179 | .pagination .disabled a,
3180 | .pagination .disabled a:hover {
3181 | color: #999999;
3182 | background-color: transparent;
3183 | cursor: default;
3184 | }
3185 | .pagination li:first-child a {
3186 | border-left-width: 1px;
3187 | -webkit-border-radius: 3px 0 0 3px;
3188 | -moz-border-radius: 3px 0 0 3px;
3189 | border-radius: 3px 0 0 3px;
3190 | }
3191 | .pagination li:last-child a {
3192 | -webkit-border-radius: 0 3px 3px 0;
3193 | -moz-border-radius: 0 3px 3px 0;
3194 | border-radius: 0 3px 3px 0;
3195 | }
3196 | .pagination-centered {
3197 | text-align: center;
3198 | }
3199 | .pagination-right {
3200 | text-align: right;
3201 | }
3202 | .pager {
3203 | margin-left: 0;
3204 | margin-bottom: 18px;
3205 | list-style: none;
3206 | text-align: center;
3207 | *zoom: 1;
3208 | }
3209 | .pager:before,
3210 | .pager:after {
3211 | display: table;
3212 | content: "";
3213 | }
3214 | .pager:after {
3215 | clear: both;
3216 | }
3217 | .pager li {
3218 | display: inline;
3219 | }
3220 | .pager a {
3221 | display: inline-block;
3222 | padding: 5px 14px;
3223 | background-color: #fff;
3224 | border: 1px solid #ddd;
3225 | -webkit-border-radius: 15px;
3226 | -moz-border-radius: 15px;
3227 | border-radius: 15px;
3228 | }
3229 | .pager a:hover {
3230 | text-decoration: none;
3231 | background-color: #f5f5f5;
3232 | }
3233 | .pager .next a {
3234 | float: right;
3235 | }
3236 | .pager .previous a {
3237 | float: left;
3238 | }
3239 | .pager .disabled a,
3240 | .pager .disabled a:hover {
3241 | color: #999999;
3242 | background-color: #fff;
3243 | cursor: default;
3244 | }
3245 | .modal-open .dropdown-menu {
3246 | z-index: 2050;
3247 | }
3248 | .modal-open .dropdown.open {
3249 | *z-index: 2050;
3250 | }
3251 | .modal-open .popover {
3252 | z-index: 2060;
3253 | }
3254 | .modal-open .tooltip {
3255 | z-index: 2070;
3256 | }
3257 | .modal-backdrop {
3258 | position: fixed;
3259 | top: 0;
3260 | right: 0;
3261 | bottom: 0;
3262 | left: 0;
3263 | z-index: 1040;
3264 | background-color: #000000;
3265 | }
3266 | .modal-backdrop.fade {
3267 | opacity: 0;
3268 | }
3269 | .modal-backdrop,
3270 | .modal-backdrop.fade.in {
3271 | opacity: 0.8;
3272 | filter: alpha(opacity=80);
3273 | }
3274 | .modal {
3275 | position: fixed;
3276 | top: 50%;
3277 | left: 50%;
3278 | z-index: 1050;
3279 | overflow: auto;
3280 | width: 560px;
3281 | margin: -250px 0 0 -280px;
3282 | background-color: #ffffff;
3283 | border: 1px solid #999;
3284 | border: 1px solid rgba(0, 0, 0, 0.3);
3285 | *border: 1px solid #999;
3286 | /* IE6-7 */
3287 |
3288 | -webkit-border-radius: 6px;
3289 | -moz-border-radius: 6px;
3290 | border-radius: 6px;
3291 | -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
3292 | -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
3293 | box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
3294 | -webkit-background-clip: padding-box;
3295 | -moz-background-clip: padding-box;
3296 | background-clip: padding-box;
3297 | }
3298 | .modal.fade {
3299 | -webkit-transition: opacity .3s linear, top .3s ease-out;
3300 | -moz-transition: opacity .3s linear, top .3s ease-out;
3301 | -ms-transition: opacity .3s linear, top .3s ease-out;
3302 | -o-transition: opacity .3s linear, top .3s ease-out;
3303 | transition: opacity .3s linear, top .3s ease-out;
3304 | top: -25%;
3305 | }
3306 | .modal.fade.in {
3307 | top: 50%;
3308 | }
3309 | .modal-header {
3310 | padding: 9px 15px;
3311 | border-bottom: 1px solid #eee;
3312 | }
3313 | .modal-header .close {
3314 | margin-top: 2px;
3315 | }
3316 | .modal-body {
3317 | overflow-y: auto;
3318 | max-height: 400px;
3319 | padding: 15px;
3320 | }
3321 | .modal-form {
3322 | margin-bottom: 0;
3323 | }
3324 | .modal-footer {
3325 | padding: 14px 15px 15px;
3326 | margin-bottom: 0;
3327 | text-align: right;
3328 | background-color: #f5f5f5;
3329 | border-top: 1px solid #ddd;
3330 | -webkit-border-radius: 0 0 6px 6px;
3331 | -moz-border-radius: 0 0 6px 6px;
3332 | border-radius: 0 0 6px 6px;
3333 | -webkit-box-shadow: inset 0 1px 0 #ffffff;
3334 | -moz-box-shadow: inset 0 1px 0 #ffffff;
3335 | box-shadow: inset 0 1px 0 #ffffff;
3336 | *zoom: 1;
3337 | }
3338 | .modal-footer:before,
3339 | .modal-footer:after {
3340 | display: table;
3341 | content: "";
3342 | }
3343 | .modal-footer:after {
3344 | clear: both;
3345 | }
3346 | .modal-footer .btn + .btn {
3347 | margin-left: 5px;
3348 | margin-bottom: 0;
3349 | }
3350 | .modal-footer .btn-group .btn + .btn {
3351 | margin-left: -1px;
3352 | }
3353 | .tooltip {
3354 | position: absolute;
3355 | z-index: 1020;
3356 | display: block;
3357 | visibility: visible;
3358 | padding: 5px;
3359 | font-size: 11px;
3360 | opacity: 0;
3361 | filter: alpha(opacity=0);
3362 | }
3363 | .tooltip.in {
3364 | opacity: 0.8;
3365 | filter: alpha(opacity=80);
3366 | }
3367 | .tooltip.top {
3368 | margin-top: -2px;
3369 | }
3370 | .tooltip.right {
3371 | margin-left: 2px;
3372 | }
3373 | .tooltip.bottom {
3374 | margin-top: 2px;
3375 | }
3376 | .tooltip.left {
3377 | margin-left: -2px;
3378 | }
3379 | .tooltip.top .tooltip-arrow {
3380 | bottom: 0;
3381 | left: 50%;
3382 | margin-left: -5px;
3383 | border-left: 5px solid transparent;
3384 | border-right: 5px solid transparent;
3385 | border-top: 5px solid #000000;
3386 | }
3387 | .tooltip.left .tooltip-arrow {
3388 | top: 50%;
3389 | right: 0;
3390 | margin-top: -5px;
3391 | border-top: 5px solid transparent;
3392 | border-bottom: 5px solid transparent;
3393 | border-left: 5px solid #000000;
3394 | }
3395 | .tooltip.bottom .tooltip-arrow {
3396 | top: 0;
3397 | left: 50%;
3398 | margin-left: -5px;
3399 | border-left: 5px solid transparent;
3400 | border-right: 5px solid transparent;
3401 | border-bottom: 5px solid #000000;
3402 | }
3403 | .tooltip.right .tooltip-arrow {
3404 | top: 50%;
3405 | left: 0;
3406 | margin-top: -5px;
3407 | border-top: 5px solid transparent;
3408 | border-bottom: 5px solid transparent;
3409 | border-right: 5px solid #000000;
3410 | }
3411 | .tooltip-inner {
3412 | max-width: 200px;
3413 | padding: 3px 8px;
3414 | color: #ffffff;
3415 | text-align: center;
3416 | text-decoration: none;
3417 | background-color: #000000;
3418 | -webkit-border-radius: 4px;
3419 | -moz-border-radius: 4px;
3420 | border-radius: 4px;
3421 | }
3422 | .tooltip-arrow {
3423 | position: absolute;
3424 | width: 0;
3425 | height: 0;
3426 | }
3427 | .popover {
3428 | position: absolute;
3429 | top: 0;
3430 | left: 0;
3431 | z-index: 1010;
3432 | display: none;
3433 | padding: 5px;
3434 | }
3435 | .popover.top {
3436 | margin-top: -5px;
3437 | }
3438 | .popover.right {
3439 | margin-left: 5px;
3440 | }
3441 | .popover.bottom {
3442 | margin-top: 5px;
3443 | }
3444 | .popover.left {
3445 | margin-left: -5px;
3446 | }
3447 | .popover.top .arrow {
3448 | bottom: 0;
3449 | left: 50%;
3450 | margin-left: -5px;
3451 | border-left: 5px solid transparent;
3452 | border-right: 5px solid transparent;
3453 | border-top: 5px solid #000000;
3454 | }
3455 | .popover.right .arrow {
3456 | top: 50%;
3457 | left: 0;
3458 | margin-top: -5px;
3459 | border-top: 5px solid transparent;
3460 | border-bottom: 5px solid transparent;
3461 | border-right: 5px solid #000000;
3462 | }
3463 | .popover.bottom .arrow {
3464 | top: 0;
3465 | left: 50%;
3466 | margin-left: -5px;
3467 | border-left: 5px solid transparent;
3468 | border-right: 5px solid transparent;
3469 | border-bottom: 5px solid #000000;
3470 | }
3471 | .popover.left .arrow {
3472 | top: 50%;
3473 | right: 0;
3474 | margin-top: -5px;
3475 | border-top: 5px solid transparent;
3476 | border-bottom: 5px solid transparent;
3477 | border-left: 5px solid #000000;
3478 | }
3479 | .popover .arrow {
3480 | position: absolute;
3481 | width: 0;
3482 | height: 0;
3483 | }
3484 | .popover-inner {
3485 | padding: 3px;
3486 | width: 280px;
3487 | overflow: hidden;
3488 | background: #000000;
3489 | background: rgba(0, 0, 0, 0.8);
3490 | -webkit-border-radius: 6px;
3491 | -moz-border-radius: 6px;
3492 | border-radius: 6px;
3493 | -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
3494 | -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
3495 | box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
3496 | }
3497 | .popover-title {
3498 | padding: 9px 15px;
3499 | line-height: 1;
3500 | background-color: #f5f5f5;
3501 | border-bottom: 1px solid #eee;
3502 | -webkit-border-radius: 3px 3px 0 0;
3503 | -moz-border-radius: 3px 3px 0 0;
3504 | border-radius: 3px 3px 0 0;
3505 | }
3506 | .popover-content {
3507 | padding: 14px;
3508 | background-color: #ffffff;
3509 | -webkit-border-radius: 0 0 3px 3px;
3510 | -moz-border-radius: 0 0 3px 3px;
3511 | border-radius: 0 0 3px 3px;
3512 | -webkit-background-clip: padding-box;
3513 | -moz-background-clip: padding-box;
3514 | background-clip: padding-box;
3515 | }
3516 | .popover-content p,
3517 | .popover-content ul,
3518 | .popover-content ol {
3519 | margin-bottom: 0;
3520 | }
3521 | .thumbnails {
3522 | margin-left: -20px;
3523 | list-style: none;
3524 | *zoom: 1;
3525 | }
3526 | .thumbnails:before,
3527 | .thumbnails:after {
3528 | display: table;
3529 | content: "";
3530 | }
3531 | .thumbnails:after {
3532 | clear: both;
3533 | }
3534 | .thumbnails > li {
3535 | float: left;
3536 | margin: 0 0 18px 20px;
3537 | }
3538 | .thumbnail {
3539 | display: block;
3540 | padding: 4px;
3541 | line-height: 1;
3542 | border: 1px solid #ddd;
3543 | -webkit-border-radius: 4px;
3544 | -moz-border-radius: 4px;
3545 | border-radius: 4px;
3546 | -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
3547 | -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
3548 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
3549 | }
3550 | a.thumbnail:hover {
3551 | border-color: #0088cc;
3552 | -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
3553 | -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
3554 | box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
3555 | }
3556 | .thumbnail > img {
3557 | display: block;
3558 | max-width: 100%;
3559 | margin-left: auto;
3560 | margin-right: auto;
3561 | }
3562 | .thumbnail .caption {
3563 | padding: 9px;
3564 | }
3565 | .label {
3566 | padding: 1px 4px 2px;
3567 | font-size: 10.998px;
3568 | font-weight: bold;
3569 | line-height: 13px;
3570 | color: #ffffff;
3571 | vertical-align: middle;
3572 | white-space: nowrap;
3573 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
3574 | background-color: #999999;
3575 | -webkit-border-radius: 3px;
3576 | -moz-border-radius: 3px;
3577 | border-radius: 3px;
3578 | }
3579 | .label:hover {
3580 | color: #ffffff;
3581 | text-decoration: none;
3582 | }
3583 | .label-important {
3584 | background-color: #b94a48;
3585 | }
3586 | .label-important:hover {
3587 | background-color: #953b39;
3588 | }
3589 | .label-warning {
3590 | background-color: #f89406;
3591 | }
3592 | .label-warning:hover {
3593 | background-color: #c67605;
3594 | }
3595 | .label-success {
3596 | background-color: #468847;
3597 | }
3598 | .label-success:hover {
3599 | background-color: #356635;
3600 | }
3601 | .label-info {
3602 | background-color: #3a87ad;
3603 | }
3604 | .label-info:hover {
3605 | background-color: #2d6987;
3606 | }
3607 | .label-inverse {
3608 | background-color: #333333;
3609 | }
3610 | .label-inverse:hover {
3611 | background-color: #1a1a1a;
3612 | }
3613 | .badge {
3614 | padding: 1px 9px 2px;
3615 | font-size: 12.025px;
3616 | font-weight: bold;
3617 | white-space: nowrap;
3618 | color: #ffffff;
3619 | background-color: #999999;
3620 | -webkit-border-radius: 9px;
3621 | -moz-border-radius: 9px;
3622 | border-radius: 9px;
3623 | }
3624 | .badge:hover {
3625 | color: #ffffff;
3626 | text-decoration: none;
3627 | cursor: pointer;
3628 | }
3629 | .badge-error {
3630 | background-color: #b94a48;
3631 | }
3632 | .badge-error:hover {
3633 | background-color: #953b39;
3634 | }
3635 | .badge-warning {
3636 | background-color: #f89406;
3637 | }
3638 | .badge-warning:hover {
3639 | background-color: #c67605;
3640 | }
3641 | .badge-success {
3642 | background-color: #468847;
3643 | }
3644 | .badge-success:hover {
3645 | background-color: #356635;
3646 | }
3647 | .badge-info {
3648 | background-color: #3a87ad;
3649 | }
3650 | .badge-info:hover {
3651 | background-color: #2d6987;
3652 | }
3653 | .badge-inverse {
3654 | background-color: #333333;
3655 | }
3656 | .badge-inverse:hover {
3657 | background-color: #1a1a1a;
3658 | }
3659 | @-webkit-keyframes progress-bar-stripes {
3660 | from {
3661 | background-position: 0 0;
3662 | }
3663 | to {
3664 | background-position: 40px 0;
3665 | }
3666 | }
3667 | @-moz-keyframes progress-bar-stripes {
3668 | from {
3669 | background-position: 0 0;
3670 | }
3671 | to {
3672 | background-position: 40px 0;
3673 | }
3674 | }
3675 | @-ms-keyframes progress-bar-stripes {
3676 | from {
3677 | background-position: 0 0;
3678 | }
3679 | to {
3680 | background-position: 40px 0;
3681 | }
3682 | }
3683 | @keyframes progress-bar-stripes {
3684 | from {
3685 | background-position: 0 0;
3686 | }
3687 | to {
3688 | background-position: 40px 0;
3689 | }
3690 | }
3691 | .progress {
3692 | overflow: hidden;
3693 | height: 18px;
3694 | margin-bottom: 18px;
3695 | background-color: #f7f7f7;
3696 | background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
3697 | background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9);
3698 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
3699 | background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
3700 | background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
3701 | background-image: linear-gradient(top, #f5f5f5, #f9f9f9);
3702 | background-repeat: repeat-x;
3703 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);
3704 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
3705 | -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
3706 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
3707 | -webkit-border-radius: 4px;
3708 | -moz-border-radius: 4px;
3709 | border-radius: 4px;
3710 | }
3711 | .progress .bar {
3712 | width: 0%;
3713 | height: 18px;
3714 | color: #ffffff;
3715 | font-size: 12px;
3716 | text-align: center;
3717 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
3718 | background-color: #0e90d2;
3719 | background-image: -moz-linear-gradient(top, #149bdf, #0480be);
3720 | background-image: -ms-linear-gradient(top, #149bdf, #0480be);
3721 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
3722 | background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
3723 | background-image: -o-linear-gradient(top, #149bdf, #0480be);
3724 | background-image: linear-gradient(top, #149bdf, #0480be);
3725 | background-repeat: repeat-x;
3726 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);
3727 | -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
3728 | -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
3729 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
3730 | -webkit-box-sizing: border-box;
3731 | -moz-box-sizing: border-box;
3732 | -ms-box-sizing: border-box;
3733 | box-sizing: border-box;
3734 | -webkit-transition: width 0.6s ease;
3735 | -moz-transition: width 0.6s ease;
3736 | -ms-transition: width 0.6s ease;
3737 | -o-transition: width 0.6s ease;
3738 | transition: width 0.6s ease;
3739 | }
3740 | .progress-striped .bar {
3741 | background-color: #149bdf;
3742 | background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
3743 | background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3744 | background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3745 | background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3746 | background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3747 | background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3748 | -webkit-background-size: 40px 40px;
3749 | -moz-background-size: 40px 40px;
3750 | -o-background-size: 40px 40px;
3751 | background-size: 40px 40px;
3752 | }
3753 | .progress.active .bar {
3754 | -webkit-animation: progress-bar-stripes 2s linear infinite;
3755 | -moz-animation: progress-bar-stripes 2s linear infinite;
3756 | animation: progress-bar-stripes 2s linear infinite;
3757 | }
3758 | .progress-danger .bar {
3759 | background-color: #dd514c;
3760 | background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3761 | background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3762 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
3763 | background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3764 | background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3765 | background-image: linear-gradient(top, #ee5f5b, #c43c35);
3766 | background-repeat: repeat-x;
3767 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3768 | }
3769 | .progress-danger.progress-striped .bar {
3770 | background-color: #ee5f5b;
3771 | background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
3772 | background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3773 | background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3774 | background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3775 | background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3776 | background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3777 | }
3778 | .progress-success .bar {
3779 | background-color: #5eb95e;
3780 | background-image: -moz-linear-gradient(top, #62c462, #57a957);
3781 | background-image: -ms-linear-gradient(top, #62c462, #57a957);
3782 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
3783 | background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3784 | background-image: -o-linear-gradient(top, #62c462, #57a957);
3785 | background-image: linear-gradient(top, #62c462, #57a957);
3786 | background-repeat: repeat-x;
3787 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3788 | }
3789 | .progress-success.progress-striped .bar {
3790 | background-color: #62c462;
3791 | background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
3792 | background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3793 | background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3794 | background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3795 | background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3796 | background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3797 | }
3798 | .progress-info .bar {
3799 | background-color: #4bb1cf;
3800 | background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3801 | background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3802 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
3803 | background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3804 | background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3805 | background-image: linear-gradient(top, #5bc0de, #339bb9);
3806 | background-repeat: repeat-x;
3807 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3808 | }
3809 | .progress-info.progress-striped .bar {
3810 | background-color: #5bc0de;
3811 | background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
3812 | background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3813 | background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3814 | background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3815 | background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3816 | background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3817 | }
3818 | .progress-warning .bar {
3819 | background-color: #faa732;
3820 | background-image: -moz-linear-gradient(top, #fbb450, #f89406);
3821 | background-image: -ms-linear-gradient(top, #fbb450, #f89406);
3822 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
3823 | background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
3824 | background-image: -o-linear-gradient(top, #fbb450, #f89406);
3825 | background-image: linear-gradient(top, #fbb450, #f89406);
3826 | background-repeat: repeat-x;
3827 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
3828 | }
3829 | .progress-warning.progress-striped .bar {
3830 | background-color: #fbb450;
3831 | background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
3832 | background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3833 | background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3834 | background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3835 | background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3836 | background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
3837 | }
3838 | .accordion {
3839 | margin-bottom: 18px;
3840 | }
3841 | .accordion-group {
3842 | margin-bottom: 2px;
3843 | border: 1px solid #e5e5e5;
3844 | -webkit-border-radius: 4px;
3845 | -moz-border-radius: 4px;
3846 | border-radius: 4px;
3847 | }
3848 | .accordion-heading {
3849 | border-bottom: 0;
3850 | }
3851 | .accordion-heading .accordion-toggle {
3852 | display: block;
3853 | padding: 8px 15px;
3854 | }
3855 | .accordion-inner {
3856 | padding: 9px 15px;
3857 | border-top: 1px solid #e5e5e5;
3858 | }
3859 | .carousel {
3860 | position: relative;
3861 | margin-bottom: 18px;
3862 | line-height: 1;
3863 | }
3864 | .carousel-inner {
3865 | overflow: hidden;
3866 | width: 100%;
3867 | position: relative;
3868 | }
3869 | .carousel .item {
3870 | display: none;
3871 | position: relative;
3872 | -webkit-transition: 0.6s ease-in-out left;
3873 | -moz-transition: 0.6s ease-in-out left;
3874 | -ms-transition: 0.6s ease-in-out left;
3875 | -o-transition: 0.6s ease-in-out left;
3876 | transition: 0.6s ease-in-out left;
3877 | }
3878 | .carousel .item > img {
3879 | display: block;
3880 | line-height: 1;
3881 | }
3882 | .carousel .active,
3883 | .carousel .next,
3884 | .carousel .prev {
3885 | display: block;
3886 | }
3887 | .carousel .active {
3888 | left: 0;
3889 | }
3890 | .carousel .next,
3891 | .carousel .prev {
3892 | position: absolute;
3893 | top: 0;
3894 | width: 100%;
3895 | }
3896 | .carousel .next {
3897 | left: 100%;
3898 | }
3899 | .carousel .prev {
3900 | left: -100%;
3901 | }
3902 | .carousel .next.left,
3903 | .carousel .prev.right {
3904 | left: 0;
3905 | }
3906 | .carousel .active.left {
3907 | left: -100%;
3908 | }
3909 | .carousel .active.right {
3910 | left: 100%;
3911 | }
3912 | .carousel-control {
3913 | position: absolute;
3914 | top: 40%;
3915 | left: 15px;
3916 | width: 40px;
3917 | height: 40px;
3918 | margin-top: -20px;
3919 | font-size: 60px;
3920 | font-weight: 100;
3921 | line-height: 30px;
3922 | color: #ffffff;
3923 | text-align: center;
3924 | background: #222222;
3925 | border: 3px solid #ffffff;
3926 | -webkit-border-radius: 23px;
3927 | -moz-border-radius: 23px;
3928 | border-radius: 23px;
3929 | opacity: 0.5;
3930 | filter: alpha(opacity=50);
3931 | }
3932 | .carousel-control.right {
3933 | left: auto;
3934 | right: 15px;
3935 | }
3936 | .carousel-control:hover {
3937 | color: #ffffff;
3938 | text-decoration: none;
3939 | opacity: 0.9;
3940 | filter: alpha(opacity=90);
3941 | }
3942 | .carousel-caption {
3943 | position: absolute;
3944 | left: 0;
3945 | right: 0;
3946 | bottom: 0;
3947 | padding: 10px 15px 5px;
3948 | background: #333333;
3949 | background: rgba(0, 0, 0, 0.75);
3950 | }
3951 | .carousel-caption h4,
3952 | .carousel-caption p {
3953 | color: #ffffff;
3954 | }
3955 | .hero-unit {
3956 | padding: 60px;
3957 | margin-bottom: 30px;
3958 | background-color: #eeeeee;
3959 | -webkit-border-radius: 6px;
3960 | -moz-border-radius: 6px;
3961 | border-radius: 6px;
3962 | }
3963 | .hero-unit h1 {
3964 | margin-bottom: 0;
3965 | font-size: 60px;
3966 | line-height: 1;
3967 | color: inherit;
3968 | letter-spacing: -1px;
3969 | }
3970 | .hero-unit p {
3971 | font-size: 18px;
3972 | font-weight: 200;
3973 | line-height: 27px;
3974 | color: inherit;
3975 | }
3976 | .pull-right {
3977 | float: right;
3978 | }
3979 | .pull-left {
3980 | float: left;
3981 | }
3982 | .hide {
3983 | display: none;
3984 | }
3985 | .show {
3986 | display: block;
3987 | }
3988 | .invisible {
3989 | visibility: hidden;
3990 | }
3991 |
--------------------------------------------------------------------------------