├── 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 | '

' + escapeInnerText( document.title ) + '

' + 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 += ''; 658 | if (actual != expected) { 659 | output += ''; 660 | output += ''; 661 | } 662 | var source = sourceFromStacktrace(); 663 | if (source) { 664 | details.source = source; 665 | output += ''; 666 | } 667 | output += "
    Expected:
    ' + expected + '
    Result:
    ' + actual + '
    Diff:
    ' + QUnit.diff(expected, actual) +'
    Source:
    ' + escapeInnerText(source) + '
    "; 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 | --------------------------------------------------------------------------------