diff --git a/.afignore b/.afignore deleted file mode 100644 index 08499c2b0a..0000000000 --- a/.afignore +++ /dev/null @@ -1,5 +0,0 @@ -.DS_Store -public/gen/ -#lib/ -*.swp -.idea/ diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 0000000000..9c9ea40600 --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "public/bower_components" +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 01f730f678..a7d8e7d2e6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,16 @@ .DS_Store public/gen node_modules -#lib/ *.swp .idea* config.json -npm-debug.log \ No newline at end of file +npm-debug.log +lib +public/bower_components +build + +src/*/*.map +src/*/*/*.map +test/*.js +test/*.map +public/docs diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 7bcfb78bfc..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,9 +0,0 @@ -[submodule "public/vendor/github-buttons"] - path = public/vendor/github-buttons - url = https://github.com/mdo/github-buttons.git -[submodule "public/vendor/BrowserQuest"] - path = public/vendor/BrowserQuest - url = https://github.com/mozilla/BrowserQuest.git -[submodule "public/vendor/bootstrap-tour"] - path = public/vendor/bootstrap-tour - url = git://github.com/sorich87/bootstrap-tour.git diff --git a/.nodemonignore b/.nodemonignore new file mode 100644 index 0000000000..19c17340c6 --- /dev/null +++ b/.nodemonignore @@ -0,0 +1,5 @@ +public/* +views/* +build +build/* +Gruntfile.js \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..9f977e2505 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: + - '0.10' +before_script: + - 'npm install -g bower grunt-cli' + - 'bower install' + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start diff --git a/DOCS-README.md b/DOCS-README.md new file mode 100644 index 0000000000..e21c420b16 --- /dev/null +++ b/DOCS-README.md @@ -0,0 +1,77 @@ +# HabitRPG Docs Project + +Generated documentation for all of HabitRPG's source files will be kept in the folder and subfolders. If you would like to use the existing documentation, or contribute to the documentation efforts, read on. + +## Viewing Docs + +You're looking at it! + +Unless you are viewing this file directly from GitHub, you should see a list of files and folders to the left of this readme. + +If you are working locally, you can goto `localhost:3000/docs/` and view the Docs. + +All documentation is generated from comments in the code, into HTML files in the `public/docs/` folder. After you have cloned the HabitRPG repo locally, and done all the `npm install` goodness, the Docs should generate automagickly when you run `grunt run:dev` + +## What I do now? + +Well if you know Markdown, simply add detailed comments in the code using Markdown syntax. + +```` +/* +User.js +======= + +Defines the user data model (schema) for use via the API. +*/ + +// Dependencies +// ------------ +var mongoose = require("mongoose"); +var Schema = mongoose.Schema; +var helpers = require('habitrpg-shared/script/helpers'); +var _ = require('lodash');.... +```` + +As you can see, you can use both multiline style comments `/* fancy stuff */` and inline comments `// Ooooh my`. + +The exception being end of line comments +`text: String, // example: Wolf ` + +The above will not be on the "pretty print" side of the Docs, but will stay in the code. An example use case for end of line comments would be for FIXME notes. + +Add anything that would be helpful to a developer regarding how to use the functions, variables, and objects associated with HabitRPG. + +**All documentation should be committed as pull request to the `docs-project` branch of HabitRPG.** Since we are adding comments directly to the code, I don't want to be editing files used for beta or master. We can merge in the docs after we're sure we didn't break anything. + +### jsDoc Syntax + +Yes, the generator also supports jsDoc-style comments such as +```` +@param {Array} files Array of file paths relative to the `inDir` to generate documentation for. +```` + +**Important Note:** If you use the `@param` syntax, you must use multiline comment blocks (ie `/* stuff */`), otherwise they won't be parsed like parameters. + +This may or may not be useful for HabitRPG. Example use cases: +- Documenting the API +- Javascript Models + +## Okay, I added great comments. Now what? + +If you're running locally, just re-run `grunt run:dev`. Any changed docs will be automagickly updated. + +Once you're satisfied with the output, push your changes to your fork of HabitRPG and issue a Pull Request on the `docs-project` branch. + +It's that easy! + +## Tech Info + +The generator we are using is [Docker](https://github.com/jbt/docker), which is a fork of [Docco](http://jashkenas.github.io/docco/). Docker supports the same wide-range of filetypes, including being able to generate documentation for a whole project, including an index. + +We also use the [Grunt-Docker](https://github.com/Prevole/grunt-docker) node module for automatic processing. + +## Road Map + +- Customize CSS with HabitRPG specific Styling +- Explore possibilities of importing Wiki content +- Specify style guide for consistency of comments \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000000..c1bf9a461a --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,123 @@ +/*global module:false*/ +var _ = require('lodash'); +module.exports = function(grunt) { + + // Project configuration. + grunt.initConfig({ + + karma: { + unit: { + configFile: 'karma.conf.js' + }, + continuous: { + configFile: 'karma.conf.js', + singleRun: true, + autoWatch: false + } + }, + + clean: { + build: ['build'] + }, + + stylus: { + build: { + options: { + compress: false, // AFTER + 'include css': true, + paths: ['public'] + }, + files: { + 'build/app.css': ['public/css/index.styl'], + 'build/static.css': ['public/css/static.styl'] + } + } + }, + + copy: { + build: { + files: [{expand: true, cwd: 'public/', src: 'favicon.ico', dest: 'build/'}] + } + }, + + // UPDATE IT WHEN YOU ADD SOME FILES NOT ALREADY MATCHED! + hashres: { + build: { + options: { + fileNameFormat: '${name}-${hash}.${ext}' + }, + src: [ + 'build/*.js', 'build/*.css', 'build/favicon.ico', + 'build/bower_components/bootstrap/docs/assets/css/*.css', + 'build/bower_components/habitrpg-shared/dist/*.css' + ], + dest: 'make-sure-i-do-not-exist' + } + }, + + nodemon: { + dev: { + ignoredFiles: ['public/*', 'Gruntfile.js', 'views/*', 'build/*'] + } + }, + + watch: { + dev: { + files: ['public/**/*.styl'], // 'public/**/*.js' Not needed because not in production + tasks: [ 'build:dev' ], + options: { + nospawn: true + } + } + }, + + concurrent: { + dev: ['nodemon', 'watch'], + options: { + logConcurrentOutput: true + } + } + + }); + + //Load build files from public/manifest.json + grunt.registerTask('loadManifestFiles', 'Load all build files from public/manifest.json', function(){ + var files = grunt.file.readJSON('./public/manifest.json'); + var uglify = {}; + var cssmin = {}; + _.each(files, function(val, key){ + var js = uglify['build/' + key + '.js'] = []; + _.each(files[key]['js'], function(val){ + js.push('public/' + val); + }); + _.each(files[key]['css'], function(val){ + if(val == 'app.css' || val == 'static.css'){ + cssmin['build/' + val] = ['build/' + val] + }else{ + cssmin['build/' + val] = ['public/' + val] + } + }); + }); + grunt.config.set('uglify.build.files', uglify); + grunt.config.set('cssmin.build.files', cssmin); + }); + + // Register tasks. + grunt.registerTask('build:prod', ['loadManifestFiles', 'clean:build', 'uglify', 'stylus', 'cssmin', 'copy:build', 'hashres']); + grunt.registerTask('build:dev', ['loadManifestFiles', 'clean:build', 'stylus', 'cssmin', 'copy:build']); + + grunt.registerTask('run:dev', [ 'build:dev', 'concurrent' ]); + + // Load tasks + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-stylus'); + grunt.loadNpmTasks('grunt-contrib-cssmin'); + grunt.loadNpmTasks('grunt-contrib-copy'); + grunt.loadNpmTasks('grunt-nodemon'); + grunt.loadNpmTasks('grunt-concurrent'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-hashres'); + grunt.loadNpmTasks('grunt-karma'); + +}; diff --git a/Procfile b/Procfile index 6f86b16c86..d27e533a56 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: node server.js \ No newline at end of file +web: ./node_modules/.bin/grunt build:prod;./node_modules/.bin/grunt nodemon; \ No newline at end of file diff --git a/README.md b/README.md index 10aeab7503..a68cc38ad3 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,89 @@ -#[HabitRPG](http://habitrpg.com/) +HabitRPG +=============== -HabitRPG is a habit building program which treats your life like a Role Playing Game. Level up as you succeed, lose HP as you fail, earn money to buy weapons and armor. +[HabitRPG](https://habitrpg.com) is an open source habit building program which treats your life like a Role Playing Game. Level up as you succeed, lose HP as you fail, earn money to buy weapons and armor. -[Read more](https://habitrpg.com/static/about) +Built using Angular, Express, Mongoose, Jade, Stylus, Grunt and Bower. -![Screenshot](https://raw.github.com/lefnire/habitrpg/master/public/img/screenshot.jpeg "Screenshot") +# Set up HabitRPG locally -##License -Code is licensed under GNU GPL v3. Content is licensed under CC-BY-SA 3.0. -See the LICENSE file for details. +**Windows** users should skip this section and read the one below with Windows-specific steps. -##Credits -Content comes from Mozilla's [BrowserQuest](http://browserquest.mozilla.org/) +Before starting make sure to have [MongoDB](http://www.mongodb.org/), [NodeJS and npm](http://nodejs.org/) and [Git](https://help.github.com/articles/set-up-git) installed and set up. - * [Mozilla](http://mozilla.org) - * [Little Workshop](http://www.littleworkshop.fr) \ No newline at end of file +1. [Fork the repository](https://help.github.com/articles/fork-a-repo) on your computer. +1. Checkout the **develop** branch where all the development happens: +`git checkout -b develop origin/develop` +1. Install **grunt-cli** npm package globally (on some systems you may need to add `sudo` in front of the command below): +`npm install -g grunt-cli bower` +1. Install the **npm** and **bower** packages: +`npm install` +1. Create a config file from the example one: +`cp config.json.example config.json` +1. Ensure that Mongo is running and seed the database with initial settings by running: +`node .\src\seed.js`. + +## Windows Environment Install + +1. Set up MongoDB. Steps: + 1. Download the latest production release of MongoDB from: http://www.mongodb.org/downloads + 1. Extract the zip file to the desired application directory. Example: c:\apps\mongodb-win32-x86_64-2.4.6 + 1. Rename the folder from mongodb-win32-x86_64-2.4.6 to mongodb + 1. Create a data\db directory under the application directory. Example: c:\apps\mongodb\data\db + 1. Start up MongoDB using the following command: + 'c:\apps\mongodb\bin\mongod.exe --dbpath c:\apps\mongodb\data' + +If MongoDB starts up successfully, you should see the following at the end of the logs: +```Sun Sep 01 18:10:21.233 [initandlisten] waiting for connections on port 27017 +Sun Sep 01 18:10:21.233 [websvr] admin web console waiting for connections on po +rt 28017``` + +1. Install Node.js (includes npm). Steps: + 1. Download and run the latest Node.js msi installation file from http://nodejs.org/download/ +1. Install [Git](https://help.github.com/articles/set-up-git). +1. [Fork the repository](https://help.github.com/articles/fork-a-repo) on your computer. +1. Checkout the **develop** branch where all the development happens: +`git checkout -b develop origin/develop` +1. Install the **npm** packages: +`npm install` +Read below for possible error message. + +You might receive the following error during the 'npm install' command: +> habitrpg@0.0.0-152 postinstall C:\Users\022498\Projects\habitrpg +> ./node_modules/bower/bin/bower install -f +'.' is not recognized as an internal or external command, +operable program or batch file. +npm ERR! weird error 1 +npm ERR! not ok code 0 + +Ignore this error and proceed with the following: + +1. Install **grunt-cli** and **bower** npm packages globally +'npm install -g grunt-cli bower' +1. Install the **bower** packages: +'bower install -f' +1. Create a config file from the example one: +`copy config.json.example config.json` +1. Ensure that Mongo is running and seed the database with initial settings by r +unning: +`node ./src/seed.js`. + +# Run HabitRPG + +HabitRPG uses [Grunt](http://gruntjs.com) as its build tool. + +`grunt run:dev` compiles the **Stylus** files and start a web server. + +It uses [Nodemon](https://github.com/remy/nodemon) and [grunt-contrib-watch](https://github.com/gruntjs/grunt-contrib-watch) to automatically restart the server and re-compile the files when a change is detected. + +**Open a browser to URL http://localhost:3000 to test the application!** + +# Technologies discussion + +1. Angular, Express, Mongoose. Awesome, tried technologies. Read up on them. +1. Stylus, Jade - big debate. + 1. Jade. We need a server-side templating language so we can inject variables (`res.locals` from Express). Jade is great + because the "significant whitespace" paradigm protects you from HTML errors such as missing or mal-matched close tags, + which has been a pretty common error from multiple contribs on Habit. However, it's not very HTML-y, and makes people mad. + We'll re-visit this conversation after the rewrite is done. + 1. Stylus. We're either staying here or moving to LESS, but vanilla CSS isn't cutting it for our app. diff --git a/archive/README.md b/archive/README.md new file mode 100644 index 0000000000..a1e5cc1ee4 --- /dev/null +++ b/archive/README.md @@ -0,0 +1,8 @@ +# What's This? + +I'm consolidating @litenull's rewrite branch with the old code, and removing files from both sources once they've been +successfully merged into the new platform. While @litenull's "from scratch" approach was really clean, it will take +us longer to implemente all the original features. This approach will (1) let us leverage code we already have, (2) merge +in litenull's hard work from the last few weeks. + +Once this archive/ directory is completely empty, we should be fully merged and ready to deploy the rewrite! \ No newline at end of file diff --git a/archive/derby_controllers/browser.coffee b/archive/derby_controllers/browser.coffee new file mode 100644 index 0000000000..5efa078558 --- /dev/null +++ b/archive/derby_controllers/browser.coffee @@ -0,0 +1,46 @@ +_ = require 'lodash' +moment = require 'moment' + +### + Loads JavaScript files from public/vendor/* + Use require() to min / concatinate for faster page load +### +loadJavaScripts = (model) -> + + # Turns out you can't have expressions in browserify require() statements + #vendor = '../../public/vendor' + #require "#{vendor}/jquery-ui-1.10.2/jquery-1.9.1" + + ### + Internal Scripts + ### + require "../vendor/jquery.cookie.min.js" + require "../vendor/bootstrap/js/bootstrap.min.js" + require "../vendor/datepicker/js/bootstrap-datepicker" + require "../vendor/bootstrap-tour/bootstrap-tour" + + unless (model.get('_mobileDevice') is true) + require "../vendor/sticky" + + # note: external script loading is handled in app.on('render') near the bottom of this file (see https://groups.google.com/forum/?fromgroups=#!topic/derbyjs/x8FwdTLEuXo) + + +# jquery sticky header on scroll, no need for position fixed +initStickyHeader = (model) -> + $('.header-wrap').sticky({topSpacing:0}) + + +module.exports.app = (appExports, model, app) -> + + app.on 'render', (ctx) -> + #restoreRefs(model) + unless model.get('_mobileDevice') + setupTooltips(model) + initStickyHeader(model) + setupSortable(model) + + $('.datepicker').datepicker({autoclose:true, todayBtn:true}) + .on 'changeDate', (ev) -> + #for some reason selecting a date doesn't fire a change event on the field, meaning our changes aren't saved + model.at(ev.target).set 'date', moment(ev.date).format('MM/DD/YYYY') + diff --git a/archive/derby_controllers/challenges.coffee b/archive/derby_controllers/challenges.coffee new file mode 100644 index 0000000000..d89ebef890 --- /dev/null +++ b/archive/derby_controllers/challenges.coffee @@ -0,0 +1,239 @@ +_ = require 'lodash' +{helpers} = require 'habitrpg-shared' +async = require 'async' + +module.exports.app = (app) -> + + ### + Sync any updates to challenges since last refresh. Do it after cron, so we don't punish them for new tasks + This is challenge->user sync. user->challenge happens when user interacts with their tasks + ### + app.on 'ready', (model) -> + window.setTimeout -> + _.each model.get('groups'), (g) -> + if (@uid in g.members) and g.challenges + _.each(g.challenges, ->app.challenges.syncChalToUser g) + true + , 500 + + ### + Sync user to challenge (when they score, add to statistics) + ### + app.model.on "change", "_page.user.priv.tasks.*.value", (id, value, previous, passed) -> + ### Sync to challenge, but do it later ### + async.nextTick => + model = app.model + ctx = {model: model} + task = model.at "_page.user.priv.tasks.#{id}" + tobj = task.get() + pub = model.get "_page.user.pub" + + if (chalTask = helpers.taskInChallenge.call ctx, tobj)? and chalTask.get() + chalTask.increment "value", value - previous + chal = model.at "groups.#{tobj.group.id}.challenges.#{tobj.challenge}" + chalUser = -> helpers.indexedAt.call(ctx, chal.path(), 'members', {id:pub.id}) + cu = chalUser() + unless cu?.get() + chal.push "members", {id: pub.id, name: model.get(pub.profile.name)} + cu = model.at chalUser() + else + cu.set 'name', pub.profile.name # update their name incase it changed + cu.set "#{tobj.type}s.#{tobj.id}", + value: tobj.value + history: tobj.history + + ### + Render graphs for user scores when the "Challenges" tab is clicked + ### + + ### + TODO + 1) on main tab click or party + * sort & render graphs for party + 2) guild -> all guilds + 3) public -> all public + ### + + + ### + $('#profile-challenges-tab-link').on 'shown', -> + async.each _.toArray(model.get('groups')), (g) -> + async.each _.toArray(g.challenges), (chal) -> + async.each _.toArray(chal.tasks), (task) -> + async.each _.toArray(chal.members), (member) -> + if (history = member?["#{task.type}s"]?[task.id]?.history) and !!history + data = google.visualization.arrayToDataTable _.map(history, (h)-> [h.date,h.value]) + options = + backgroundColor: { fill:'transparent' } + width: 150 + height: 50 + chartArea: width: '80%', height: '80%' + axisTitlePosition: 'none' + legend: position: 'bottom' + hAxis: gridlines: color: 'transparent' # since you can't seem to *remove* gridlines... + vAxis: gridlines: color: 'transparent' + chart = new google.visualization.LineChart $(".challenge-#{chal.id}-member-#{member.id}-history-#{task.id}")[0] + chart.draw(data, options) + ### + + app.fn + challenges: + + ### + Create + ### + create: (e,el) -> + [type, gid] = [$(el).attr('data-type'), $(el).attr('data-gid')] + cid = @model.id() + @model.set '_page.new.challenge', + id: cid + name: '' + habits: [] + dailys: [] + todos: [] + rewards: [] + user: + uid: @uid + name: @pub.get('profile.name') + group: {type, id:gid} + timestamp: +new Date + + ### + Save + ### + save: -> + newChal = @model.get('_page.new.challenge') + [gid, cid] = [newChal.group.id, newChal.id] + @model.push "_page.lists.challenges.#{gid}", newChal, -> + app.browser.growlNotification('Challenge Created','success') + app.challenges.discard() + app.browser.resetDom() # something is going absolutely haywire here, all model data at end of reflist after chal created + + ### + Toggle Edit + ### + toggleEdit: (e, el) -> + path = "_page.editing.challenges.#{$(el).attr('data-id')}" + @model.set path, !@model.get(path) + + ### + Discard + ### + discard: -> + @model.del '_page.new.challenge' + + ### + Delete + ### + delete: (e) -> + return unless confirm("Delete challenge, are you sure?") is true + e.at().remove() + + ### + Add challenge name as a tag for user + ### + syncChalToUser: (chal) -> + return unless chal + ### Sync tags ### + tags = @priv.get('tags') or [] + idx = _.findIndex tags, {id: chal.id} + if ~idx and (tags[idx].name isnt chal.name) + ### update the name - it's been changed since ### + @priv.set "tags.#{idx}.name", chal.name + else + @priv.push 'tags', {id: chal.id, name: chal.name, challenge: true} + + tags = {}; tags[chal.id] = true + _.each chal.habits.concat(chal.dailys.concat(chal.todos.concat(chal.rewards))), (task) => + _.defaults task, { tags, challenge: chal.id, group: {id: chal.group.id, type: chal.group.type} } + path = "tasks.#{task.id}" + if @priv.get path + @priv.set path, _.defaults(@priv.get(path), task) + else + @model.push "_page.lists.tasks.#{@uid}.#{task.type}s", task + true + + ### + Subscribe + ### + subscribe: (e) -> + chal = e.get() + ### Add all challenge's tasks to user's tasks ### + currChallenges = @pub.get('challenges') + @pub.unshift('challenges', chal.id) unless currChallenges and ~currChallenges.indexOf(chal.id) + e.at().push "members", + id: @uid + name: @pub.get('profile.name') + app.challenges.syncChalToUser(chal) + + ### + -------------------------- + Unsubscribe functions + -------------------------- + ### + + unsubscribe: (chal, keep=true) -> + + ### Remove challenge from user ### + i = @pub.get('challenges')?.indexOf(chal.id) + if i? and ~i + @pub.remove("challenges", i, 1) + + ### Remove user from challenge ### + if ~(i = _.findIndex chal.members, {id: @uid}) + @model.remove "groups.#{chal.group.id}.challenges.#{chal.id}.members", i, 1 + + ### Remove tasks from user ### + async.each chal.habits.concat(chal.dailys.concat(chal.todos.concat(chal.rewards))), (task) => + if keep is true + @priv.del "tasks.#{task.id}.challenge" + else + path = "_page.lists.tasks.#{@uid}.#{task.type}s" + if ~(i = _.findIndex(@model.get(path), {id:task.id})) + @model.remove(path, i, 1) + true + + taskUnsubscribe: (e, el) -> + + ### + since the challenge was deleted, we don't have its data to unsubscribe from - but we have the vestiges on the task + FIXME this is a really dumb way of doing this + ### + tasks = @priv.get('tasks') + tobj = tasks[$(el).attr("data-tid")] + deletedChal = + id: tobj.challenge + members: [@uid] + habits: _.where tasks, {type: 'habit', challenge: tobj.challenge} + dailys: _.where tasks, {type: 'daily', challenge: tobj.challenge} + todos: _.where tasks, {type: 'todo', challenge: tobj.challenge} + rewards: _.where tasks, {type: 'reward', challenge: tobj.challenge} + + switch $(el).attr('data-action') + when 'keep' + @priv.del "tasks.#{tobj.id}.challenge" + @priv.del "tasks.#{tobj.id}.group" + when 'keep-all' + app.challenges.unsubscribe.call @, deletedChal, true + when 'remove' + path = "_page.lists.tasks.#{@uid}.#{tobj.type}s" + if ~(i = _.findIndex @model.get(path), {id: tobj.id}) + @model.remove path, i + when 'remove-all' + app.challenges.unsubscribe.call @, deletedChal, false + + challengeUnsubscribe: (e, el) -> + $(el).popover('destroy').popover({ + html: true + placement: 'top' + trigger: 'manual' + title: 'Unsubscribe From Challenge And:' + content: """ + Remove Tasks
+ Keep Tasks
+ Cancel
+ """ + }).popover('show') + $('.challenge-unsubscribe-and-remove').click => app.challenges.unsubscribe.call @, e.get(), false + $('.challenge-unsubscribe-and-keep').click => app.challenges.unsubscribe.call @, e.get(), true + $('[class^=challenge-unsubscribe]').click => $(el).popover('destroy') \ No newline at end of file diff --git a/archive/derby_controllers/filters.coffee b/archive/derby_controllers/filters.coffee new file mode 100644 index 0000000000..d03d8424e4 --- /dev/null +++ b/archive/derby_controllers/filters.coffee @@ -0,0 +1,22 @@ +_ = require 'lodash' + +module.exports.app = (appExports, model) -> + user = model.at('_user') + + appExports.filtersDeleteTag = (e, el) -> + tags = user.get('tags') + tag = e.at "_user.tags." + $(el).attr('data-index') + tagId = tag.get('id') + + ###something got corrupted, let's clear the corrupt tags### + unless tagId + user.set 'tags', _.filter( tags, ((t)-> t?.id) ) + user.set 'filters', {} + return + + model.del "_user.filters.#{tagId}" + tag.remove() + + ### remove tag from all tasks### + _.each user.get("tasks"), (task) -> user.del "tasks.#{task.id}.tags.#{tagId}"; true + diff --git a/archive/derby_controllers/groups.coffee b/archive/derby_controllers/groups.coffee new file mode 100644 index 0000000000..79992f0f6a --- /dev/null +++ b/archive/derby_controllers/groups.coffee @@ -0,0 +1,139 @@ +_ = require('lodash') +helpers = require('habitrpg-shared/script/helpers') + +module.exports.app = (appExports, model, app) -> + browser = require './browser' + + _currentTime = model.at '_currentTime' + _currentTime.setNull +new Date + # Every 60 seconds, reset the current time so that the chat can update relative times + setInterval (->_currentTime.set +new Date), 60000 + + appExports.groupCreate = (e,el) -> + type = $(el).attr('data-type') + newGroup = + name: model.get("_new.group.name") + description: model.get("_new.group.description") + leader: user.get('id') + members: [user.get('id')] + type: type + + # parties - free + if type is 'party' + return model.add 'groups', newGroup, ->location.reload() + + # guilds - 4G + unless user.get('balance') >= 1 + return $('#more-gems-modal').modal 'show' + if confirm "Create Guild for 4 Gems?" + newGroup.privacy = (model.get("_new.group.privacy") || 'public') if type is 'guild' + newGroup.balance = 1 # they spent $ to open the guild, it goes into their guild bank + model.add 'groups', newGroup, -> + user.incr 'balance', -1, ->location.reload() + + appExports.toggleGroupEdit = (e, el) -> + path = "_editing.groups.#{$(el).attr('data-gid')}" + model.set path, !model.get(path) + + appExports.toggleLeaderMessageEdit = (e, el) -> + path = "_editing.leaderMessage.#{$(el).attr('data-gid')}" + model.set path, !model.get(path) + + appExports.groupAddWebsite = (e, el) -> + test = e.get() + e.at().unshift 'websites', model.get('_newGroupWebsite') + model.del '_newGroupWebsite' + + appExports.groupInvite = (e,el) -> + uid = model.get('_groupInvitee').replace(/[\s"]/g, '') + model.set '_groupInvitee', '' + return if _.isEmpty(uid) + + model.query('users').publicInfo([uid]).fetch (err, profiles) -> + throw err if err + profile = profiles.at(0).get() + return model.set("_groupError", "User with id #{uid} not found.") unless profile + model.query('groups').withMember(uid).fetch (err, g) -> + throw err if err + group = e.get(); groups = g.get() + {type, name} = group; gid = group.id + groupError = (msg) -> model.set("_groupError", msg) + invite = -> + $.bootstrapGrowl "Invitation Sent." + switch type + when 'guild' then model.push "users.#{uid}.invitations.guilds", {id:gid, name}, ->location.reload() + when 'party' then model.set "users.#{uid}.invitations.party", {id:gid, name}, ->location.reload() + + switch type + when 'guild' + if profile.invitations?.guilds and _.find(profile.invitations.guilds, {id:gid}) + return groupError("User already invited to that group") + else if uid in group.members + return groupError("User already in that group") + else invite() + when 'party' + if profile.invitations?.party + return groupError("User already pending invitation.") + else if _.find(groups, {type:'party'}) + return groupError("User already in a party.") + else invite() + + + appExports.acceptInvitation = (e,el) -> + gid = e.get('id') + if $(el).attr('data-type') is 'party' + user.set 'invitations.party', null, ->joinGroup(gid) + else + e.at().remove ->joinGroup(gid) + + appExports.rejectInvitation = (e, el) -> + clear = -> browser.resetDom(model) + if e.at().path().indexOf('party') != -1 + model.del e.at().path(), clear + else e.at().remove clear + + appExports.groupLeave = (e,el) -> + if confirm("Leave this group, are you sure?") is true + uid = user.get('id') + group = model.at "groups.#{$(el).attr('data-id')}" + index = group.get('members').indexOf(uid) + if index != -1 + group.remove 'members', index, 1, -> + updated = group.get() + # last member out, delete the party + if _.isEmpty(updated.members) and (updated.type is 'party') + group.del ->location.reload() + # assign new leader, so the party is editable #TODO allow old leader to assign new leader, this is just random + else if (updated.leader is uid) + group.set "leader", updated.members[0], ->location.reload() + else location.reload() + + ### + Chat Functionality + ### + + model.on 'unshift', '_party.chat', -> $('.chat-message').tooltip() + model.on 'unshift', '_habitrpg.chat', -> $('.chat-message').tooltip() + + appExports.chatKeyup = (e, el, next) -> + return next() unless e.keyCode is 13 + appExports.sendChat(e, el) + + appExports.deleteChatMessage = (e) -> + if confirm("Delete chat message?") is true + e.at().remove() #requires the {#with} + + app.on 'render', (ctx) -> + $('#party-tab-link').on 'shown', (e) -> + messages = model.get('_party.chat') + return false unless messages?.length > 0 + model.set '_user.party.lastMessageSeen', messages[0].id + + appExports.gotoPartyChat = -> + model.set '_gamePane', true, -> + $('#party-tab-link').tab('show') + + appExports.assignGroupLeader = (e, el) -> + newLeader = model.get('_new.groupLeader') + if newLeader and (confirm("Assign new leader, you sure?") is true) + e.at().set('leader', newLeader, ->browser.resetDom(model)) if newLeader diff --git a/src/app/i18n.coffee b/archive/derby_controllers/i18n.coffee similarity index 100% rename from src/app/i18n.coffee rename to archive/derby_controllers/i18n.coffee diff --git a/archive/derby_controllers/index.coffee b/archive/derby_controllers/index.coffee new file mode 100644 index 0000000000..e88b23c79b --- /dev/null +++ b/archive/derby_controllers/index.coffee @@ -0,0 +1,20 @@ +# Translations +i18n = require './i18n' +i18n.localize app, + availableLocales: ['en', 'he', 'bg', 'nl'] + defaultLocale: 'en' + urlScheme: false + checkHeader: true + + +# ========== CONTROLLER FUNCTIONS ========== + +ready (model) -> + misc.fixCorruptUser(model) # https://github.com/lefnire/habitrpg/issues/634 + + # used for things like remove website, chat, etc + exports.removeAt = (e, el) -> + if (confirmMessage = $(el).attr 'data-confirm')? + return unless confirm(confirmMessage) is true + e.at().remove() + browser.resetDom(model) if $(el).attr('data-refresh') diff --git a/archive/derby_controllers/items.coffee b/archive/derby_controllers/items.coffee new file mode 100644 index 0000000000..9c118be29b --- /dev/null +++ b/archive/derby_controllers/items.coffee @@ -0,0 +1,39 @@ +items = require 'habitrpg-shared/script/items' +_ = require 'lodash' + +updateStore = (model) -> + nextItems = items.updateStore(model.get('_user')) + _.each nextItems, (v,k) -> model.set("_items.next.#{k}",v); true + +### + server exports +### +module.exports.server = (model) -> + model.set '_items', items.items + updateStore(model) + +### + app exports +### +module.exports.app = (appExports, model) -> + misc = require './misc' + + model.on "set", "_user.items.*", -> updateStore(model) + + appExports.buyItem = (e, el) -> + misc.batchTxn model, (uObj, paths) -> + ret = items.buyItem uObj, $(el).attr('data-type'), {paths} + alert("Not enough GP") if ret is false + + appExports.activateRewardsTab = -> + model.set '_activeTabRewards', true + model.set '_activeTabPets', false + appExports.activatePetsTab = -> + model.set '_activeTabPets', true + model.set '_activeTabRewards', false + + + + + + diff --git a/archive/derby_controllers/misc.coffee b/archive/derby_controllers/misc.coffee new file mode 100644 index 0000000000..06e74249c1 --- /dev/null +++ b/archive/derby_controllers/misc.coffee @@ -0,0 +1,152 @@ +_ = require 'lodash' +algos = require 'habitrpg-shared/script/algos' +items = require('habitrpg-shared/script/items').items +helpers = require('habitrpg-shared/script/helpers') + +#TODO put this in habitrpg-shared +### + We can't always use refLists, but we often still need to get a positional path by id: eg, users.1234.tasks.5678.value + For arrays (which use indexes, not id-paths), here's a helper function so we can run indexedPath('users',:user.id,'tasks',:task.id,'value) +### +indexedPath = -> + _.reduce arguments, (m,v) => + return v if !m #first iteration + return "#{m}.#{v}" if _.isString v #string paths + return "#{m}." + _.findIndex(@model.get(m),v) + , '' + +taskInChallenge = (task) -> + return undefined unless task?.challenge + @model.at indexedPath.call(@, "groups.#{task.group.id}.challenges", {id:task.challenge}, "#{task.type}s", {id:task.id}) + +### + algos.score wrapper for habitrpg-helpers to work in Derby. We need to do model.set() instead of simply setting the + object properties, and it's very difficult to diff the two objects and find dot-separated paths to set. So we to first + clone our user object (if we don't do that, it screws with model.on() listeners, ping Tyler for an explaination), + perform the updates while tracking paths, then all the values at those paths +### +module.exports.score = (model, taskId, direction, allowUndo=false) -> + drop = undefined + delta = batchTxn model, (uObj, paths) -> + tObj = uObj.tasks[taskId] + + # Stuff for undo + if allowUndo + tObjBefore = _.cloneDeep tObj + tObjBefore.completed = !tObjBefore.completed if tObjBefore.type in ['daily', 'todo'] + previousUndo = model.get('_undo') + clearTimeout(previousUndo.timeoutId) if previousUndo?.timeoutId + timeoutId = setTimeout (-> model.del('_undo')), 20000 + model.set '_undo', {stats:_.cloneDeep(uObj.stats), task:tObjBefore, timeoutId: timeoutId} + + delta = algos.score(uObj, tObj, direction, {paths}) + model.set('_streakBonus', uObj._tmp.streakBonus) if uObj._tmp?.streakBonus + drop = uObj._tmp?.drop + + # Update challenge statistics + # FIXME put this in it's own batchTxn, make batchTxn model.at() ref aware (not just _user) + # FIXME use reflists for users & challenges + if (chalTask = taskInChallenge.call({model}, tObj)) and chalTask?.get() + model._dontPersist = false + chalTask.incr "value", delta + chal = model.at indexedPath.call({model}, "groups.#{tObj.group.id}.challenges", {id:tObj.challenge}) + chalUser = -> indexedPath.call({model}, chal.path(), 'users', {id:uObj.id}) + cu = model.at chalUser() + unless cu?.get() + chal.push "users", {id: uObj.id, name: helpers.username(uObj.auth, uObj.profile?.name)} + cu = model.at chalUser() + else + cu.set 'name', helpers.username(uObj.auth, uObj.profile?.name) # update their name incase it changed + cu.set "#{tObj.type}s.#{tObj.id}", + value: tObj.value + history: tObj.history + model._dontPersist = true + , done:-> + if drop and $? + model.set '_drop', drop + $('#item-dropped-modal').modal 'show' + + delta + +### + Cleanup task-corruption (null tasks, rogue/invisible tasks, etc) + Obviously none of this should be happening, but we'll stop-gap until we can find & fix + Gotta love refLists! see https://github.com/lefnire/habitrpg/issues/803 & https://github.com/lefnire/habitrpg/issues/6343 +### +module.exports.fixCorruptUser = (model) -> + user = model.at('_user') + tasks = user.get('tasks') + + ## Remove corrupted tasks + _.each tasks, (task, key) -> + unless task?.id? and task?.type? + user.del("tasks.#{key}") + delete tasks[key] + true + resetDom = false + batchTxn model, (uObj, paths, batch) -> + ## fix https://github.com/lefnire/habitrpg/issues/1086 + uniqPets = _.uniq(uObj.items.pets) + batch.set('items.pets', uniqPets) if !_.isEqual(uniqPets, uObj.items.pets) + + if uObj.invitations?.guilds + uniqInvites = _.uniq(uObj.invitations.guilds) + batch.set('invitations.guilds', uniqInvites) if !_.isEqual(uniqInvites, uObj.invitations.guilds) + + ## Task List Cleanup + ['habit','daily','todo','reward'].forEach (type) -> + + # 1. remove duplicates + # 2. restore missing zombie tasks back into list + idList = uObj["#{type}Ids"] + taskIds = _.pluck( _.where(tasks, {type}), 'id') + union = _.union idList, taskIds + + # 2. remove empty (grey) tasks + preened = _.filter union, (id) -> id and _.contains(taskIds, id) + + # There were indeed issues found, set the new list + if !_.isEqual(idList, preened) + batch.set("#{type}Ids", preened) + console.error uObj.id + "'s #{type}s were corrupt." + true + resetDom = !_.isEmpty(paths) + require('./browser').resetDom(model) if resetDom + +module.exports.viewHelpers = (view) -> + + #misc + view.fn "percent", (x, y) -> + x=1 if x==0 + Math.round(x/y*100) + view.fn 'indexOf', (str1, str2) -> + return false unless str1 && str2 + str1.indexOf(str2) != -1 + view.fn "round", Math.round + view.fn "floor", Math.floor + view.fn "ceil", Math.ceil + view.fn "truarr", (num) -> num-1 + view.fn 'count', (arr) -> arr?.length or 0 + view.fn 'int', + get: (num) -> num + set: (num) -> [parseInt(num)] + view.fn 'indexedPath', indexedPath + + + #iCal + view.fn "encodeiCalLink", helpers.encodeiCalLink + + #User + view.fn "gems", (balance) -> balance * 4 + + #Challenges + view.fn 'taskInChallenge', (task) -> + taskInChallenge.call(@,task)?.get() + view.fn 'taskAttrFromChallenge', (task, attr) -> + taskInChallenge.call(@,task)?.get(attr) + view.fn 'brokenChallengeLink', (task) -> + task?.challenge and !(taskInChallenge.call(@,task)?.get()) + + view.fn 'challengeMemberScore', (member, tType, tid) -> + Math.round(member["#{tType}s"]?[tid]?.value) + diff --git a/src/app/pets.coffee b/archive/derby_controllers/pets.coffee similarity index 81% rename from src/app/pets.coffee rename to archive/derby_controllers/pets.coffee index 9f43d82aeb..46288b5164 100644 --- a/src/app/pets.coffee +++ b/archive/derby_controllers/pets.coffee @@ -1,6 +1,6 @@ -_ = require 'underscore' -{ randomVal } = require './helpers' -{ pets, hatchingPotions } = require('./items').items +_ = require 'lodash' +{ randomVal } = require 'habitrpg-shared/script/helpers' +{ pets, hatchingPotions } = require('habitrpg-shared/script/items').items ### app exports @@ -25,12 +25,11 @@ module.exports.app = (appExports, model) -> return alert "You don't own that egg yet, complete more tasks!" if eggIdx is -1 return alert "You already have that pet, hatch a different combo." if myPets and myPets.indexOf("#{egg.name}-#{hatchingPotionName}") != -1 - user.push 'items.pets', egg.name + '-' + hatchingPotionName - - eggs.splice eggIdx, 1 - myHatchingPotion.splice hatchingPotionIdx, 1 - user.set 'items.eggs', eggs - user.set 'items.hatchingPotions', myHatchingPotion + user.push 'items.pets', egg.name + '-' + hatchingPotionName, -> + eggs.splice eggIdx, 1 + myHatchingPotion.splice hatchingPotionIdx, 1 + user.set 'items.eggs', eggs + user.set 'items.hatchingPotions', myHatchingPotion alert 'Your egg hatched! Visit your stable to equip your pet.' @@ -46,14 +45,14 @@ module.exports.app = (appExports, model) -> return user.set 'items.currentPet', {} if user.get('items.currentPet.str') is petStr [name, modifier] = petStr.split('-') - pet = _.findWhere pets, name: name + pet = _.find pets, {name: name} pet.modifier = modifier pet.str = petStr user.set 'items.currentPet', pet appExports.buyHatchingPotion = (e, el) -> name = $(el).attr 'data-hatchingPotion' - newHatchingPotion = _.findWhere hatchingPotions, name: name + newHatchingPotion = _.find hatchingPotions, {name: name} gems = user.get('balance') * 4 if gems >= newHatchingPotion.value if confirm "Buy this hatching potion with #{newHatchingPotion.value} of your #{gems} Gems?" @@ -64,7 +63,7 @@ module.exports.app = (appExports, model) -> appExports.buyEgg = (e, el) -> name = $(el).attr 'data-egg' - newEgg = _.findWhere pets, name: name + newEgg = _.find pets, {name: name} gems = user.get('balance') * 4 if gems >= newEgg.value if confirm "Buy this egg with #{newEgg.value} of your #{gems} Gems?" diff --git a/archive/derby_controllers/tasks.coffee b/archive/derby_controllers/tasks.coffee new file mode 100644 index 0000000000..1a01c095e0 --- /dev/null +++ b/archive/derby_controllers/tasks.coffee @@ -0,0 +1,29 @@ +algos = require 'habitrpg-shared/script/algos' +helpers = require 'habitrpg-shared/script/helpers' +_ = require 'lodash' +moment = require 'moment' +misc = require './misc' + + appExports.clearCompleted = (e, el) -> + completedIds = _.pluck( _.where(model.get('_todoList'), {completed:true}), 'id') + todoIds = user.get('todoIds') + _.each completedIds, (id) -> user.del "tasks.#{id}"; true + user.set 'todoIds', _.difference(todoIds, completedIds) + + + ### + Undo + ### + appExports.undo = () -> + undo = model.get '_undo' + clearTimeout(undo.timeoutId) if undo?.timeoutId + model.del '_undo' + _.each undo.stats, (val, key) -> user.set "stats.#{key}", val; true + taskPath = "tasks.#{undo.task.id}" + _.each undo.task, (val, key) -> + return true if key in ['id', 'type'] # strange bugs in this world: https://workflowy.com/shared/a53582ea-43d6-bcce-c719-e134f9bf71fd/ + if key is 'completed' + user.pass({cron:true}).set("#{taskPath}.completed",val) + else + user.set "#{taskPath}.#{key}", val + true diff --git a/src/app/unlock.coffee b/archive/derby_controllers/unlock.coffee similarity index 89% rename from src/app/unlock.coffee rename to archive/derby_controllers/unlock.coffee index 1680e7a9b1..73527b9d8a 100644 --- a/src/app/unlock.coffee +++ b/archive/derby_controllers/unlock.coffee @@ -1,6 +1,6 @@ -_ = require 'underscore' -{ randomVal } = require './helpers' -{ pets, hatchingPotions } = require('./items').items +_ = require 'lodash' +{ randomVal } = require 'habitrpg-shared/script/helpers' +{ pets, hatchingPotions } = require('habitrpg-shared/script/items').items ### Listeners to enabled flags, set notifications to the user when they've unlocked features @@ -75,9 +75,9 @@ module.exports.app = (appExports, model) -> user.on 'set', 'items.*', (after, before) -> return if user.get('achievements.ultimateGear') items = user.get('items') - if parseInt(items.weapon) == 6 and parseInt(items.armor) == 5 and parseInt(items.head) == 5 and parseInt(items.shield) == 5 - dontPersist = model._dontPersist; model._dontPersist = false - user.set 'achievements.ultimateGear', true, (-> model._dontPersist = dontPersist) + if parseInt(items.weapon) >= 6 and parseInt(items.armor) >= 5 and parseInt(items.head) >= 5 and parseInt(items.shield) >= 5 + dontPersist = model._dontPersist; model._dontPersist = false + user.set 'achievements.ultimateGear', true, (->model._dontPersist = dontPersist) $('#max-gear-achievement-modal').modal('show') user.on 'set', 'tasks.*.streak', (id, after, before) -> diff --git a/bower.json b/bower.json new file mode 100644 index 0000000000..5dc7878e1c --- /dev/null +++ b/bower.json @@ -0,0 +1,45 @@ +{ + "name": "HabitRPG", + "version": "0.1.1", + "homepage": "https://github.com/lefnire/habitrpg", + "authors": [ + "Tyler Renelle " + ], + "private": true, + "ignore": [ + "**/.*", + "node_modules", + "public/bower_components", + "test", + "tests" + ], + "dependencies": { + "jquery": "~2.0.3", + "jquery.cookie": "~1.4.0", + "jquery-ui": "~1.10.3", + "angular": "1.2.0-rc.3", + "angular-sanitize": "1.2.0-rc.3", + "angular-resource": "1.2.0-rc.3", + "angular-ui": "~0.4.0", + "angular-ui-utils": "~0.0.4", + "angular-bootstrap": "~0.5.0", + "angular-ui-router": "ca3b4777a603df8f86cfd653c8f6c38b2ae05d89", + "angular-loading-bar": "~0.0.5", + "bootstrap": "v2.3.2", + "bootstrap-datepicker": "~1.2.0", + "bootstrap-tour": "0.5.0", + "bootstrap-growl": "~1.1.0", + "habitrpg-shared": "git://github.com/HabitRPG/habitrpg-shared.git#master", + "BrowserQuest": "https://github.com/mozilla/BrowserQuest.git", + "github-buttons": "git://github.com/mdo/github-buttons.git", + "marked": "~0.2.9", + "JavaScriptButtons": "git://github.com/paypal/JavaScriptButtons.git#master" + }, + "resolutions": { + "jquery": "~2.0.3", + "bootstrap": "v2.3.2" + }, + "devDependencies": { + "angular-mocks": "1.2.0-rc.3" + } +} diff --git a/config.json.example b/config.json.example index cc40d79701..5cf560aae6 100644 --- a/config.json.example +++ b/config.json.example @@ -7,9 +7,11 @@ "NODE_DB_URI":"mongodb://localhost/habitrpg", "NODE_ENV":"development", "SESSION_SECRET":"YOUR SECRET HERE", + "ADMIN_EMAIL": "you@yours.com", "SMTP_USER":"user@domain.com", "SMTP_PASS":"password", "SMTP_SERVICE":"Gmail", "STRIPE_API_KEY":"aaaabbbbccccddddeeeeffff00001111", - "STRIPE_PUB_KEY":"22223333444455556666777788889999" -} \ No newline at end of file + "STRIPE_PUB_KEY":"22223333444455556666777788889999", + "PAYPAL_MERCHANT":"paypal-merchant@gmail.com" +} diff --git a/karma-e2e.conf.js b/karma-e2e.conf.js new file mode 100644 index 0000000000..fa01484a0a --- /dev/null +++ b/karma-e2e.conf.js @@ -0,0 +1,54 @@ +// Karma configuration +// http://karma-runner.github.io/0.10/config/configuration-file.html + +module.exports = function(config) { + config.set({ + // base path, that will be used to resolve files and exclude + basePath: '', + + // testing framework to use (jasmine/mocha/qunit/...) + frameworks: ['ng-scenario'], + + // list of files / patterns to load in the browser + files: [ + 'test/e2e/**/*.js' + ], + + // list of files / patterns to exclude + exclude: [], + + // web server port + port: 8080, + + // level of logging + // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: false, + + + // Start these browsers, currently available: + // - Chrome + // - ChromeCanary + // - Firefox + // - Opera + // - Safari (only Mac) + // - PhantomJS + // - IE (only Windows) + browsers: ['Chrome'], + + + // Continuous Integration mode + // if true, it capture browsers, run tests and exit + singleRun: false + + // Uncomment the following lines if you are using grunt's server to run the tests + // proxies: { + // '/': 'http://localhost:9000/' + // }, + // URL root prevent conflicts with the site root + // urlRoot: '_karma_' + }); +}; diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000000..0e1761b402 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,57 @@ +// Karma configuration +// http://karma-runner.github.io/0.10/config/configuration-file.html + +module.exports = function(config) { + config.set({ + // base path, that will be used to resolve files and exclude + basePath: '', + + // testing framework to use (jasmine/mocha/qunit/...) + frameworks: ['mocha', 'chai', 'chai-as-promised', 'sinon-chai'], + + // list of files / patterns to load in the browser + files: [ + 'public/bower_components/angular/angular.js', + 'public/bower_components/angular-loading-bar/build/loading-bar.min.js', + 'public/bower_components/angular-resource/angular-resource.min.js', + 'public/bower_components/angular-mocks/angular-mocks.js', + 'public/bower_components/marked/lib/marked.js', + 'public/bower_components/habitrpg-shared/dist/habitrpg-shared.js', + 'public/js/*.js', + 'public/js/**/*.js', + 'test/mock/**/*.js', + 'test/spec/*.js', + 'test/spec/**/*.js' + ], + + // list of files / patterns to exclude + exclude: [], + + // web server port + port: 8080, + + // level of logging + // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + + // Start these browsers, currently available: + // - Chrome + // - ChromeCanary + // - Firefox + // - Opera + // - Safari (only Mac) + // - PhantomJS + // - IE (only Windows) + browsers: ['Firefox'], + + + // Continuous Integration mode + // if true, it capture browsers, run tests and exit + singleRun: false + }); +}; diff --git a/locales/en/app.json b/locales/en/app.json index a0517951cc..7bef4b197c 100644 --- a/locales/en/app.json +++ b/locales/en/app.json @@ -19,7 +19,7 @@ "tour4Title" : "Todos", "tour4Text" : "Todos are one-off goals which need to be completed eventually. ", "tour5Title" : "Rewards", - "tour5Text" : "As you complete goals, you earn gold to buy rewards. Buy them liberally - rewards are integrals in forming good habits. ", + "tour5Text" : "As you complete goals, you earn gold to buy rewards. Buy them liberally - rewards are integral in forming good habits. ", "tour6Title" : "Hover over comments", "tour6Text" : "Different task-types have special properties. Hover over each task's comment for more information. When you're ready to get started, delete the existing tasks and add your own.", @@ -71,6 +71,7 @@ "_commenttaskview": "TASK VIEW", "habits": "Habits", + "Habits": "Habits", "newHabit": "New Habit", "edit": "Edit", "text": "Text", @@ -87,6 +88,7 @@ "progress": "Progress", "score": "Score", "dailies": "Dailies", + "Dailies": "Dailies", "newDaily": "New Daily", "repeat": "Repeat", "Su": "Su", @@ -97,11 +99,13 @@ "F": "F", "S": "S", "todos": "Todos", + "Todos": "Todos", "newTodo": "New Todo", "dueDate": "Due Date", "remaining": "Remaining", "complete": "Complete", "rewards": "Rewards", + "Rewards": "Rewards", "gold": "Gold", "silver": "Silver", "newReward": "New Reward", @@ -282,7 +286,7 @@ "sheild1Text": "Decreases HP loss by 3%", "sheild2Name" : "Buckler", "sheild2Text": "Decreases HP loss by 4%", - "sheild3Name" : "Enforced Shield", + "sheild3Name" : "Reinforced Shield", "sheild3Text": "Decreases HP loss by 5%", "sheild4Name" : "Red Shield", "sheild4Text": "Decreases HP loss by 7%", @@ -337,9 +341,15 @@ "_commentnpcsandchars": "NPCS & CHARACTERS", "_commentNPCS" : "NPCS", "NPCBaileyText1" : "the Town Crier here! Announcing new stuff!", +<<<<<<< HEAD "NPCAugustinText1" : "Welcome to the Market! I'm the merchant;", "NPCAugustinText2" : "Dying to get that particular pet you're after, but don't want to wait for it to drop? Buy it here!", "NPCJohanssonText1" : "Welcome to the Tavern! I'm", +======= + "NPCAugustinText1" : "Welcome to the Market! I'm the merchant;", + "NPCAugustinText2" : "Dying to get that particular pet you're after, but don't want to wait for it to drop? Buy it here!", + "NPCJohanssonText1" : "Welcome to the Tavern! I'm", +>>>>>>> develop "NPCJohanssonText2": "the bar keep. If you want to rest a while (going on vacation? sudden illness?), I'll set you up at the inn - dailies won't hurt you while you're resting. Stay a while & meet the locals.", "NPCMelchiorText1" : "", "NPCBowenText1" : "", @@ -379,7 +389,11 @@ "_commentmisc": "MISC & GLOBAL", "removeAds": "Remove Ads", "whyAds": "Why Ads?", +<<<<<<< HEAD "whyAdsContent1": "Habit an open source project, and can use all the help it can get - consider this a donation to the contributors. You also get 20 Gems from the purchase, which you can use to buy special items.", +======= + "whyAdsContent1": "Habit is an open source project, and can use all the help it can get - consider this a donation to the contributors. You also get 20 Gems from the purchase, which you can use to buy special items.", +>>>>>>> develop "whyAdsContent2": "'Hey, I backed the Kickstarter!' - follow", "whyAdsContent3": "these instructions", "_commentbuttons": "BUTTONS", diff --git a/migrations/20230204_user_public_private_paths.js b/migrations/20130204_user_public_private_paths.js similarity index 100% rename from migrations/20230204_user_public_private_paths.js rename to migrations/20130204_user_public_private_paths.js diff --git a/migrations/20130212_preen_cron.js b/migrations/20130212_preen_cron.js deleted file mode 100644 index fc45cc0f13..0000000000 --- a/migrations/20130212_preen_cron.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Set this up as a midnight cron script - * - * mongo habitrpg node_modules/moment/moment.js migrations/json.js migrations/20130212_preen_cron.js - */ - - -/* - Users are allowed to experiment with the site before registering. Every time a new browser visits habitrpg, a new - "staged" account is created - and if the user later registeres, that staged account is considered a "production" account. - This function removes all staged accounts that have been abandoned - either older than a month, or corrupted in some way (lastCron==undefined) - */ - -var un_registered = { - "auth.local": {$exists: false}, - "auth.facebook": {$exists: false} -}; -var registered = { - $or: [ - { 'auth.local': { $exists: true }}, - { 'auth.facebook': { $exists: true }} - ] -}; - -var today = +(new Date); - -// isValidDate = (d) -> -// return false if Object::toString.call(d) isnt "[object Date]" -// not isNaN(d.getTime()) - - -db.users.find(un_registered).forEach(function(user) { - var diff, lastCron; - if (!user) return; - if (!!user.lastCron) { - lastCron = new Date(user.lastCron); - diff = Math.abs(moment(today).startOf('day').diff(moment(lastCron).startOf('day'), "days")); - if (diff > 3) { - return db.users.remove({_id:user._id}); - } - } else { - return db.users.update({_id: user._id}, {$set: {lastCron: today}}); - } -}); - - -/** - * Don't remove missing user auths anymore. This was previously necessary due to data corruption, - * revisit if needs be - */ -/*db.sessions.find().forEach(function(sess){ - var uid = JSON.parse(sess.session).userId; - if (!uid || db.users.count({_id:uid}) === 0) { - db.sessions.remove({_id:sess._id}); - } -});*/ \ No newline at end of file diff --git a/migrations/20130508_fix_duff_party_subscriptions.js b/migrations/20130508_fix_duff_party_subscriptions.js index 8012b472b2..cd218e785b 100644 --- a/migrations/20130508_fix_duff_party_subscriptions.js +++ b/migrations/20130508_fix_duff_party_subscriptions.js @@ -8,7 +8,7 @@ // since our primary subscription will first hit parties now, we *definitely* need an index there -db.parties.ensureIndex( { 'members': 1, 'background': 1} ); +db.parties.ensureIndex( { 'members': 1}, {background: true} ); db.parties.find().forEach(function(party){ diff --git a/migrations/20130518_setup_groups.js b/migrations/20130518_setup_groups.js new file mode 100644 index 0000000000..0e04bfa1b9 --- /dev/null +++ b/migrations/20130518_setup_groups.js @@ -0,0 +1,48 @@ +/** + * In adding the Guilds feature (which supports the Challenges feature), we are consolidating parties and guilds + * into one collection: groups, with group.type either 'party' or 'guild'. We are also creating the 'habitrpg' guild, + * which everyone is auto-subscribed to, and moving tavern chat into that guild + * + * mongo habitrpg ./node_modules/lodash/lodash.js ./migrations/20130518_setup_groups.js + */ + +/** + * TODO + * 1) rename collection parties => groups + * 2) add group.type = 'party' for each current group + * 3) create habitrpg group, .type='guild' + * 4) move tavern.chat.chat into habitrpg guild + * 5) subscribe everyone to habitrpg (be sure to set that for default user too!) + */ + +db.parties.renameCollection('groups',true); +//db.parties.dropCollection(); // doesn't seem to do this step during rename... +//db.parties.ensureIndex( { 'members': 1, 'background': 1} ); + +db.groups.update({}, {$set:{type:'party'}}, {multi:true}); + +//migrate invitation mechanisms +db.users.update( + {}, + { + $remove:{party:1}, + $set:{invitations:{party:null,guilds:[]}} + }, + {multi:1} +); + +tavern = db.tavern.findOne(); +db.tavern.drop(); + +//TODO make as a callback of previous, or make sure group.type is still 'guild' for habitrpg in the end +db.groups.insert({ + _id: "habitrpg", + leader: '9', + type: 'guild', + name: "HabitRPG", + chat: tavern.messages, + info: { + blurb: '', + websites: [] + } +}); \ No newline at end of file diff --git a/migrations/20130602_survey_rewards.js b/migrations/20130602_survey_rewards.js new file mode 100644 index 0000000000..5f883f7ad1 --- /dev/null +++ b/migrations/20130602_survey_rewards.js @@ -0,0 +1,25 @@ +//mongo habitrpg ./node_modules/lodash/lodash.js migrations/20130602_survey_rewards.js + +var members = [] +members = _.uniq(members); + +var query = { + _id: {$exists:1}, + $or:[ + {_id: {$in: members}}, + //{'profile.name': {$in: members}}, + {'auth.facebook.name': {$in: members}}, + {'auth.local.username': {$in: members}}, + {'auth.local.email': {$in: members}} + ] +}; + +print(db.users.count(query)); + +db.users.update(query, + { + $set: { 'achievements.helpedHabit': true }, + $inc: { balance: 2.5 } + }, + {multi:true} +) \ No newline at end of file diff --git a/migrations/20130612_survey_rewards_individual.js b/migrations/20130612_survey_rewards_individual.js new file mode 100644 index 0000000000..1d3fbf3317 --- /dev/null +++ b/migrations/20130612_survey_rewards_individual.js @@ -0,0 +1,9 @@ +//mongo habitrpg migrations/20130612_survey_rewards_individual.js + +var query = {_id: ""}; + +db.users.update(query, + { + $set: { 'achievements.helpedHabit': true }, + $inc: { balance: 2.5 } + }) \ No newline at end of file diff --git a/migrations/20130615_add_extra_indexes.js b/migrations/20130615_add_extra_indexes.js new file mode 100644 index 0000000000..2673568184 --- /dev/null +++ b/migrations/20130615_add_extra_indexes.js @@ -0,0 +1,4 @@ +db.users.ensureIndex( { _id: 1, apiToken: 1 }, {background: true} ) +db.groups.ensureIndex( { members: 1 }, {background: true} ) +db.groups.ensureIndex( { type: 1 }, {background: true} ) +db.groups.ensureIndex( { type: 1, privacy: 1 }, {background: true} ) \ No newline at end of file diff --git a/migrations/20130908_cleanup_corrupt_tags.js b/migrations/20130908_cleanup_corrupt_tags.js new file mode 100644 index 0000000000..2dce073bbc --- /dev/null +++ b/migrations/20130908_cleanup_corrupt_tags.js @@ -0,0 +1,16 @@ +//mongo habitrpg ./node_modules/lodash/lodash.js migrations/20130908_cleanup_corrupt_tags.js + +// Racer was notorious for adding duplicates, randomly deleting documents, etc. Once we pull the plug on old.habit, +// run this migration to cleanup all the corruption + +db.users.find().forEach(function(user){ + user.tags = _.filter(user.tags, (function(t) { + return !!t ? t.id : false; + })); + + try { + db.users.update({_id:user._id}, {$set:{tags:user.tags}}); + } catch(e) { + print(e); + } +}) diff --git a/migrations/20130908_cleanup_derby_corruption.js b/migrations/20130908_cleanup_derby_corruption.js new file mode 100644 index 0000000000..49c28141bd --- /dev/null +++ b/migrations/20130908_cleanup_derby_corruption.js @@ -0,0 +1,51 @@ +//mongo habitrpg ./node_modules/lodash/lodash.js migrations/20130908_cleanup_derby_corruption.js + +// Racer was notorious for adding duplicates, randomly deleting documents, etc. Once we pull the plug on old.habit, +// run this migration to cleanup all the corruption + +db.users.find().forEach(function(user){ + + // remove corrupt tasks, which will either be null-value or no id + user.tasks = _.reduce(user.tasks, function(m,task,k) { + if (!task || !task.id) return m; + if (isNaN(+task.value)) task.value = 0; + m[k] = task; + return m; + }, {}); + + // fix NaN stats + _.each(user.stats, function(v,k) { + if (!v || isNaN(+v)) user.stats[k] = 0; + return true; + }); + + // remove duplicates, restore ghost tasks + ['habit', 'daily', 'todo', 'reward'].forEach(function(type) { + var idList = user[type + "Ids"]; + var taskIds = _.pluck(_.where(user.tasks, {type: type}), 'id'); + var union = _.union(idList, taskIds); + var preened = _.filter(union, function(id) { + return id && _.contains(taskIds, id); + }); + if (!_.isEqual(idList, preened)) { + user[type + "Ids"] = preened; + } + }); + + // temporarily remove broken eggs. we'll need to write a migration script to grant gems for and remove these instead + if (user.items && user.items.eggs) { + user.items.eggs = _.filter(user.items.eggs,function(egg){ + if (_.isString(egg)) { + user.balance += 0.75; // give them 3 gems for each broken egg + } else { + return true; + } + }) + } + + try { + db.users.update({_id:user._id}, user); + } catch(e) { + print(e); + } +}) diff --git a/migrations/20130908_remove_staged_users.js b/migrations/20130908_remove_staged_users.js new file mode 100644 index 0000000000..7bf75c0096 --- /dev/null +++ b/migrations/20130908_remove_staged_users.js @@ -0,0 +1,37 @@ +/** + * Set this up as a midnight cron script + * + * mongo habitrpg ./migrations/20130908_remove_staged_users.js + */ + +/** + * If we experience any troubles with removed staging users, come back to a snapshot and restore accounts. This will + * give a peak into possible conflict accounts: + */ +/*db.users.count({ + "auth.local": {$exists: false}, + "auth.facebook": {$exists: false}, + "history.exp.5": {$exists: 1}, + $where: "this.todoIds.length != 1 && this.dailyIds.length != 3 && this.habitIds.length != 3 && this.rewardIds.length != 2" +})*/ + +/** + * Users used to be allowed to experiment with the site before registering. Every time a new browser visits habitrpg, a new + * "staged" account is created - and if the user later registers, that staged account is considered a "production" account. + * This function removes all staged accounts, since the new site doesn't supported staged accounts, and when we add that feature + * in we'll be using localStorage anyway instead of creating a new database record + */ +db.users.remove({ + // Un-registered users + "auth.local": {$exists: false}, + "auth.facebook": {$exists: false} +}); + +/** + * Remove empty parties + * Another vestige of Racer. Empty parties shouldn't be being created anymore in the new site + */ +db.groups.remove({ + 'type': 'party', + $where: "return this.members.length === 0" +}); \ No newline at end of file diff --git a/migrations/20131022_purchased_and_newStuff.js b/migrations/20131022_purchased_and_newStuff.js new file mode 100644 index 0000000000..862d9e107f --- /dev/null +++ b/migrations/20131022_purchased_and_newStuff.js @@ -0,0 +1,5 @@ +db.users.find().forEach(function(user){ + if (!user.purchased) user.purchased = {hair: {}, skin: {}}; + user.purchased.ads = user.flags && !!user.flags.ads; + db.users.update({_id:user._id}, {$set:{'purchased': user.purchased, 'flags.newStuff': true}, $unset: {'flags.ads':1}}); +}); \ No newline at end of file diff --git a/migrations/20131022_restore_ads.js b/migrations/20131022_restore_ads.js new file mode 100644 index 0000000000..6261990664 --- /dev/null +++ b/migrations/20131022_restore_ads.js @@ -0,0 +1,12 @@ +// node .migrations/20131022_restore_ads.js +var mongo = require('mongoskin'); +var _ = require('lodash'); +var dbBackup = mongo.db('localhost:27017/habitrpg?auto_reconnect'); +var dbLive = mongo.db('localhost:27017/habitrpg2?auto_reconnect'); +var count = 89474; +dbBackup.collection('users').findEach({$or: [{'flags.ads':'show'}, {'flags.ads': null}]}, {batchSize:10}, function(err, item) { + if (err) return console.error({err:err}); + if (!item || !item._id) return console.error('blank user'); + dbLive.collection('users').update({_id:item._id}, {$set:{'purchased.ads':false}, $unset: {'flags.ads': 1}}); + if (--count <= 0) console.log("DONE!"); +}); \ No newline at end of file diff --git a/migrations/20131028_task_subdocs_tags_invites.js b/migrations/20131028_task_subdocs_tags_invites.js new file mode 100644 index 0000000000..8b8cdeced0 --- /dev/null +++ b/migrations/20131028_task_subdocs_tags_invites.js @@ -0,0 +1,126 @@ +// mongo habitrpg ./node_modules/lodash/lodash.js ./migrations/20131028_task_subdocs_tags_invites.js + +// TODO it might be better we just find() and save() all user objects using mongoose, and rely on our defined pre('save') +// and default values to "migrate" users. This way we can make sure those parts are working properly too +// @see http://stackoverflow.com/questions/14867697/mongoose-full-collection-scan +//Also, what do we think of a Mongoose Migration module? something like https://github.com/madhums/mongoose-migrate + +db.users.find().forEach(function(user){ + + // Add invites to groups + // ------------------------- + if(user.invitations){ + if(user.invitations.party){ + db.groups.update({_id: user.invitations.party.id}, {$addToSet:{invites:user._id}}); + } + + if(user.invitations.guilds){ + _.each(user.invitations.guilds, function(guild){ + db.groups.update({_id: guild.id}, {$addToSet:{invites:user._id}}); + }); + } + } + + // Cleanup broken tags + // ------------------------- + _.each(user.tasks, function(task){ + _.each(task.tags, function(val, key){ + _.each(user.tags, function(tag){ + if(key == tag.id) delete task.tags[key]; + }); + }); + }); + + // Fix corrupt dates + // ------------------------- + user.lastCron = new Date(user.lastCron); + if (user.lastCron == 'Invalid Date') user.lastCron = new Date(); + if (user.auth) { // what to do with !auth? + _.defaults(user.auth, {timestamps: {created:undefined, loggedin: undefined}}); + _.defaults(user.auth.timestamps, {created: new Date(user.lastCron), loggedin: new Date(user.lastCron)}); + } + + // Fix missing history + // ------------------------- + _.defaults(user, {history:{}}); + _.defaults(user.history,{exp:[], todos:[]}); + + // Add username + // ------------------------- + if (!user.profile) user.profile = {name:undefined}; + if (_.isEmpty(user.profile.name) && user.auth) { + var fb = user.auth.facebook; + user.profile.name = + (user.auth.local && user.auth.local.username) || + (fb && (fb.displayName || fb.name || fb.username || (fb.first_name && fb.first_name + ' ' + fb.last_name))) || + 'Anonymous'; + } + + // Migrate to TaskSchema Sub-Docs! + // ------------------------- + if (!user.tasks) { + // So evidentaly users before 02/2013 were ALREADY setup based on habits[], dailys[], etcs... I don't remember our schema + // ever being that way... Anyway, print busted users here (they don't have tasks, but also don't have the right schema) + if (!user.habits || !user.dailys || !user.todos || !user.rewards) { + print(user._id); + } + } else { + _.each(['habit', 'daily', 'todo', 'reward'], function(type) { + // we use _.transform instead of a simple _.where in order to maintain sort-order + user[type + "s"] = _.reduce(user[type + "Ids"], function(m, tid) { + var task = user.tasks[tid], + newTask = {}; + if (!task) return m; // remove null tasks + + // Cleanup tasks for TaskSchema + newTask._id = newTask.id = task.id; + newTask.text = (_.isString(task.text)) ? task.text : ''; + if (_.isString(task.notes)) newTask.notes = task.notes; + newTask.tags = (_.isObject(task.tags)) ? task.tags : {}; + newTask.type = (_.isString(task.type)) ? task.type : 'habit'; + newTask.value = (_.isNumber(task.value)) ? task.value : 0; + newTask.priority = (_.isString(task.priority)) ? task.priority : '!'; + switch (newTask.type) { + case 'habit': + newTask.up = (_.isBoolean(task.up)) ? task.up : true; + newTask.down = (_.isBoolean(task.down)) ? task.down : true; + newTask.history = (_.isArray(task.history)) ? task.history : []; + break; + case 'daily': + newTask.repeat = (_.isObject(task.repeat)) ? task.repeat : {m:1, t:1, w:1, th:1, f:1, s:1, su:1}; + newTask.streak = (_.isNumber(task.streak)) ? task.streak : 0; + newTask.completed = (_.isBoolean(task.completed)) ? task.completed : false; + newTask.history = (_.isArray(task.history)) ? task.history : []; + break; + case 'todo': + newTask.completed = (_.isBoolean(task.completed)) ? task.completed : false; + break; + } + + m.push(newTask); + return m; + }, []); + delete user[type + 'Ids']; + }); + delete user.tasks; + } + + try { + db.users.update({_id:user._id}, user); + } catch(e) { + print(e); + } +}); + +// Remove old groups.*.challenges, they're not compatible with the new system, set member counts +// ------------------------- +db.groups.find().forEach(function(group){ + db.groups.update({_id:group._id}, { + $set:{memberCount: _.size(group.members)}, + $pull:{challenges:1} + }) +}); + +// HabitRPG => Tavern +// ------------------------- +db.groups.update({_id:'habitrpg'}, {$set:{name:'Tavern'}}); \ No newline at end of file diff --git a/migrations/20131102_restore_task_ids.js b/migrations/20131102_restore_task_ids.js new file mode 100644 index 0000000000..260675fbf5 --- /dev/null +++ b/migrations/20131102_restore_task_ids.js @@ -0,0 +1,25 @@ +// mongo habitrpg ./node_modules/lodash/lodash.js ./migrations/20131028_task_subdocs_tags_invites.js + +db.challenges.find().forEach(function(chal){ + _.each(chal.habits.concat(chal.dailys).concat(chal.todos).concat(chal.rewards), function(task){ + task.id = task.id || task._id; + }) + try { + db.challenges.update({_id:chal._id}, chal); + db.groups.update({_id:chal.group}, {$addToSet:{challenges:chal._id}}) + } catch(e) { + print(e); + } +}); + +db.users.find().forEach(function(user){ + _.each(user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards), function(task){ + task.id = task.id || task._id; + }) + try { + db.users.update({_id:user._id}, user); + } catch(e) { + print(e); + } +}); + diff --git a/migrations/20131104_remove_invalid_dues.js b/migrations/20131104_remove_invalid_dues.js new file mode 100644 index 0000000000..8ebf89afaf --- /dev/null +++ b/migrations/20131104_remove_invalid_dues.js @@ -0,0 +1,7 @@ +db.users.find({},{todos:1}).forEach(function(user){ + _.each(user.todos, function(task){ + if (moment(task.date).toDate() == 'Invalid Date') + task.date = moment().format('MM/DD/YYYY'); + }) + db.users.update({_id:user._id}, {$set:{todos: user.todos}}); +}); \ No newline at end of file diff --git a/migrations/20131104_restore_lost_task_data.js b/migrations/20131104_restore_lost_task_data.js new file mode 100644 index 0000000000..02095383f5 --- /dev/null +++ b/migrations/20131104_restore_lost_task_data.js @@ -0,0 +1,54 @@ +// node .migrations/20131104_restore_lost_task_data.js + +/** + * After the great challenges migration, quite a few things got inadvertently dropped from tasks since their + * schemas became more strict. See conversation at https://github.com/HabitRPG/habitrpg/issues/1712 , + * this restores task tags, streaks, due-dates, values + */ +var mongo = require('mongoskin'); +var _ = require('lodash'); + +var backupUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users'); +var liveUsers = mongo.db('localhost:27017/habitrpg_new?auto_reconnect').collection('users'); + +backupUsers.count(function(err, count){ + if (err) return console.error(err); + backupUsers.findEach({}, {batchSize:10}, function(err, before){ + if (err) return console.error(err); + if (!before) return console.log('!before'); + liveUsers.findById(before._id, function(err, after){ + if (err) return console.error(err); + if (!after) { + count--; + return console.log(before._id + ' deleted?'); + } + if (before._id == '9') console.log('lefnire processed'); + _.each(before.tasks, function(tBefore){ + var tAfter = _.find(after[tBefore.type+'s'], {id:tBefore.id}); + if (!tAfter) return; // task has been deleted since launch + + // Restore deleted tags + if (!_.isEmpty(tBefore.tags) && _.isEmpty(tAfter.tags)) + tAfter.tags = tBefore.tags; + // Except tags which are no longer available on the updated user + _.each(tAfter.tags, function(v,k){ //value is true, key is tag.id + if (!_.find(after.tags,{id:k})) delete tAfter.tags[k]; + }) + + // Restore deleted streaks + if (+tBefore.streak > tAfter.streak) + tAfter.streak = +tBefore.streak; + + if (!!tBefore.date && !tAfter.date) + tAfter.date = tBefore.date; + + // Restore deleted values + if (+tBefore.value != 0 && tAfter.value == 0) + tAfter.value = +tBefore.value; + }) + after._v++; + liveUsers.update({_id:after._id}, after); + if (--count <= 0) console.log("DONE!"); + }) + }); +}); \ No newline at end of file diff --git a/migrations/20131105_remove_history_ids.js b/migrations/20131105_remove_history_ids.js new file mode 100644 index 0000000000..9ddbff620e --- /dev/null +++ b/migrations/20131105_remove_history_ids.js @@ -0,0 +1,21 @@ +function deleteId(h){ + delete h._id; +} + +db.users.find({},{habits:1,dailys:1,history:1}).forEach(function(user){ + if (user.history) { + _.each(['todos','exp'], function(type){ + if (user.history[type]) { + _.each(user.history.exp, deleteId); + } + }) + } else { + user.history = {exp:[],todos:[]}; + } + + _.each(['habits', 'dailys'], function(type){ + _.each(user[type].history, deleteId); + }); + + db.users.update({_id:user._id}, {$set:{history: user.history, habits: user.habits, dailys: user.dailys}}); +}); \ No newline at end of file diff --git a/migrations/20131107_from_backer_to_contributor.js b/migrations/20131107_from_backer_to_contributor.js new file mode 100644 index 0000000000..d5a4ee851b --- /dev/null +++ b/migrations/20131107_from_backer_to_contributor.js @@ -0,0 +1,18 @@ +db.users.find({ + $or: [ + {'backer.admin':{$exists:1}}, + {'backer.contributor':{$exists:1}} + ] +},{backer:1}).forEach(function(user){ + user.contributor = {}; + user.contributor.admin = user.backer.admin; + delete user.backer.admin; + + // this isnt' the proper storage format, but I'm going to be going through the admin utility manually and setting things properly + if (user.backer.contributor) { + user.contributor.text = user.backer.contributor; + delete user.backer.contributor; + } + + db.users.update({_id:user._id}, {$set:{backer:user.backer, contributor:user.contributor}}); +}); \ No newline at end of file diff --git a/migrations/20131108_add_gems_for_contribs.js b/migrations/20131108_add_gems_for_contribs.js new file mode 100644 index 0000000000..03ff44e721 --- /dev/null +++ b/migrations/20131108_add_gems_for_contribs.js @@ -0,0 +1,4 @@ +// Increase everyone's gems per their contribution level +db.users.find({'contributor.level':{$gt:0}},{contributor:1, balance:1}).forEach(function(user){ + db.users.update({_id:user._id}, {$inc: {balance: (user.contributor.level * .5)} }); +}); \ No newline at end of file diff --git a/migrations/csvexport.py b/migrations/csvexport.py index f50799e73b..4aa607cb33 100644 --- a/migrations/csvexport.py +++ b/migrations/csvexport.py @@ -1,10 +1,10 @@ import csv -data = csv.reader(open('/home/slappybag/backrs/800dollar.csv', 'rb'), delimiter=",", quotechar='|') -column = [] +with open(r"/home/slappybag/Documents/SurveyScrape.csv") as f: + reader = csv.reader(f, delimiter=',', quotechar='"') + column = [] + for row in reader: + if row: + column.append(row[4]) -for row in data: - column.append(row[9]) - -print "one:" print column \ No newline at end of file diff --git a/migrations/facebook_to_local.js b/migrations/facebook_to_local.js new file mode 100644 index 0000000000..c8238a77fc --- /dev/null +++ b/migrations/facebook_to_local.js @@ -0,0 +1,10 @@ +var oldId = "", + newId = "", + newUser = db.users.findOne({_id: newId}) + +db.users.update({_id: oldId}, {$set:{auth: newUser.auth}}); + +// remove the auth on the new user (which is a template account). The account will be preened automatically later, +// this allows us to keep the account around a few days in case there was a mistake +db.users.update({_id: newId}, {$unset:{auth:1}}); + diff --git a/migrations/find_unique_user.js b/migrations/find_unique_user.js index c72de09f36..20ee902754 100644 --- a/migrations/find_unique_user.js +++ b/migrations/find_unique_user.js @@ -1,4 +1,4 @@ -// mongo habitrpg ./node_modules/underscore/underscore.js ./migrations/find_unique_user.js +// mongo habitrpg ./node_modules/lodash/index.js ./migrations/find_unique_user.js /** * There are some rare instances of lost user accounts, due to a corrupt user auth variable (see https://github.com/lefnire/habitrpg/wiki/User-ID) @@ -6,6 +6,6 @@ */ db.users.find().forEach(function(user){ - var found = _.findWhere(user.tasks, {text: "Replace Me"}) + var found = _.any(user.tasks, {text: "Replace Me"}) if (found) printjson({id:user._id, auth:user.auth}); }) \ No newline at end of file diff --git a/migrations/metrics.js b/migrations/metrics.js new file mode 100644 index 0000000000..d044011f00 --- /dev/null +++ b/migrations/metrics.js @@ -0,0 +1,86 @@ +// node habitrpg ./migrations/metrics.js + +var EXPORT_EMAILS = true; +var mongo = require('mongoskin'); +var csv = require('csv'); +var _ = require('lodash'); +var moment = require('moment'); +var db = mongo.db('localhost:27017/habitrpg2?auto_reconnect'); +var twoWeeksAgo = moment().subtract(14, 'days'); +var angularRewrite = moment('07/09/2013'); + +var query = {auth: {'$exists':1}}; +var fields = {lastCron:1, 'history.exp':1, 'auth.timestamps':1, 'auth.local.email':1}; +db.collection('users').find(query, fields).toArray(function(err, items) { + if (err) return console.error({err:err}); + var stats = {total: _.size(items), lostToDerby: 0, isActive: 0}; + var emails = []; + _.each(items, function(item) { + //if (!item.history || !item.history.exp) console.log(item._id) + + //var hasBeenActive = item.history && item.history.exp && item.history.exp.length > 7; + var hasBeenActive = item.auth.timestamps && item.auth.timestamps.created && + (Math.abs(moment(item.lastCron).diff(item.auth.timestamps.created, 'd')) > 14); + + if (/*hasBeenActive && */moment(item.lastCron).isBefore(angularRewrite)) { + stats.lostToDerby++; + if (item.auth.local) + emails.push([item.auth.local.email]); + // Facebook emails. Kinda dirty, and there's only ~30 available fb emails anyway. +// } else if (item.auth.facebook && item.auth.facebook.email) { +// emails.push([item.auth.facebook.email]) +// } else if (item.auth.facebook && item.auth.facebook.emails && item.auth.facebook.emails[0] && !!item.auth.facebook.emails[0].value) { +// emails.push([item.auth.facebook.emails[0].value]) + } + if (hasBeenActive && moment(item.lastCron).isAfter(twoWeeksAgo)) { + stats.isActive++; + } + + }) + stats.emails = _.size(emails); + console.log(stats); + + if (EXPORT_EMAILS) + csv().from.array(emails).to.path(__dirname+'/emails.csv') +}); + +/* +load('./node_modules/moment/moment.js'); +var today = +new Date, + twoWeeksAgo = +moment().subtract(14, 'days'); + + corrupt = { + $or: [ + {lastCron: {$exists:false}}, + {lastCron: 'new'} + ] + } + + un_registered = { + "auth.local": {$exists: false}, + "auth.facebook": {$exists: false} + }, + + registered = { + $or: [ + { 'auth.local': { $exists: true }}, + { 'auth.facebook': { $exists: true }} + ] + }, + + active = { + $or: [ + { 'auth.local': { $exists: true }}, + { 'auth.facebook': { $exists: true }} + ], + $where: function(){ + return this.history && this.history.exp && this.history.exp.length > 7; + }, + 'lastCron': {$gt: twoWeeksAgo} + }; + +print('corrupt: ' + db.users.count(corrupt)); +print('unregistered: ' + db.users.count(un_registered)); +print('registered: ' + db.users.count(registered)); +print('active: ' + db.users.count(active)); +*/ \ No newline at end of file diff --git a/migrations/new_stuff.js b/migrations/new_stuff.js index fa517671a6..df2d59e795 100644 --- a/migrations/new_stuff.js +++ b/migrations/new_stuff.js @@ -1 +1 @@ -db.users.update({},{$set:{'flags.newStuff':'show'}},{multi:true}) \ No newline at end of file +db.users.update({},{$set:{'flags.newStuff':true}},{multi:true}) \ No newline at end of file diff --git a/package.json b/package.json index fd5f3a31de..8d7d1f36d8 100644 --- a/package.json +++ b/package.json @@ -1,32 +1,48 @@ { "name": "habitrpg", "description": "A habit tracker app which treats your goals like a Role Playing Game.", - "version": "0.0.0-151", - "main": "./server.js", + "version": "0.0.0-152", + "main": "./src/server.js", "dependencies": { - "derby": "git://github.com/lefnire/derby#habitrpg", - "racer": "git://github.com/lefnire/racer#habitrpg", - "racer-db-mongo": "git://github.com/lefnire/racer-db-mongo#habitrpg", - "derby-ui-boot": "git://github.com/codeparty/derby-ui-boot#master", + "habitrpg-shared": "git://github.com/HabitRPG/habitrpg-shared#master", "derby-auth": "git://github.com/lefnire/derby-auth#master", "connect-mongo": "*", - "passport-facebook": "*", + "passport-facebook": "~1.0.0", "express": "*", "gzippo": "*", "guid": "*", "moment": "*", "stripe": "*", - "lodash": "1.0.x", - "coffee-script": "1.4.x", - "underscore": "*", - "mongoskin": "*", + "coffee-script": "*", "nconf": "*", "icalendar": "git://github.com/lefnire/node-icalendar#master", "superagent": "~0.12.4", "resolve": "~0.2.3", "expect.js": "~0.2.0", - "derby-i18n": "git://github.com/switz/derby-i18n#master", - "relative-date": "~1.1.1" + "relative-date": "~1.1.1", + "lodash": "~2.2.1", + "async": "~0.2.9", + "optimist": "~0.5.2", + "mongoose": "~3.6.20", + "stylus": "~0.37.0", + "grunt": "~0.4.1", + "grunt-contrib-uglify": "~0.2.4", + "grunt-contrib-stylus": "~0.8.0", + "grunt-contrib-clean": "~0.5.0", + "grunt-contrib-cssmin": "~0.6.1", + "grunt-contrib-watch": "~0.5.3", + "grunt-contrib-copy": "~0.4.1", + "grunt-hashres": "~0.3.2", + "grunt-nodemon": "~0.1.1", + "grunt-concurrent": "~0.3.1", + "bower": "~1.2.4", + "nib": "~1.0.1", + "jade": "~0.35.0", + "passport": "~0.1.17", + "validator": "~1.5.1", + "nodemailer": "~0.5.2", + "grunt-cli": "~0.1.9", + "paypal-ipn": "~1.0.1" }, "private": true, "subdomain": "habitrpg", @@ -35,11 +51,30 @@ "www.habitrpg.com" ], "engines": { - "node": "0.8.x", - "npm": "1.1.x" + "node": "0.10.x", + "npm": "1.2.x" }, "scripts": { - "start": "server.js", - "test": "mocha test/api.mocha.coffee" + "test": "grunt karma:continuous", + "start": "grunt run:dev", + "postinstall": "./node_modules/bower/bin/bower install -f" + }, + "devDependencies": { + "karma-ng-scenario": "~0.1.0", + "grunt-karma": "~0.6.2", + "karma-script-launcher": "~0.1.0", + "karma-chrome-launcher": "~0.1.0", + "karma-firefox-launcher": "~0.1.0", + "karma-html2js-preprocessor": "~0.1.0", + "karma-coffee-preprocessor": "~0.1.0", + "karma-jasmine": "~0.1.3", + "karma-requirejs": "~0.1.0", + "karma-phantomjs-launcher": "~0.1.0", + "karma": "~0.10.2", + "karma-ng-html2js-preprocessor": "~0.1.0", + "karma-chai-plugins": "~0.1.0", + "mocha": "~1.12.1", + "karma-mocha": "~0.1.0", + "csv": "~0.3.6" } } diff --git a/public/500.html b/public/500.html index 9d4d7270d1..b03f0740bb 100644 --- a/public/500.html +++ b/public/500.html @@ -11,7 +11,7 @@ - + -->
- -

The server is experiencing issues.

-

Try again in a few, the developer has been notified. The most likely culprit is this issue which Tyler is working to fix. (Any memory leak experts?)

+ +

The server is respawning.

+

Try again in a few. We restart often due to this issue, and we're rewriting the site to fix it. (AngularJS developers, come join us!)

+ +

If this page persists, the server may be experiencing issues; the developers have been notified. Try switching to the beta site or the main site.

diff --git a/public/css/README.md b/public/css/README.md new file mode 100644 index 0000000000..2c35f4c53f --- /dev/null +++ b/public/css/README.md @@ -0,0 +1 @@ +We need to extract any sprite-sheet css in this directory (anything that's not habitrpg-web specific) and move it to habitrpg-shared \ No newline at end of file diff --git a/styles/app/alerts.styl b/public/css/alerts.styl similarity index 64% rename from styles/app/alerts.styl rename to public/css/alerts.styl index da23d0feaa..1054938f0a 100644 --- a/styles/app/alerts.styl +++ b/public/css/alerts.styl @@ -1,18 +1,20 @@ .new-stuff - position: fixed - text-align: center - top: 0 - left: 0 - width: 100% - height: 0 - z-index: 1010 + position: fixed + text-align: center + top: 0 + left: 0 + width: 100% + height: 0 + z-index: 1010 .new-stuff> .alert - border-top: 0 - border-radius: 0 0 4px 4px - padding-right: 14px - display: inline-block + border-top: 0 + border-radius: 0 0 4px 4px + padding-right: 14px + display: inline-block +.wide-popover + max-width: 400px // variables @@ -58,21 +60,21 @@ borderDarken = 20% // alert icons .icon-gold - background: url("img/coin_single_gold.png") no-repeat + background: url("/bower_components/habitrpg-shared/img/coin_single_gold.png") no-repeat background-position: center center background-size: 18px width: 14px height: 14px .icon-silver - background: url("img/coin_single_silver.png") no-repeat + background: url("/bower_components/habitrpg-shared/img/coin_single_silver.png") no-repeat background-position: center center background-size: 18px width: 14px height: 14px .icon-death - background: url("img/sprites/dead.png") no-repeat + background: url("/bower_components/habitrpg-shared/img/sprites/dead.png") no-repeat background-position: center center background-size: 14px width: 14px @@ -83,18 +85,4 @@ borderDarken = 20% z-index: 3000 position:absolute left:5px - top:5px - -// Bailey - -.rewards-module - z-index:2000 - -.hiding-bailey - cursor: pointer - position:absolute - right: 50px - top: 117px //FIXME this isn't a good method, but i suck at css - tyler - -.new-stuff-word-bubble-container - height: 90px \ No newline at end of file + top:5px \ No newline at end of file diff --git a/styles/app/avatar.styl b/public/css/avatar.styl similarity index 88% rename from styles/app/avatar.styl rename to public/css/avatar.styl index 8f43e95dcb..9a346da167 100644 --- a/styles/app/avatar.styl +++ b/public/css/avatar.styl @@ -40,7 +40,7 @@ future re: pets and whatnot, this is just temporary. // always visible on the user's own avatar .herobox:after opacity: 0 -.herobox[data-checkuser="isUser"]:after +.herobox.isUser:after opacity: 1 // make it a bit special background darken($better, 15%) @@ -54,18 +54,18 @@ future re: pets and whatnot, this is just temporary. // vertically center avatar sprite // depending on if they have a pet -.herobox[data-checkpet="hasPet"] +.herobox.hasPet padding-top: 2em -.herobox:not([data-checkpet="hasPet"]) +.herobox:not(.hasPet) padding-top: 1.75em // if it is the user's avatar, check if // they have a pet and pad accordingly -.herobox[data-checkpet="hasPet"][data-checkuser="isUser"] +.herobox.hasPet.isUser padding-top: 3.25em // if not user's avatar, remove lines for party unity -.herobox:not([data-checkuser="isUser"]) +.herobox:not(.isUser) outline: 0 // expose hero info on hover, taking @@ -74,10 +74,10 @@ future re: pets and whatnot, this is just temporary. background: desaturate(lighten($better, 30%), 10%) &:after opacity: 1 -.herobox[data-checkpet="hasPet"] +.herobox.hasPet &:hover, &:focus padding-top: 3.25em -.herobox:not([data-checkpet="hasPet"]) +.herobox:not(.hasPet) &:hover, &:focus padding-top: 2.5em diff --git a/public/css/challenges.styl b/public/css/challenges.styl new file mode 100644 index 0000000000..98d12edb17 --- /dev/null +++ b/public/css/challenges.styl @@ -0,0 +1,21 @@ +ul.challenge-accordion-header-specs + list-style:none + + li + background-color: darken($neutral, 10%) + margin: 2px 5px + float:left + +#create-challenge-btn + margin-bottom: 10px + +#challenges-filters h3 + margin-top: 0px; + +// for things like challenges, member profiles, etc +@media (min-width: 767px) + .wide-modal + /* new custom width */ + width: 1020px; + /* must be half of the width, minus scrollbar on the left (30px) */ + margin-left: -480px; \ No newline at end of file diff --git a/styles/app/color-vars.styl b/public/css/color-vars.styl similarity index 100% rename from styles/app/color-vars.styl rename to public/css/color-vars.styl diff --git a/styles/app/customizer.styl b/public/css/customizer.styl similarity index 94% rename from styles/app/customizer.styl rename to public/css/customizer.styl index 7cbbdf3360..e61402f24b 100644 --- a/styles/app/customizer.styl +++ b/public/css/customizer.styl @@ -50,4 +50,8 @@ menu .customize-menu { width: 100%; } -} \ No newline at end of file +} + +.well.limited-edition + padding: 5px + margin: 0px \ No newline at end of file diff --git a/public/css/docs.css b/public/css/docs.css deleted file mode 100644 index af65540928..0000000000 --- a/public/css/docs.css +++ /dev/null @@ -1,1067 +0,0 @@ -/* Add additional stylesheets below --------------------------------------------------- */ -/* - Bootstrap's documentation styles - Special styles for presenting Bootstrap's documentation and examples -*/ - - - -/* Body and structure --------------------------------------------------- */ - -body { - position: relative; - padding-top: 40px; -} - -/* Code in headings */ -h3 code { - font-size: 14px; - font-weight: normal; -} - - - -/* Tweak navbar brand link to be super sleek --------------------------------------------------- */ - -body > .navbar { - font-size: 13px; -} - -/* Change the docs' brand */ -body > .navbar .brand { - padding-right: 0; - padding-left: 0; - margin-left: 20px; - float: right; - font-weight: bold; - color: #000; - text-shadow: 0 1px 0 rgba(255,255,255,.1), 0 0 30px rgba(255,255,255,.125); - -webkit-transition: all .2s linear; - -moz-transition: all .2s linear; - transition: all .2s linear; -} -body > .navbar .brand:hover { - text-decoration: none; - text-shadow: 0 1px 0 rgba(255,255,255,.1), 0 0 30px rgba(255,255,255,.4); -} - - -/* Sections --------------------------------------------------- */ - -/* padding for in-page bookmarks and fixed navbar */ -section { - padding-top: 30px; -} -section > .page-header, -section > .lead { - color: #5a5a5a; -} -section > ul li { - margin-bottom: 5px; -} - -/* Separators (hr) */ -.bs-docs-separator { - margin: 40px 0 39px; -} - -/* Faded out hr */ -hr.soften { - height: 1px; - margin: 70px 0; - background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); - background-image: -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); - background-image: -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); - background-image: -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); - border: 0; -} - - - -/* Jumbotrons --------------------------------------------------- */ - -/* Base class -------------------------- */ -.jumbotron { - position: relative; - padding: 40px 0; - color: #fff; - text-align: center; - text-shadow: 0 1px 3px rgba(0,0,0,.4), 0 0 30px rgba(0,0,0,.075); - background: #020031; /* Old browsers */ - background: -moz-linear-gradient(45deg, #020031 0%, #6d3353 100%); /* FF3.6+ */ - background: -webkit-gradient(linear, left bottom, right top, color-stop(0%,#020031), color-stop(100%,#6d3353)); /* Chrome,Safari4+ */ - background: -webkit-linear-gradient(45deg, #020031 0%,#6d3353 100%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(45deg, #020031 0%,#6d3353 100%); /* Opera 11.10+ */ - background: -ms-linear-gradient(45deg, #020031 0%,#6d3353 100%); /* IE10+ */ - background: linear-gradient(45deg, #020031 0%,#6d3353 100%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#020031', endColorstr='#6d3353',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ - -webkit-box-shadow: inset 0 3px 7px rgba(0,0,0,.2), inset 0 -3px 7px rgba(0,0,0,.2); - -moz-box-shadow: inset 0 3px 7px rgba(0,0,0,.2), inset 0 -3px 7px rgba(0,0,0,.2); - box-shadow: inset 0 3px 7px rgba(0,0,0,.2), inset 0 -3px 7px rgba(0,0,0,.2); -} -.jumbotron h1 { - font-size: 80px; - font-weight: bold; - letter-spacing: -1px; - line-height: 1; -} -.jumbotron p { - font-size: 24px; - font-weight: 300; - line-height: 1.25; - margin-bottom: 30px; -} - -/* Link styles (used on .masthead-links as well) */ -.jumbotron a { - color: #fff; - color: rgba(255,255,255,.5); - -webkit-transition: all .2s ease-in-out; - -moz-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.jumbotron a:hover { - color: #fff; - text-shadow: 0 0 10px rgba(255,255,255,.25); -} - -/* Download button */ -.masthead .btn { - padding: 19px 24px; - font-size: 24px; - font-weight: 200; - color: #fff; /* redeclare to override the `.jumbotron a` */ - border: 0; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); - -webkit-transition: none; - -moz-transition: none; - transition: none; -} -.masthead .btn:hover { - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25); -} -.masthead .btn:active { - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.1); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.1); - box-shadow: inset 0 2px 4px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.1); -} - - -/* Pattern overlay -------------------------- */ -.jumbotron .container { - position: relative; - z-index: 2; -} -.jumbotron:after { - content: ''; - display: block; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: url(../img/bs-docs-masthead-pattern.png) repeat center center; - opacity: .4; -} -@media -only screen and (-webkit-min-device-pixel-ratio: 2), -only screen and ( min--moz-device-pixel-ratio: 2), -only screen and ( -o-min-device-pixel-ratio: 2/1) { - - .jumbotron:after { - background-size: 150px 150px; - } - -} - -/* Masthead (docs home) -------------------------- */ -.masthead { - padding: 70px 0 80px; - margin-bottom: 0; - color: #fff; -} -.masthead h1 { - font-size: 120px; - line-height: 1; - letter-spacing: -2px; -} -.masthead p { - font-size: 40px; - font-weight: 200; - line-height: 1.25; -} - -/* Textual links in masthead */ -.masthead-links { - margin: 0; - list-style: none; -} -.masthead-links li { - display: inline; - padding: 0 10px; - color: rgba(255,255,255,.25); -} - -/* Social proof buttons from GitHub & Twitter */ -.bs-docs-social { - padding: 15px 0; - text-align: center; - background-color: #f5f5f5; - border-top: 1px solid #fff; - border-bottom: 1px solid #ddd; -} - -/* Quick links on Home */ -.bs-docs-social-buttons { - margin-left: 0; - margin-bottom: 0; - padding-left: 0; - list-style: none; -} -.bs-docs-social-buttons li { - display: inline-block; - padding: 5px 8px; - line-height: 1; - *display: inline; - *zoom: 1; -} - -/* Subhead (other pages) -------------------------- */ -.subhead { - text-align: left; - border-bottom: 1px solid #ddd; -} -.subhead h1 { - font-size: 60px; -} -.subhead p { - margin-bottom: 20px; -} -.subhead .navbar { - display: none; -} - - - -/* Marketing section of Overview --------------------------------------------------- */ - -.marketing { - text-align: center; - color: #5a5a5a; -} -.marketing h1 { - margin: 60px 0 10px; - font-size: 60px; - font-weight: 200; - line-height: 1; - letter-spacing: -1px; -} -.marketing h2 { - font-weight: 200; - margin-bottom: 5px; -} -.marketing p { - font-size: 16px; - line-height: 1.5; -} -.marketing .marketing-byline { - margin-bottom: 40px; - font-size: 20px; - font-weight: 300; - line-height: 1.25; - color: #999; -} -.marketing-img { - display: block; - margin: 0 auto 30px; - max-height: 145px; -} - - - -/* Footer --------------------------------------------------- */ - -.footer { - text-align: center; - padding: 30px 0; - margin-top: 70px; - border-top: 1px solid #e5e5e5; - background-color: #f5f5f5; -} -.footer p { - margin-bottom: 0; - color: #777; -} -.footer-links { - margin: 10px 0; -} -.footer-links li { - display: inline; - padding: 0 2px; -} -.footer-links li:first-child { - padding-left: 0; -} - - - -/* Special grid styles --------------------------------------------------- */ - -.show-grid { - margin-top: 10px; - margin-bottom: 20px; -} -.show-grid [class*="span"] { - background-color: #eee; - text-align: center; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - min-height: 40px; - line-height: 40px; -} -.show-grid [class*="span"]:hover { - background-color: #ddd; -} -.show-grid .show-grid { - margin-top: 0; - margin-bottom: 0; -} -.show-grid .show-grid [class*="span"] { - margin-top: 5px; -} -.show-grid [class*="span"] [class*="span"] { - background-color: #ccc; -} -.show-grid [class*="span"] [class*="span"] [class*="span"] { - background-color: #999; -} - - - -/* Mini layout previews --------------------------------------------------- */ -.mini-layout { - border: 1px solid #ddd; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.075); - -moz-box-shadow: 0 1px 2px rgba(0,0,0,.075); - box-shadow: 0 1px 2px rgba(0,0,0,.075); -} -.mini-layout, -.mini-layout .mini-layout-body, -.mini-layout.fluid .mini-layout-sidebar { - height: 300px; -} -.mini-layout { - margin-bottom: 20px; - padding: 9px; -} -.mini-layout div { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.mini-layout .mini-layout-body { - background-color: #dceaf4; - margin: 0 auto; - width: 70%; -} -.mini-layout.fluid .mini-layout-sidebar, -.mini-layout.fluid .mini-layout-header, -.mini-layout.fluid .mini-layout-body { - float: left; -} -.mini-layout.fluid .mini-layout-sidebar { - background-color: #bbd8e9; - width: 20%; -} -.mini-layout.fluid .mini-layout-body { - width: 77.5%; - margin-left: 2.5%; -} - - - -/* Download page --------------------------------------------------- */ - -.download .page-header { - margin-top: 36px; -} -.page-header .toggle-all { - margin-top: 5px; -} - -/* Space out h3s when following a section */ -.download h3 { - margin-bottom: 5px; -} -.download-builder input + h3, -.download-builder .checkbox + h3 { - margin-top: 9px; -} - -/* Fields for variables */ -.download-builder input[type=text] { - margin-bottom: 9px; - font-family: Menlo, Monaco, "Courier New", monospace; - font-size: 12px; - color: #d14; -} -.download-builder input[type=text]:focus { - background-color: #fff; -} - -/* Custom, larger checkbox labels */ -.download .checkbox { - padding: 6px 10px 6px 25px; - font-size: 13px; - line-height: 18px; - color: #555; - background-color: #f9f9f9; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - cursor: pointer; -} -.download .checkbox:hover { - color: #333; - background-color: #f5f5f5; -} -.download .checkbox small { - font-size: 12px; - color: #777; -} - -/* Variables section */ -#variables label { - margin-bottom: 0; -} - -/* Giant download button */ -.download-btn { - margin: 36px 0 108px; -} -#download p, -#download h4 { - max-width: 50%; - margin: 0 auto; - color: #999; - text-align: center; -} -#download h4 { - margin-bottom: 0; -} -#download p { - margin-bottom: 18px; -} -.download-btn .btn { - display: block; - width: auto; - padding: 19px 24px; - margin-bottom: 27px; - font-size: 30px; - line-height: 1; - text-align: center; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - - - -/* Misc --------------------------------------------------- */ - -/* Make tables spaced out a bit more */ -h2 + table, -h3 + table, -h4 + table, -h2 + .row { - margin-top: 5px; -} - -/* Example sites showcase */ -.example-sites { - xmargin-left: 20px; -} -.example-sites img { - max-width: 100%; - margin: 0 auto; -} - -.scrollspy-example { - height: 200px; - overflow: auto; - position: relative; -} - - -/* Fake the :focus state to demo it */ -.focused { - border-color: rgba(82,168,236,.8); - -webkit-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6); - outline: 0; -} - -/* For input sizes, make them display block */ -.docs-input-sizes select, -.docs-input-sizes input[type=text] { - display: block; - margin-bottom: 9px; -} - -/* Icons -------------------------- */ -.the-icons { - margin-left: 0; - list-style: none; -} -.the-icons li { - float: left; - width: 25%; - line-height: 25px; -} -.the-icons i:hover { - background-color: rgba(255,0,0,.25); -} - -/* Example page -------------------------- */ -.bootstrap-examples h4 { - margin: 10px 0 5px; -} -.bootstrap-examples p { - font-size: 13px; - line-height: 18px; -} -.bootstrap-examples .thumbnail { - margin-bottom: 9px; - background-color: #fff; -} - - - -/* Bootstrap code examples --------------------------------------------------- */ - -/* Base class */ -.bs-docs-example { - position: relative; - margin: 15px 0; - padding: 39px 19px 14px; - *padding-top: 19px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -/* Echo out a label for the example */ -.bs-docs-example:after { - content: "Example"; - position: absolute; - top: -1px; - left: -1px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - background-color: #f5f5f5; - border: 1px solid #ddd; - color: #9da0a4; - -webkit-border-radius: 4px 0 4px 0; - -moz-border-radius: 4px 0 4px 0; - border-radius: 4px 0 4px 0; -} - -/* Remove spacing between an example and it's code */ -.bs-docs-example + .prettyprint { - margin-top: -20px; - padding-top: 15px; -} - -/* Tweak examples -------------------------- */ -.bs-docs-example > p:last-child { - margin-bottom: 0; -} -.bs-docs-example .table, -.bs-docs-example .progress, -.bs-docs-example .well, -.bs-docs-example .alert, -.bs-docs-example .hero-unit, -.bs-docs-example .pagination, -.bs-docs-example .navbar, -.bs-docs-example > .nav, -.bs-docs-example blockquote { - margin-bottom: 5px; -} -.bs-docs-example .pagination { - margin-top: 0; -} -.bs-navbar-top-example, -.bs-navbar-bottom-example { - z-index: 1; - padding: 0; - height: 90px; - overflow: hidden; /* cut the drop shadows off */ -} -.bs-navbar-top-example .navbar-fixed-top, -.bs-navbar-bottom-example .navbar-fixed-bottom { - margin-left: 0; - margin-right: 0; -} -.bs-navbar-top-example { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.bs-navbar-top-example:after { - top: auto; - bottom: -1px; - -webkit-border-radius: 0 4px 0 4px; - -moz-border-radius: 0 4px 0 4px; - border-radius: 0 4px 0 4px; -} -.bs-navbar-bottom-example { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.bs-navbar-bottom-example .navbar { - margin-bottom: 0; -} -form.bs-docs-example { - padding-bottom: 19px; -} - -/* Images */ -.bs-docs-example-images img { - margin: 10px; - display: inline-block; -} - -/* Tooltips */ -.bs-docs-tooltip-examples { - text-align: center; - margin: 0 0 10px; - list-style: none; -} -.bs-docs-tooltip-examples li { - display: inline; - padding: 0 10px; -} - -/* Popovers */ -.bs-docs-example-popover { - padding-bottom: 24px; - background-color: #f9f9f9; -} -.bs-docs-example-popover .popover { - position: relative; - display: block; - float: left; - width: 260px; - margin: 20px; -} - -/* Dropdowns */ -.bs-docs-example-submenus { - min-height: 180px; -} -.bs-docs-example-submenus > .pull-left + .pull-left { - margin-left: 20px; -} -.bs-docs-example-submenus .dropup > .dropdown-menu, -.bs-docs-example-submenus .dropdown > .dropdown-menu { - display: block; - position: static; - margin-bottom: 5px; - *width: 180px; -} - - - -/* Responsive docs --------------------------------------------------- */ - -/* Utility classes table -------------------------- */ -.responsive-utilities th small { - display: block; - font-weight: normal; - color: #999; -} -.responsive-utilities tbody th { - font-weight: normal; -} -.responsive-utilities td { - text-align: center; -} -.responsive-utilities td.is-visible { - color: #468847; - background-color: #dff0d8 !important; -} -.responsive-utilities td.is-hidden { - color: #ccc; - background-color: #f9f9f9 !important; -} - -/* Responsive tests -------------------------- */ -.responsive-utilities-test { - margin-top: 5px; - margin-left: 0; - list-style: none; - overflow: hidden; /* clear floats */ -} -.responsive-utilities-test li { - position: relative; - float: left; - width: 25%; - height: 43px; - font-size: 14px; - font-weight: bold; - line-height: 43px; - color: #999; - text-align: center; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.responsive-utilities-test li + li { - margin-left: 10px; -} -.responsive-utilities-test span { - position: absolute; - top: -1px; - left: -1px; - right: -1px; - bottom: -1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.responsive-utilities-test span { - color: #468847; - background-color: #dff0d8; - border: 1px solid #d6e9c6; -} - - - -/* Sidenav for Docs --------------------------------------------------- */ - -.bs-docs-sidenav { - width: 228px; - margin: 30px 0 0; - padding: 0; - background-color: #fff; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.065); - -moz-box-shadow: 0 1px 4px rgba(0,0,0,.065); - box-shadow: 0 1px 4px rgba(0,0,0,.065); -} -.bs-docs-sidenav > li > a { - display: block; - width: 190px \9; - margin: 0 0 -1px; - padding: 8px 14px; - border: 1px solid #e5e5e5; -} -.bs-docs-sidenav > li:first-child > a { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} -.bs-docs-sidenav > li:last-child > a { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} -.bs-docs-sidenav > .active > a { - position: relative; - z-index: 2; - padding: 9px 15px; - border: 0; - text-shadow: 0 1px 0 rgba(0,0,0,.15); - -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1); - -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1); - box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1); -} -/* Chevrons */ -.bs-docs-sidenav .icon-chevron-right { - float: right; - margin-top: 2px; - margin-right: -6px; - opacity: .25; -} -.bs-docs-sidenav > li > a:hover { - background-color: #f5f5f5; -} -.bs-docs-sidenav a:hover .icon-chevron-right { - opacity: .5; -} -.bs-docs-sidenav .active .icon-chevron-right, -.bs-docs-sidenav .active a:hover .icon-chevron-right { - background-image: url(../img/glyphicons-halflings-white.png); - opacity: 1; -} -.bs-docs-sidenav.affix { - top: 40px; -} -.bs-docs-sidenav.affix-bottom { - position: absolute; - top: auto; - bottom: 270px; -} - - - - -/* Responsive --------------------------------------------------- */ - -/* Desktop large -------------------------- */ -@media (min-width: 1200px) { - .bs-docs-container { - max-width: 970px; - } - .bs-docs-sidenav { - width: 258px; - } - .bs-docs-sidenav > li > a { - width: 230px \9; /* Override the previous IE8-9 hack */ - } -} - -/* Desktop -------------------------- */ -@media (max-width: 980px) { - /* Unfloat brand */ - body > .navbar-fixed-top .brand { - float: left; - margin-left: 0; - padding-left: 10px; - padding-right: 10px; - } - - /* Inline-block quick links for more spacing */ - .quick-links li { - display: inline-block; - margin: 5px; - } - - /* When affixed, space properly */ - .bs-docs-sidenav { - top: 0; - width: 218px; - margin-top: 30px; - margin-right: 0; - } -} - -/* Tablet to desktop -------------------------- */ -@media (min-width: 768px) and (max-width: 979px) { - /* Remove any padding from the body */ - body { - padding-top: 0; - } - /* Widen masthead and social buttons to fill body padding */ - .jumbotron { - margin-top: -20px; /* Offset bottom margin on .navbar */ - } - /* Adjust sidenav width */ - .bs-docs-sidenav { - width: 166px; - margin-top: 20px; - } - .bs-docs-sidenav.affix { - top: 0; - } -} - -/* Tablet -------------------------- */ -@media (max-width: 767px) { - /* Remove any padding from the body */ - body { - padding-top: 0; - } - - /* Widen masthead and social buttons to fill body padding */ - .jumbotron { - padding: 40px 20px; - margin-top: -20px; /* Offset bottom margin on .navbar */ - margin-right: -20px; - margin-left: -20px; - } - .masthead h1 { - font-size: 90px; - } - .masthead p, - .masthead .btn { - font-size: 24px; - } - .marketing .span4 { - margin-bottom: 40px; - } - .bs-docs-social { - margin: 0 -20px; - } - - /* Space out the show-grid examples */ - .show-grid [class*="span"] { - margin-bottom: 5px; - } - - /* Sidenav */ - .bs-docs-sidenav { - width: auto; - margin-bottom: 20px; - } - .bs-docs-sidenav.affix { - position: static; - width: auto; - top: 0; - } - - /* Unfloat the back to top link in footer */ - .footer { - margin-left: -20px; - margin-right: -20px; - padding-left: 20px; - padding-right: 20px; - } - .footer p { - margin-bottom: 9px; - } -} - -/* Landscape phones -------------------------- */ -@media (max-width: 480px) { - /* Remove padding above jumbotron */ - body { - padding-top: 0; - } - - /* Change up some type stuff */ - h2 small { - display: block; - } - - /* Downsize the jumbotrons */ - .jumbotron h1 { - font-size: 45px; - } - .jumbotron p, - .jumbotron .btn { - font-size: 18px; - } - .jumbotron .btn { - display: block; - margin: 0 auto; - } - - /* center align subhead text like the masthead */ - .subhead h1, - .subhead p { - text-align: center; - } - - /* Marketing on home */ - .marketing h1 { - font-size: 30px; - } - .marketing-byline { - font-size: 18px; - } - - /* center example sites */ - .example-sites { - margin-left: 0; - } - .example-sites > li { - float: none; - display: block; - max-width: 280px; - margin: 0 auto 18px; - text-align: center; - } - .example-sites .thumbnail > img { - max-width: 270px; - } - - /* Do our best to make tables work in narrow viewports */ - table code { - white-space: normal; - word-wrap: break-word; - word-break: break-all; - } - - /* Examples: dropdowns */ - .bs-docs-example-submenus > .pull-left { - float: none; - clear: both; - } - .bs-docs-example-submenus > .pull-left, - .bs-docs-example-submenus > .pull-left + .pull-left { - margin-left: 0; - } - .bs-docs-example-submenus p { - margin-bottom: 0; - } - .bs-docs-example-submenus .dropup > .dropdown-menu, - .bs-docs-example-submenus .dropdown > .dropdown-menu { - margin-bottom: 10px; - float: none; - max-width: 180px; - } - - /* Examples: modal */ - .modal-example .modal { - position: relative; - top: auto; - right: auto; - bottom: auto; - left: auto; - } - - /* Tighten up footer */ - .footer { - padding-top: 20px; - padding-bottom: 20px; - } -} diff --git a/styles/app/filters.styl b/public/css/filters.styl similarity index 100% rename from styles/app/filters.styl rename to public/css/filters.styl diff --git a/public/css/game-pane.styl b/public/css/game-pane.styl new file mode 100644 index 0000000000..086e922734 --- /dev/null +++ b/public/css/game-pane.styl @@ -0,0 +1,60 @@ +.full-width + width 100% + +.border-right + border-right 1px solid #ddd + +.tab-notification + color #fff + background-color #51a351 + +.tavern-pane + position relative + height 250px + +.tavern-chat, .party-chat + + li + padding-top:15px + padding-bottom:15px + border-bottom 1px solid #ddd + word-wrap:break-word + + &.highlight + background #EEE + + label + margin-right:5px + + .own-message + border-left: 4px solid #333 + padding-left: 2px + +// Name tags +.label-contributor-1, .label-contributor-2 + background-color: #333; +.label-contributor-3, .label-contributor-4 + background-color: #077409 + color: white +.label-contributor-5, .label-contributor-6 + background-color: #125BA2 + color: white +.label-contributor-7 + background-color: #7313B4 + color: white +.label-contributor-8 + background-color: #ff8000 + color: white +.label-npc + background-color: indianred + color: white + +#market-tab + position relative + height 500px + +.buttonList li + margin: 5px + +.option-group .option-time + padding: 0px 5px \ No newline at end of file diff --git a/styles/app/header.styl b/public/css/header.styl similarity index 96% rename from styles/app/header.styl rename to public/css/header.styl index ee5f71b9fb..a12f1b1408 100644 --- a/styles/app/header.styl +++ b/public/css/header.styl @@ -7,7 +7,9 @@ background: #f5f5f5 border-bottom: 1px solid rgba(0,0,0,0.2) // margin-top: -1px - overflow: hidden + overflow-y: hidden + overflow-x: auto + // position relative /* login/menu buttons --------------------- */ @@ -16,6 +18,11 @@ top: 0.5em right: 0.5em font-size: 0.85em + z-index: 1011 + + .site-nav + margin-bottom: 0px + .tile cursor: pointer font-weight: 400 diff --git a/styles/app/helpers.styl b/public/css/helpers.styl similarity index 100% rename from styles/app/helpers.styl rename to public/css/helpers.styl diff --git a/styles/app/index.styl b/public/css/index.styl similarity index 63% rename from styles/app/index.styl rename to public/css/index.styl index 27f1bd7c4f..62c4b06f1a 100644 --- a/styles/app/index.styl +++ b/public/css/index.styl @@ -1,30 +1,28 @@ -@import "nib/vendor"; +@import "nib/vendor" // Vendor Includes - include first so we can override -@import "../../public/vendor/bootstrap/css/bootstrap.min.css"; -@import "../../public/vendor/bootstrap/css/bootstrap-responsive.min.css"; -@import "../../public/vendor/datepicker/css/datepicker.css"; +// Import only styles that do not have urls to images! Include them directly in the page! +@import "../bower_components/bootstrap-datepicker/css/datepicker.css" +@import "../bower_components/angular-ui/build/angular-ui.min.css" +@import "../bower_components/bootstrap/docs/assets/css/bootstrap-responsive.css" +@import "../bower_components/bootstrap-tour/build/css/bootstrap-tour.min.css" +@import "../bower_components/angular-loading-bar/build/loading-bar.css" // Custom includes -@import "./female_sprites.styl"; -@import "./male_sprites.styl"; -@import "./shop_sprites.styl"; -@import "./tasks.styl"; -@import "./avatar.styl"; -@import "./customizer.styl"; -@import "./items.styl"; -@import "./inventory.styl"; -@import "./alerts.styl"; -@import "../../public/img/sprites/pet_sprites.css"; -@import "../../public/img/sprites/PetEggs.css"; -@import "./helpers.styl"; -@import "./responsive.styl"; -@import "./header.styl"; -@import "./filters.styl"; -@import "./scrollbars.styl"; -@import "./achievements.styl"; -@import "./game-pane.styl"; -@import "./backer.styl"; +@import "./tasks.styl" +@import "./avatar.styl" +@import "./customizer.styl" +@import "./items.styl" +@import "./inventory.styl" +@import "./alerts.styl" +@import "./helpers.styl" +@import "./responsive.styl" +@import "./header.styl" +@import "./filters.styl" +@import "./scrollbars.styl" +@import "./game-pane.styl" +@import "./npcs.styl" +@import "./challenges.styl" // fix exploding to very wide for some reason .datepicker @@ -146,7 +144,33 @@ hr position: fixed; top: 0; right: 0px; - z-index: 1001; + z-index: 1061; .modal-body margin: 10px + + +// TODO this is supposed to go in avatar.styl, but stylus is breaking if I even touch that file +.profile-modal-header + width:560px + margin: 0px auto + +.avatar-level + position absolute + bottom 0px + right 0px + background-color #dfe9ea + padding 1px 3px 1px 3px + +a + cursor: pointer + +#modalMember p + word-wrap: break-word + +.btn + margin-right: 5px + +.modal-indented-list + margin-left: 10px; + padding-left: 10px; \ No newline at end of file diff --git a/styles/app/inventory.styl b/public/css/inventory.styl similarity index 69% rename from styles/app/inventory.styl rename to public/css/inventory.styl index 911dcead61..fe5f84fd22 100644 --- a/styles/app/inventory.styl +++ b/public/css/inventory.styl @@ -1,5 +1,6 @@ .gem-wallet cursor: pointer + padding-top: 10px; .tile background-color: darken($neutral, 10%) .add-gems-btn @@ -11,6 +12,9 @@ .tile opacity: 1 +.modal-header .gem-wallet + padding-top: 0px + // pets (this will all change when pet system is overhauled) .pet-grid @@ -20,13 +24,24 @@ width: 100% td padding: 0.5em - width: 25% + //width: 25% &.active-pet background-color: $bad outline: 1px solid rgba(0,0,0,0.1) outline-offset: -1px &:hover, &:focus background-color: darken($better, 10%) + > div + margin:auto + margin-bottom:.5em + p + text-align:center + width:6.5em + height:2.5em + +menu.pets div + display: inline-block + padding-top: -30px .current-pet left: 0px @@ -38,16 +53,42 @@ padding-bottom:20px .Pet_Food_Base, .Pet_Food_Zombie, .Pet_Food_White, .Pet_Food_Veteran, .Pet_Food_Skeleton, .Pet_Food_Shade, .Pet_Food_Red, .Pet_Food_Golden, .Pet_Food_Desert, .Pet_Food_CottonCandyPink, .Pet_Food_CottonCandyBlue, .Pet_Food_Zombie, .Pet_Food_White, .Pet_Food_Skeleton, .Pet_Food_Shade, .Pet_Food_Red, .Pet_Food_Golden, .Pet_Food_Desert, .Pet_Food_CottonCandyPink, .Pet_Food_CottonCandyBlue, .Pet_Food_Base, .Pet_Food_Base, .Pet_Food_Zombie, .Pet_Food_White, .Pet_Food_Skeleton, .Pet_Food_Shade, .Pet_Food_Red, .Pet_Food_Golden, .Pet_Food_Desert, .Pet_Food_CottonCandyPink, .Pet_Food_CottonCandyBlue, .Pet_Food_Base, .Pet_Food_Zombie, .Pet_Food_White, .Pet_Food_Skeleton, .Pet_Food_Shade, .Pet_Food_Red, .Pet_Food_Golden, .Pet_Food_Desert, .Pet_Food_CottonCandyPink, .Pet_Food_CottonCandyBlue, .Pet_Food_Base, .Pet_Food_Zombie, .Pet_Food_White, .Pet_Food_Skeleton, .Pet_Food_Shade, .Pet_Food_Red, .Pet_Food_Golden, .Pet_Food_Desert, .Pet_Food_CottonCandyPink, .Pet_Food_CottonCandyBlue, .Pet_Food_Base, .Pet_Food_Zombie, .Pet_Food_White, .Pet_Food_Skeleton, .Pet_Food_Shade, .Pet_Food_Red, .Pet_Food_Golden, .Pet_Food_Desert, .Pet_Food_CottonCandyPink, .Pet_Food_CottonCandyBlue, .Pet_Food_Base, .Pet_Food_Zombie, .Pet_Food_White, .Pet_Food_Skeleton, .Pet_Food_Shade, .Pet_Food_Red, .Pet_Food_Golden, .Pet_Food_Desert, .Pet_Food_CottonCandyPink, .Pet_Food_CottonCandyBlue, .Pet_Food_Base, .Pet_Food_SugarCube, .Pet_Food_Strawberry, .Pet_Food_Rotten, .Pet_Food_Licorice, .Pet_Food_Golden, .Pet_Food_Cream, .Pet_Food_CottonCandyPink, .Pet_Food_CottonCandyBlue, .Pet_Food_Chocolate, .Pet_Food_Base, .Pet_Food_Zombie, .Pet_Food_White, .Pet_Food_Skeleton, .Pet_Food_Shade, .Pet_Food_Red, .Pet_Food_Golden, .Pet_Food_Desert, .Pet_Food_CottonCandyPink, .Pet_Food_CottonCandyBlue, .Pet_Food_Base - background: url("/img/hatching_powder.png") no-repeat + background: url("/bower_components/habitrpg-shared/img/hatching_powder.png") no-repeat width:34px height:34px +.Pet_Currency_Gem, .Pet_Currency_Gem2x, .Pet_Currency_Gem1x + background: url("/bower_components/habitrpg-shared/img/sprites/Egg_Sprite_Sheet.png") no-repeat + display:block + +.Pet_Currency_Gem {background-position: 0px -510px; width: 51px; height: 45px} /* Not an egg or potion so has a different size */ +.Pet_Currency_Gem2x {background-position: -55px -513px; width: 34px; height: 30px} +.Pet_Currency_Gem1x {background-position: -63px -542px; width: 19px; height: 17px} + +.inventory-list p + //display: none .inventory-list li clear:both .pets-menu > div - float:left -.hatchingPotions-menu > div - float:left + display:inline-block + vertical-align:top + padding:.3em + width:6em + margin-top:1em + p + text-align:center + width:6em + margin-top:-.5em +.hatchingPotion-menu > div + display:inline-block + vertical-align:top + padding:.3em + width:6em + margin-top:1em + p + text-align:center + width:6em + margin-top:-.5em .pet-button border: none @@ -62,3 +103,10 @@ -moz-filter: brightness(0%) -o-filter: brightness(0%) -ms-filter: brightness(0%)*/ + +.selectableInventory + background-color: lightgreen !important + +.sell-inventory + width: 162px + height: 138px \ No newline at end of file diff --git a/styles/app/items.styl b/public/css/items.styl similarity index 100% rename from styles/app/items.styl rename to public/css/items.styl diff --git a/public/css/npcs.styl b/public/css/npcs.styl new file mode 100644 index 0000000000..084a5c19d4 --- /dev/null +++ b/public/css/npcs.styl @@ -0,0 +1,36 @@ +.NPC-Alex, .NPC-Bailey, .NPC-Bailey-Head, .NPC-Daniel, .NPC-Justin, .NPC-Justin-Head, .NPC-Matt {background: url("/bower_components/habitrpg-shared/img/npcs/NPC-SpriteSheet.png") no-repeat} + +.NPC-Alex {background-position: 0 0; width: 162px; height: 138px;} +.NPC-Alex-container{margin-bottom: 20px;} +.NPC-Daniel {background-position: -222px 0; width: 135px; height: 123px} +.NPC-Justin {background-position: -357px 0; width: 84px; height: 119px} +.NPC-Justin-Head {background-position: -396px 0; width: 36px; height: 96px} +.NPC-Matt {background-position: -441px 0; width: 100%; padding-left: 208px; padding-bottom: 20px;} + +// Bailey +.NPC-Bailey + background-position: -162px -42px + width: 60px + height: 72px + float:left +.NPC-Bailey-Head + background-position: -168px -42px + width: 54px + height: 30px + position: absolute + top: 117px // 147 (header-height) - 30 (bailey height) + right: 50px + cursor: pointer + + +.static-popover + z-index 0 + display block + position:relative + +// Tour (Justin) +.NPC-Justin.float-left + float: left + margin-right: 5px + margin-bottom: 5px +.popover-navigation {clear:both;} \ No newline at end of file diff --git a/styles/app/responsive.styl b/public/css/responsive.styl similarity index 100% rename from styles/app/responsive.styl rename to public/css/responsive.styl diff --git a/styles/app/scrollbars.styl b/public/css/scrollbars.styl similarity index 100% rename from styles/app/scrollbars.styl rename to public/css/scrollbars.styl diff --git a/public/css/static-pages.css b/public/css/static-pages.css index cd3f93626e..f617e486e2 100644 --- a/public/css/static-pages.css +++ b/public/css/static-pages.css @@ -14,4 +14,8 @@ } body { padding-top:0px; +} + +a { + cursor: pointer; } \ No newline at end of file diff --git a/public/css/static.styl b/public/css/static.styl new file mode 100644 index 0000000000..b20358bcd4 --- /dev/null +++ b/public/css/static.styl @@ -0,0 +1,6 @@ +// Vendor Includes - include first so we can override +// Import only styles that do not have urls to images! Include them directly in the page! +@import "../bower_components/angular-loading-bar/build/loading-bar.css" + +@import "./static-pages.css" +@import "./footer.css" \ No newline at end of file diff --git a/styles/app/tasks.styl b/public/css/tasks.styl similarity index 98% rename from styles/app/tasks.styl rename to public/css/tasks.styl index 08db9535e9..680fd1ce65 100644 --- a/styles/app/tasks.styl +++ b/public/css/tasks.styl @@ -71,7 +71,7 @@ for $stage in $stages box-shadow: none background-color: white height: 3em - padding: 0 0 0 0.5em + padding: 0 3.3em 0 0.5em width: 100% &:focus box-shadow: inset 0 0 3px darken($best, 20%),inset -1px 0 1px darken($best, 30%) @@ -117,6 +117,11 @@ for $stage in $stages display: block padding: 0.75em 0 0.75em 3.5em line-height: 1.4 + word-wrap: break-word + +// task due date (for to-dos) +.task-date + font-size: 70% .habit-wide .task-text padding-left: 7em @@ -326,7 +331,7 @@ form .option-short .option-content - width: 3em + width: 4em display: inline-block .input-suffix vertical-align: 20% diff --git a/public/img/PixelPaw.png b/public/img/PixelPaw.png deleted file mode 100644 index e298fc3fb0..0000000000 Binary files a/public/img/PixelPaw.png and /dev/null differ diff --git a/public/img/PixelPaw002.png b/public/img/PixelPaw002.png deleted file mode 100644 index 93774929cd..0000000000 Binary files a/public/img/PixelPaw002.png and /dev/null differ diff --git a/public/img/add.png b/public/img/add.png deleted file mode 100644 index f177dba4e7..0000000000 Binary files a/public/img/add.png and /dev/null differ diff --git a/public/img/bs-docs-masthead-pattern.png b/public/img/bs-docs-masthead-pattern.png deleted file mode 100644 index 75c46a152d..0000000000 Binary files a/public/img/bs-docs-masthead-pattern.png and /dev/null differ diff --git a/public/img/calendar_google.png b/public/img/calendar_google.png deleted file mode 100644 index d362e93fa1..0000000000 Binary files a/public/img/calendar_google.png and /dev/null differ diff --git a/public/img/calendar_ical.png b/public/img/calendar_ical.png deleted file mode 100644 index f4094b56a4..0000000000 Binary files a/public/img/calendar_ical.png and /dev/null differ diff --git a/public/img/coin_single_gold.png b/public/img/coin_single_gold.png deleted file mode 100644 index 2ed267760e..0000000000 Binary files a/public/img/coin_single_gold.png and /dev/null differ diff --git a/public/img/coin_single_silver.png b/public/img/coin_single_silver.png deleted file mode 100644 index d2a16a58fd..0000000000 Binary files a/public/img/coin_single_silver.png and /dev/null differ diff --git a/public/img/facebook-login-register.jpeg b/public/img/facebook-login-register.jpeg deleted file mode 100644 index 32f16d4978..0000000000 Binary files a/public/img/facebook-login-register.jpeg and /dev/null differ diff --git a/public/img/glyphicons-halflings-white.png b/public/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484a29..0000000000 Binary files a/public/img/glyphicons-halflings-white.png and /dev/null differ diff --git a/public/img/glyphicons-halflings.png b/public/img/glyphicons-halflings.png deleted file mode 100644 index 79bc568c21..0000000000 Binary files a/public/img/glyphicons-halflings.png and /dev/null differ diff --git a/public/img/hatching_powder.png b/public/img/hatching_powder.png deleted file mode 100644 index 34db3dc933..0000000000 Binary files a/public/img/hatching_powder.png and /dev/null differ diff --git a/public/img/logo/habitrpg.jpg b/public/img/logo/habitrpg.jpg deleted file mode 100644 index d4025bd194..0000000000 Binary files a/public/img/logo/habitrpg.jpg and /dev/null differ diff --git a/public/img/logo/habitrpg_pixel.png b/public/img/logo/habitrpg_pixel.png deleted file mode 100644 index 4bd1c43f3b..0000000000 Binary files a/public/img/logo/habitrpg_pixel.png and /dev/null differ diff --git a/public/img/npcs/alex.png b/public/img/npcs/alex.png deleted file mode 100644 index c4d307fa81..0000000000 Binary files a/public/img/npcs/alex.png and /dev/null differ diff --git a/public/img/npcs/bailey-face.png b/public/img/npcs/bailey-face.png deleted file mode 100644 index ab9b667a3f..0000000000 Binary files a/public/img/npcs/bailey-face.png and /dev/null differ diff --git a/public/img/npcs/bailey.png b/public/img/npcs/bailey.png deleted file mode 100644 index 22274e70da..0000000000 Binary files a/public/img/npcs/bailey.png and /dev/null differ diff --git a/public/img/npcs/daniel.png b/public/img/npcs/daniel.png deleted file mode 100644 index 5aed8f3156..0000000000 Binary files a/public/img/npcs/daniel.png and /dev/null differ diff --git a/public/img/original_user.png b/public/img/original_user.png deleted file mode 100644 index 6bf1987738..0000000000 Binary files a/public/img/original_user.png and /dev/null differ diff --git a/public/img/party-unlocked.png b/public/img/party-unlocked.png deleted file mode 100644 index 5daba47f35..0000000000 Binary files a/public/img/party-unlocked.png and /dev/null differ diff --git a/public/img/play_screenshot.jpeg b/public/img/play_screenshot.jpeg deleted file mode 100644 index e25a82d650..0000000000 Binary files a/public/img/play_screenshot.jpeg and /dev/null differ diff --git a/public/img/remove.png b/public/img/remove.png deleted file mode 100644 index a12b5c701c..0000000000 Binary files a/public/img/remove.png and /dev/null differ diff --git a/public/img/screenshot.jpeg b/public/img/screenshot.jpeg deleted file mode 100644 index bb8f7d5c63..0000000000 Binary files a/public/img/screenshot.jpeg and /dev/null differ diff --git a/public/img/sprites/Armor6_m.xcf b/public/img/sprites/Armor6_m.xcf deleted file mode 100644 index dd0e8aee61..0000000000 Binary files a/public/img/sprites/Armor6_m.xcf and /dev/null differ diff --git a/public/img/sprites/Armor7_m.xcf b/public/img/sprites/Armor7_m.xcf deleted file mode 100644 index 65359e2754..0000000000 Binary files a/public/img/sprites/Armor7_m.xcf and /dev/null differ diff --git a/public/img/sprites/Armor8_m.xcf b/public/img/sprites/Armor8_m.xcf deleted file mode 100644 index 782d199f22..0000000000 Binary files a/public/img/sprites/Armor8_m.xcf and /dev/null differ diff --git a/public/img/sprites/Egg_Sprite_Sheet.png b/public/img/sprites/Egg_Sprite_Sheet.png deleted file mode 100644 index 9220fbde8f..0000000000 Binary files a/public/img/sprites/Egg_Sprite_Sheet.png and /dev/null differ diff --git a/public/img/sprites/Mount-SpriteSheet.png b/public/img/sprites/Mount-SpriteSheet.png deleted file mode 100644 index 36531b7b50..0000000000 Binary files a/public/img/sprites/Mount-SpriteSheet.png and /dev/null differ diff --git a/public/img/sprites/Mounts.css b/public/img/sprites/Mounts.css deleted file mode 100644 index 06ea775b2b..0000000000 --- a/public/img/sprites/Mounts.css +++ /dev/null @@ -1,13 +0,0 @@ -.Mount_Head_Lion, .Mount_Body_Lion, .Mount_Head_PolarBear, .Mount_Body_PolarBear, .Mount_Head_Panda, .Mount_Body_Panda, .Mount_Head_Tiger, .Mount_Body_Tiger, .Mount_Head_Bear, .Mount_Body_Bear, .Mount_Head_EtherealLion, .Mount_Body_EtherealLion {background: url(Mount-SpriteSheet.png) no-repeat} -.Mount_Head_Lion {background-position: 0 0; width: 105px; height: 123px} -.Mount_Body_Lion {background-position: -105 0; width: 105px; height: 123px} -.Mount_Head_PolarBear {background-position: -210 0; width: 105px; height: 123px} -.Mount_Body_PolarBear {background-position: -315 0; width: 105px; height: 123px} -.Mount_Head_Panda {background-position: -420 0; width: 105px; height: 123px} -.Mount_Body_Panda {background-position: -525 0; width: 105px; height: 123px} -.Mount_Head_Tiger {background-position: -630 0; width: 105px; height: 123px} -.Mount_Body_Tiger {background-position: -735 0; width: 105px; height: 123px} -.Mount_Head_Bear {background-position: -840 0; width: 105px; height: 123px} -.Mount_Body_Bear {background-position: -945 0; width: 105px; height: 123px} -.Mount_Head_EtherealLion {background-position: -1050 0; width: 105px; height: 123px} -.Mount_Body_EtherealLion {background-position: -1155 0; width: 105px; height: 123px} diff --git a/public/img/sprites/PetEggs.css b/public/img/sprites/PetEggs.css deleted file mode 100644 index b334806c84..0000000000 --- a/public/img/sprites/PetEggs.css +++ /dev/null @@ -1,26 +0,0 @@ -.Pet_Egg_Wolf, .Pet_Egg_TigerCub, .Pet_Egg_PolarBear, .Pet_Egg_PandaCub, .Pet_Egg_LionCub, .Pet_Egg_Fox, .Pet_Egg_FlyingPig, .Pet_Egg_Dragon, .Pet_Egg_Cactus, .Pet_Egg_BearCub, .Pet_HatchingPotion_Base, .Pet_HatchingPotion_White, .Pet_HatchingPotion_Desert, .Pet_HatchingPotion_Red, .Pet_HatchingPotion_Shade, .Pet_HatchingPotion_Skeleton, .Pet_HatchingPotion_Zombie, .Pet_HatchingPotion_CottonCandyPink, .Pet_HatchingPotion_CottonCandyBlue, .Pet_HatchingPotion_Golden, .Pet_Currency_Gem, .Pet_Currency_Gem2x, .Pet_Currency_Gem1x {background: url("/img/sprites/Egg_Sprite_Sheet.png") no-repeat} -.Pet_Egg_Wolf {background-position: 0px 0px; width: 48px; height: 51px} -.Pet_Egg_TigerCub {background-position: 0px -51px; width: 48px; height: 51px} -.Pet_Egg_PolarBear {background-position: 0px -102px; width: 48px; height: 51px} -.Pet_Egg_PandaCub {background-position: 0px -153px; width: 48px; height: 51px} -.Pet_Egg_LionCub {background-position: 0px -204px; width: 48px; height: 51px} -.Pet_Egg_Fox {background-position: 0px -255px; width: 48px; height: 51px} -.Pet_Egg_FlyingPig {background-position: 0px -306px; width: 48px; height: 51px} -.Pet_Egg_Dragon {background-position: 0px -357px; width: 48px; height: 51px} -.Pet_Egg_Cactus {background-position: 0px -408px; width: 48px; height: 51px} -.Pet_Egg_BearCub {background-position: 0px -459px; width: 48px; height: 51px} - -.Pet_HatchingPotion_Base {background-position: -48px -0px; width: 48px; height: 51px} -.Pet_HatchingPotion_White {background-position: -48px -51px; width: 48px; height: 51px} -.Pet_HatchingPotion_Desert {background-position: -48px -102px; width: 48px; height: 51px} -.Pet_HatchingPotion_Red {background-position: -48px -153px; width: 48px; height: 51px} -.Pet_HatchingPotion_Shade {background-position: -48px -204px; width: 48px; height: 51px} -.Pet_HatchingPotion_Skeleton {background-position: -48px -255px; width: 48px; height: 51px} -.Pet_HatchingPotion_Zombie {background-position: -48px -306px; width: 48px; height: 51px} -.Pet_HatchingPotion_CottonCandyPink {background-position: -48px -357px; width: 48px; height: 51px} -.Pet_HatchingPotion_CottonCandyBlue {background-position: -48px -408px; width: 48px; height: 51px} -.Pet_HatchingPotion_Golden {background-position: -48px -459px; width: 48px; height: 51px} - -.Pet_Currency_Gem {background-position: 0px -510px; width: 51px; height: 45px} /* Not an egg or potion so has a different size */ -.Pet_Currency_Gem2x {background-position: -55px -513px; width: 34px; height: 30px} -.Pet_Currency_Gem1x {background-position: -63px -542px; width: 19px; height: 17px} diff --git a/public/img/sprites/achievements.png b/public/img/sprites/achievements.png deleted file mode 100644 index e703785cde..0000000000 Binary files a/public/img/sprites/achievements.png and /dev/null differ diff --git a/public/img/sprites/backer-only/BackerOnly-Equip-CrystalArmor.gif b/public/img/sprites/backer-only/BackerOnly-Equip-CrystalArmor.gif deleted file mode 100644 index c76801bd49..0000000000 Binary files a/public/img/sprites/backer-only/BackerOnly-Equip-CrystalArmor.gif and /dev/null differ diff --git a/public/img/sprites/backer-only/BackerOnly-Equip-CrystalHelmet.gif b/public/img/sprites/backer-only/BackerOnly-Equip-CrystalHelmet.gif deleted file mode 100644 index 2ab7126e54..0000000000 Binary files a/public/img/sprites/backer-only/BackerOnly-Equip-CrystalHelmet.gif and /dev/null differ diff --git a/public/img/sprites/backer-only/BackerOnly-Equip-ShadeArmor.gif b/public/img/sprites/backer-only/BackerOnly-Equip-ShadeArmor.gif deleted file mode 100644 index 29e6163234..0000000000 Binary files a/public/img/sprites/backer-only/BackerOnly-Equip-ShadeArmor.gif and /dev/null differ diff --git a/public/img/sprites/backer-only/BackerOnly-Equip-ShadeHelmet.gif b/public/img/sprites/backer-only/BackerOnly-Equip-ShadeHelmet.gif deleted file mode 100644 index c9dfc7f627..0000000000 Binary files a/public/img/sprites/backer-only/BackerOnly-Equip-ShadeHelmet.gif and /dev/null differ diff --git a/public/img/sprites/backer-only/BackerOnly-Pet-CerberusPup.gif b/public/img/sprites/backer-only/BackerOnly-Pet-CerberusPup.gif deleted file mode 100644 index ba8bd6f1d5..0000000000 Binary files a/public/img/sprites/backer-only/BackerOnly-Pet-CerberusPup.gif and /dev/null differ diff --git a/public/img/sprites/backer-only/BackerOnly-Shield-TormentedSkull.gif b/public/img/sprites/backer-only/BackerOnly-Shield-TormentedSkull.gif deleted file mode 100644 index 272fe914e6..0000000000 Binary files a/public/img/sprites/backer-only/BackerOnly-Shield-TormentedSkull.gif and /dev/null differ diff --git a/public/img/sprites/backer-only/BackerOnly-Shop-temporary.png b/public/img/sprites/backer-only/BackerOnly-Shop-temporary.png deleted file mode 100644 index 0cb735dcb7..0000000000 Binary files a/public/img/sprites/backer-only/BackerOnly-Shop-temporary.png and /dev/null differ diff --git a/public/img/sprites/backer-only/BackerOnly-SpriteSheet.png b/public/img/sprites/backer-only/BackerOnly-SpriteSheet.png deleted file mode 100644 index 6431a15d04..0000000000 Binary files a/public/img/sprites/backer-only/BackerOnly-SpriteSheet.png and /dev/null differ diff --git a/public/img/sprites/backer-only/BackerOnly-Weapon-DarkSoulsBlade.gif b/public/img/sprites/backer-only/BackerOnly-Weapon-DarkSoulsBlade.gif deleted file mode 100644 index 9634d1aed5..0000000000 Binary files a/public/img/sprites/backer-only/BackerOnly-Weapon-DarkSoulsBlade.gif and /dev/null differ diff --git a/public/img/sprites/css_sprite.png b/public/img/sprites/css_sprite.png deleted file mode 100644 index 0ecda867ed..0000000000 Binary files a/public/img/sprites/css_sprite.png and /dev/null differ diff --git a/public/img/sprites/dead.png b/public/img/sprites/dead.png deleted file mode 100644 index 38e882c706..0000000000 Binary files a/public/img/sprites/dead.png and /dev/null differ diff --git a/public/img/sprites/development.xcf b/public/img/sprites/development.xcf deleted file mode 100644 index c5d80bc5bd..0000000000 Binary files a/public/img/sprites/development.xcf and /dev/null differ diff --git a/public/img/sprites/favicon.png b/public/img/sprites/favicon.png deleted file mode 100644 index a1783aac99..0000000000 Binary files a/public/img/sprites/favicon.png and /dev/null differ diff --git a/public/img/sprites/female.xcf b/public/img/sprites/female.xcf deleted file mode 100644 index c2a9dbbf03..0000000000 Binary files a/public/img/sprites/female.xcf and /dev/null differ diff --git a/public/img/sprites/female_sprites b/public/img/sprites/female_sprites deleted file mode 100644 index a60eb31e8c..0000000000 --- a/public/img/sprites/female_sprites +++ /dev/null @@ -1,39 +0,0 @@ -weapon_6, weapon_5, weapon_4, weapon_3, weapon_2, weapon_1, weapon_0, shield_5, shield_4, shield_3, shield_2, shield_1, head_5_v2, head_5_v1, head_4_v2, head_4_v1, head_3_v2, head_3_v1, head_2_v2, head_2_v1, head_1, head_0, hair_white, hair_brown, hair_black, hair_blond, armor_5, armor_4, armor_3, armor_2, armor_1, armor_0_v2, armor_0_v1, skin_dead, skin_orc, skin_asian, skin_black, skin_white {background: url(female_sprites.png) no-repeat} -weapon_6 {background-position: 0 0; width: 90px; height: 90px} -weapon_5 {background-position: -90px 0; width: 90px; height: 90px} -weapon_4 {background-position: -180px 0; width: 90px; height: 90px} -weapon_3 {background-position: -270px 0; width: 90px; height: 90px} -weapon_2 {background-position: -360px 0; width: 90px; height: 90px} -weapon_1 {background-position: -450px 0; width: 90px; height: 90px} -weapon_0 {background-position: -540px 0; width: 90px; height: 90px} -shield_5 {background-position: -630px 0; width: 90px; height: 90px} -shield_4 {background-position: -720px 0; width: 90px; height: 90px} -shield_3 {background-position: -810px 0; width: 90px; height: 90px} -shield_2 {background-position: -900px 0; width: 90px; height: 90px} -shield_1 {background-position: -990px 0; width: 90px; height: 90px} -head_5_v2 {background-position: -1080px 0; width: 90px; height: 90px} -head_5_v1 {background-position: -1170px 0; width: 90px; height: 90px} -head_4_v2 {background-position: -1260px 0; width: 90px; height: 90px} -head_4_v1 {background-position: -1350px 0; width: 90px; height: 90px} -head_3_v2 {background-position: -1440px 0; width: 90px; height: 90px} -head_3_v1 {background-position: -1530px 0; width: 90px; height: 90px} -head_2_v2 {background-position: -1620px 0; width: 90px; height: 90px} -head_2_v1 {background-position: -1710px 0; width: 90px; height: 90px} -head_1 {background-position: -1800px 0; width: 90px; height: 90px} -head_0 {background-position: -1890px 0; width: 90px; height: 90px} -hair_white {background-position: -1980px 0; width: 90px; height: 90px} -hair_brown {background-position: -2070px 0; width: 90px; height: 90px} -hair_black {background-position: -2160px 0; width: 90px; height: 90px} -hair_blond {background-position: -2250px 0; width: 90px; height: 90px} -armor_5 {background-position: -2340px 0; width: 90px; height: 90px} -armor_4 {background-position: -2430px 0; width: 90px; height: 90px} -armor_3 {background-position: -2520px 0; width: 90px; height: 90px} -armor_2 {background-position: -2610px 0; width: 90px; height: 90px} -armor_1 {background-position: -2700px 0; width: 90px; height: 90px} -armor_0_v2 {background-position: -2790px 0; width: 90px; height: 90px} -armor_0_v1 {background-position: -2880px 0; width: 90px; height: 90px} -skin_dead {background-position: -2970px 0; width: 90px; height: 90px} -skin_orc {background-position: -3060px 0; width: 90px; height: 90px} -skin_asian {background-position: -3150px 0; width: 90px; height: 90px} -skin_black {background-position: -3240px 0; width: 90px; height: 90px} -skin_white {background-position: -3330px 0; width: 90px; height: 90px} diff --git a/public/img/sprites/female_sprites.png b/public/img/sprites/female_sprites.png deleted file mode 100644 index 1456ff6336..0000000000 Binary files a/public/img/sprites/female_sprites.png and /dev/null differ diff --git a/public/img/sprites/full.xcf b/public/img/sprites/full.xcf deleted file mode 100644 index b46740f83c..0000000000 Binary files a/public/img/sprites/full.xcf and /dev/null differ diff --git a/public/img/sprites/male.xcf b/public/img/sprites/male.xcf deleted file mode 100644 index e7b34464d0..0000000000 Binary files a/public/img/sprites/male.xcf and /dev/null differ diff --git a/public/img/sprites/male_sprites.css b/public/img/sprites/male_sprites.css deleted file mode 100644 index 3e04632432..0000000000 --- a/public/img/sprites/male_sprites.css +++ /dev/null @@ -1,34 +0,0 @@ -weapon_6, weapon_5, weapon_4, weapon_3, weapon_2, weapon_1, weapon_0, shield_5, shield_4, shield_3, shield_2, shield_1, head_5, head_4, head_3, head_2, head_1, head_0, hair blond, hair black, hair brown, hair white, armor_5, armor_4, armor_3, armor_2, armor_1, armor_0, skin_dead, skin_orc, skin_asian, skin_black, skin_white {background: url(male_sprites.png) no-repeat} -weapon_6 {background-position: 0 0; width: 90px; height: 90px} -weapon_5 {background-position: -90px 0; width: 90px; height: 90px} -weapon_4 {background-position: -180px 0; width: 90px; height: 90px} -weapon_3 {background-position: -270px 0; width: 90px; height: 90px} -weapon_2 {background-position: -360px 0; width: 90px; height: 90px} -weapon_1 {background-position: -450px 0; width: 90px; height: 90px} -weapon_0 {background-position: -540px 0; width: 90px; height: 90px} -shield_5 {background-position: -630px 0; width: 90px; height: 90px} -shield_4 {background-position: -720px 0; width: 90px; height: 90px} -shield_3 {background-position: -810px 0; width: 90px; height: 90px} -shield_2 {background-position: -900px 0; width: 90px; height: 90px} -shield_1 {background-position: -990px 0; width: 90px; height: 90px} -head_5 {background-position: -1080px 0; width: 90px; height: 90px} -head_4 {background-position: -1170px 0; width: 90px; height: 90px} -head_3 {background-position: -1260px 0; width: 90px; height: 90px} -head_2 {background-position: -1350px 0; width: 90px; height: 90px} -head_1 {background-position: -1440px 0; width: 90px; height: 90px} -head_0 {background-position: -1530px 0; width: 90px; height: 90px} -hair blond {background-position: -1620px 0; width: 90px; height: 90px} -hair black {background-position: -1710px 0; width: 90px; height: 90px} -hair brown {background-position: -1800px 0; width: 90px; height: 90px} -hair white {background-position: -1890px 0; width: 90px; height: 90px} -armor_5 {background-position: -1980px 0; width: 90px; height: 90px} -armor_4 {background-position: -2070px 0; width: 90px; height: 90px} -armor_3 {background-position: -2160px 0; width: 90px; height: 90px} -armor_2 {background-position: -2250px 0; width: 90px; height: 90px} -armor_1 {background-position: -2340px 0; width: 90px; height: 90px} -armor_0 {background-position: -2430px 0; width: 90px; height: 90px} -skin_dead {background-position: -2520px 0; width: 90px; height: 90px} -skin_orc {background-position: -2610px 0; width: 90px; height: 90px} -skin_asian {background-position: -2700px 0; width: 90px; height: 90px} -skin_black {background-position: -2790px 0; width: 90px; height: 90px} -skin_white {background-position: -2880px 0; width: 90px; height: 90px} diff --git a/public/img/sprites/male_sprites.png b/public/img/sprites/male_sprites.png deleted file mode 100644 index 126f9b1738..0000000000 Binary files a/public/img/sprites/male_sprites.png and /dev/null differ diff --git a/public/img/sprites/pet_sprites.css b/public/img/sprites/pet_sprites.css deleted file mode 100644 index 8dfeceafdb..0000000000 --- a/public/img/sprites/pet_sprites.css +++ /dev/null @@ -1,96 +0,0 @@ -.Pet-Wolf-Zombie, .Pet-Wolf-White, .Pet-Wolf-Veteran, .Pet-Wolf-Skeleton, .Pet-Wolf-Shade, .Pet-Wolf-Red, .Pet-Wolf-Golden, .Pet-Wolf-Desert, .Pet-Wolf-CottonCandyPink, .Pet-Wolf-CottonCandyBlue, .Pet-TigerCub-Zombie, .Pet-TigerCub-White, .Pet-TigerCub-Skeleton, .Pet-TigerCub-Shade, .Pet-TigerCub-Red, .Pet-TigerCub-Golden, .Pet-TigerCub-Desert, .Pet-TigerCub-CottonCandyPink, .Pet-TigerCub-CottonCandyBlue, .Pet-TigerCub-Base, .Pet-PolarBearCub-Base, .Pet-PandaCub-Zombie, .Pet-PandaCub-White, .Pet-PandaCub-Skeleton, .Pet-PandaCub-Shade, .Pet-PandaCub-Red, .Pet-PandaCub-Golden, .Pet-PandaCub-Desert, .Pet-PandaCub-CottonCandyPink, .Pet-PandaCub-CottonCandyBlue, .Pet-PandaCub-Base, .Pet-LionCub-Zombie, .Pet-LionCub-White, .Pet-LionCub-Skeleton, .Pet-LionCub-Shade, .Pet-LionCub-Red, .Pet-LionCub-Golden, .Pet-LionCub-Desert, .Pet-LionCub-CottonCandyPink, .Pet-LionCub-CottonCandyBlue, .Pet-LionCub-Base, .Pet-Fox-Zombie, .Pet-Fox-White, .Pet-Fox-Skeleton, .Pet-Fox-Shade, .Pet-Fox-Red, .Pet-Fox-Golden, .Pet-Fox-Desert, .Pet-Fox-CottonCandyPink, .Pet-Fox-CottonCandyBlue, .Pet-Fox-Base, .Pet-FlyingPig-Zombie, .Pet-FlyingPig-White, .Pet-FlyingPig-Skeleton, .Pet-FlyingPig-Shade, .Pet-FlyingPig-Red, .Pet-FlyingPig-Golden, .Pet-FlyingPig-Desert, .Pet-FlyingPig-CottonCandyPink, .Pet-FlyingPig-CottonCandyBlue, .Pet-FlyingPig-Base, .Pet-Dragon-Zombie, .Pet-Dragon-White, .Pet-Dragon-Skeleton, .Pet-Dragon-Shade, .Pet-Dragon-Red, .Pet-Dragon-Golden, .Pet-Dragon-Desert, .Pet-Dragon-CottonCandyPink, .Pet-Dragon-CottonCandyBlue, .Pet-Dragon-Base, .Pet-Cactus-Skeleton, .Pet-Cactus-Red, .Pet-Cactus-Zombie, .Pet-Cactus-Shade, .Pet-Cactus-Golden, .Pet-Cactus-White, .Pet-Cactus-CottonCandyPink, .Pet-Cactus-CottonCandyBlue, .Pet-Cactus-Desert, .Pet-Cactus-Base, .Pet-BearCub-Zombie, .Pet-BearCub-White, .Pet-BearCub-Skeleton, .Pet-BearCub-Shade, .Pet-BearCub-Red, .Pet-BearCub-Golden, .Pet-BearCub-Desert, .Pet-BearCub-CottonCandyPink, .Pet-BearCub-CottonCandyBlue, .Pet-BearCub-Base, .Pet-Wolf-Base {background: url("/img/sprites/pet_sprites.png") no-repeat} - -.Pet-Wolf-Zombie {background-position: 0 0; width: 81px; height: 99px} -.Pet-Wolf-White {background-position: -81px 0; width: 81px; height: 99px} -.Pet-Wolf-Veteran {background-position: -162px 0; width: 81px; height: 99px} -.Pet-Wolf-Skeleton {background-position: -243px 0; width: 81px; height: 99px} -.Pet-Wolf-Shade {background-position: -324px 0; width: 81px; height: 99px} -.Pet-Wolf-Red {background-position: -405px 0; width: 81px; height: 99px} -.Pet-Wolf-Golden {background-position: -486px 0; width: 81px; height: 99px} -.Pet-Wolf-Desert {background-position: -567px 0; width: 81px; height: 99px} -.Pet-Wolf-CottonCandyPink {background-position: -648px 0; width: 81px; height: 99px} -.Pet-Wolf-CottonCandyBlue {background-position: -729px 0; width: 81px; height: 99px} -.Pet-TigerCub-Zombie {background-position: -810px 0; width: 81px; height: 99px} -.Pet-TigerCub-White {background-position: -891px 0; width: 81px; height: 99px} -.Pet-TigerCub-Skeleton {background-position: -972px 0; width: 81px; height: 99px} -.Pet-TigerCub-Shade {background-position: -1053px 0; width: 81px; height: 99px} -.Pet-TigerCub-Red {background-position: -1134px 0; width: 81px; height: 99px} -.Pet-TigerCub-Golden {background-position: -1215px 0; width: 81px; height: 99px} -.Pet-TigerCub-Desert {background-position: -1296px 0; width: 81px; height: 99px} -.Pet-TigerCub-CottonCandyPink {background-position: -1377px 0; width: 81px; height: 99px} -.Pet-TigerCub-CottonCandyBlue {background-position: -1458px 0; width: 81px; height: 99px} -.Pet-TigerCub-Base {background-position: -1539px 0; width: 81px; height: 99px} -.Pet-PolarBearCub-Base {background-position: -1620px 0; width: 81px; height: 99px} -.Pet-PandaCub-Zombie {background-position: -1701px 0; width: 81px; height: 99px} -.Pet-PandaCub-White {background-position: -1782px 0; width: 81px; height: 99px} -.Pet-PandaCub-Skeleton {background-position: -1863px 0; width: 81px; height: 99px} -.Pet-PandaCub-Shade {background-position: -1944px 0; width: 81px; height: 99px} -.Pet-PandaCub-Red {background-position: -2025px 0; width: 81px; height: 99px} -.Pet-PandaCub-Golden {background-position: -2106px 0; width: 81px; height: 99px} -.Pet-PandaCub-Desert {background-position: -2187px 0; width: 81px; height: 99px} -.Pet-PandaCub-CottonCandyPink {background-position: -2268px 0; width: 81px; height: 99px} -.Pet-PandaCub-CottonCandyBlue {background-position: -2349px 0; width: 81px; height: 99px} -.Pet-PandaCub-Base {background-position: -2430px 0; width: 81px; height: 99px} -.Pet-LionCub-Zombie {background-position: -2511px 0; width: 81px; height: 99px} -.Pet-LionCub-White {background-position: -2592px 0; width: 81px; height: 99px} -.Pet-LionCub-Skeleton {background-position: -2673px 0; width: 81px; height: 99px} -.Pet-LionCub-Shade {background-position: -2754px 0; width: 81px; height: 99px} -.Pet-LionCub-Red {background-position: -2835px 0; width: 81px; height: 99px} -.Pet-LionCub-Golden {background-position: -2916px 0; width: 81px; height: 99px} -.Pet-LionCub-Desert {background-position: -2997px 0; width: 81px; height: 99px} -.Pet-LionCub-CottonCandyPink {background-position: -3078px 0; width: 81px; height: 99px} -.Pet-LionCub-CottonCandyBlue {background-position: -3159px 0; width: 81px; height: 99px} -.Pet-LionCub-Base {background-position: -3240px 0; width: 81px; height: 99px} -.Pet-Fox-Zombie {background-position: -3321px 0; width: 81px; height: 99px} -.Pet-Fox-White {background-position: -3402px 0; width: 81px; height: 99px} -.Pet-Fox-Skeleton {background-position: -3483px 0; width: 81px; height: 99px} -.Pet-Fox-Shade {background-position: -3564px 0; width: 81px; height: 99px} -.Pet-Fox-Red {background-position: -3645px 0; width: 81px; height: 99px} -.Pet-Fox-Golden {background-position: -3726px 0; width: 81px; height: 99px} -.Pet-Fox-Desert {background-position: -3807px 0; width: 81px; height: 99px} -.Pet-Fox-CottonCandyPink {background-position: -3888px 0; width: 81px; height: 99px} -.Pet-Fox-CottonCandyBlue {background-position: -3969px 0; width: 81px; height: 99px} -.Pet-Fox-Base {background-position: -4050px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Zombie {background-position: -4131px 0; width: 81px; height: 99px} -.Pet-FlyingPig-White {background-position: -4212px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Skeleton {background-position: -4293px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Shade {background-position: -4374px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Red {background-position: -4455px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Golden {background-position: -4536px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Desert {background-position: -4617px 0; width: 81px; height: 99px} -.Pet-FlyingPig-CottonCandyPink {background-position: -4698px 0; width: 81px; height: 99px} -.Pet-FlyingPig-CottonCandyBlue {background-position: -4779px 0; width: 81px; height: 99px} -.Pet-FlyingPig-Base {background-position: -4860px 0; width: 81px; height: 99px} -.Pet-Dragon-Zombie {background-position: -4941px 0; width: 81px; height: 99px} -.Pet-Dragon-White {background-position: -5022px 0; width: 81px; height: 99px} -.Pet-Dragon-Skeleton {background-position: -5103px 0; width: 81px; height: 99px} -.Pet-Dragon-Shade {background-position: -5184px 0; width: 81px; height: 99px} -.Pet-Dragon-Red {background-position: -5265px 0; width: 81px; height: 99px} -.Pet-Dragon-Golden {background-position: -5346px 0; width: 81px; height: 99px} -.Pet-Dragon-Desert {background-position: -5427px 0; width: 81px; height: 99px} -.Pet-Dragon-CottonCandyPink {background-position: -5508px 0; width: 81px; height: 99px} -.Pet-Dragon-CottonCandyBlue {background-position: -5589px 0; width: 81px; height: 99px} -.Pet-Dragon-Base {background-position: -5670px 0; width: 81px; height: 99px} -.Pet-Cactus-Zombie {background-position: -5913px 0; width: 81px; height: 99px} -.Pet-Cactus-White {background-position: -6156px 0; width: 81px; height: 99px} -.Pet-Cactus-Skeleton {background-position: -5751px 0; width: 81px; height: 99px} -.Pet-Cactus-Red {background-position: -5832px 0; width: 81px; height: 99px} -.Pet-Cactus-Shade {background-position: -5994px 0; width: 81px; height: 99px} -.Pet-Cactus-Golden {background-position: -6075px 0; width: 81px; height: 99px} -.Pet-Cactus-Desert {background-position: -6399px 0; width: 81px; height: 99px} -.Pet-Cactus-CottonCandyPink {background-position: -6237px 0; width: 81px; height: 99px} -.Pet-Cactus-CottonCandyBlue {background-position: -6318px 0; width: 81px; height: 99px} -.Pet-Cactus-Base {background-position: -6480px 0; width: 81px; height: 99px} -.Pet-BearCub-Zombie {background-position: -6561px 0; width: 81px; height: 99px} -.Pet-BearCub-White {background-position: -6642px 0; width: 81px; height: 99px} -.Pet-BearCub-Skeleton {background-position: -6723px 0; width: 81px; height: 99px} -.Pet-BearCub-Shade {background-position: -6804px 0; width: 81px; height: 99px} -.Pet-BearCub-Red {background-position: -6885px 0; width: 81px; height: 99px} -.Pet-BearCub-Golden {background-position: -6966px 0; width: 81px; height: 99px} -.Pet-BearCub-Desert {background-position: -7047px 0; width: 81px; height: 99px} -.Pet-BearCub-CottonCandyPink {background-position: -7128px 0; width: 81px; height: 99px} -.Pet-BearCub-CottonCandyBlue {background-position: -7209px 0; width: 81px; height: 99px} -.Pet-BearCub-Base {background-position: -7290px 0; width: 81px; height: 99px} -.Pet-Wolf-Base {background-position: -7371px 0; width: 81px; height: 99px} -.Pet-Egg {background: url("/img/sprites/egg.png") no-repeat; width: 39px; height: 42px;} -.Gems{background: url("/img/sprites/Egg_Sprite_Sheet.png"); background-position: -57px 50px; display:inline-block; margin-right:5px;border-style:none; width: 30px; height: 30px} diff --git a/public/img/sprites/pet_sprites.png b/public/img/sprites/pet_sprites.png deleted file mode 100644 index 85a52ebd30..0000000000 Binary files a/public/img/sprites/pet_sprites.png and /dev/null differ diff --git a/public/img/sprites/player_sprites.css b/public/img/sprites/player_sprites.css deleted file mode 100644 index 4a10fb6dfc..0000000000 --- a/public/img/sprites/player_sprites.css +++ /dev/null @@ -1,77 +0,0 @@ -.weapon_6, .weapon_5, .weapon_4, .weapon_3, .weapon_2, .weapon_1, .weapon_0, .skin_white, .skin_pale, .skin_orc, .skin_dead, .skin_black, .skin_asian, .shield_5_v1, .shield_5_v0, .shield_4_v0, .shield_3_v1, .shield_3_v0, .shield_2_v1, .shield_2_v0, .shield_1_v1, .shield_1_v0, _shield_4_v1, .nh_hair_white_v1, .nh_hair_white_v0, .nh_hair_brown_v1, .nh_hair_brown_v0, .nh_hair_blond_v1, .nh_hair_blond_v0, .nh_hair_black_v1, .nh_hair_black_v0, .head_5_v2, .head_5_v1, .head_5_v0, .head_4_v2, .head_4_v1, .head_4_v0, .head_3_v2, .head_3_v1, .head_3_v0, .head_2_v2, .head_2_v1, .head_2_v0, .head_1_v1, .head_1_v0, .head_0_v1, .head_0_v0, .hair_white_v1, .hair_white_v0, .hair_brown_v1, .hair_brown_v0, .hair_blond_v1, .hair_blond_v0, .hair_black_v1, .hair_black_v0, .armor_5_v1, .armor_5_v0, .armor_4_v1, .armor_4_v0, .armor_3_v1, .armor_3_v0, .armor_2_v0, .armor_1_v1, .armor_1_v0, .armor_0_v11, .armor_0_v10, .armor_0_v9, .armor_0_v8, .armor_0_v7, .armor_0_v6, .armor_0_v5, .armor_0_v4, .armor_0_v3, .armor_0_v2, .armor_0_v1, .armor_0_v0 {background: url(player_sprites.png) no-repeat} -.weapon_6 {background-position: 0 0; width: 90px; height: 90px} -.weapon_5 {background-position: -90px 0; width: 90px; height: 90px} -.weapon_4 {background-position: -180px 0; width: 90px; height: 90px} -.weapon_3 {background-position: -270px 0; width: 90px; height: 90px} -.weapon_2 {background-position: -360px 0; width: 90px; height: 90px} -.weapon_1 {background-position: -450px 0; width: 90px; height: 90px} -.weapon_0 {background-position: -540px 0; width: 90px; height: 90px} -.skin_white {background-position: -630px 0; width: 90px; height: 90px} -.skin_pale {background-position: -720px 0; width: 90px; height: 90px} -.skin_orc {background-position: -810px 0; width: 90px; height: 90px} -.skin_dead {background-position: -900px 0; width: 90px; height: 90px} -.skin_black {background-position: -990px 0; width: 90px; height: 90px} -.skin_asian {background-position: -1080px 0; width: 90px; height: 90px} -.shield_5_v1 {background-position: -1170px 0; width: 90px; height: 90px} -.shield_5_v0 {background-position: -1260px 0; width: 90px; height: 90px} -.shield_4_v0 {background-position: -1350px 0; width: 90px; height: 90px} -.shield_3_v1 {background-position: -1440px 0; width: 90px; height: 90px} -.shield_3_v0 {background-position: -1530px 0; width: 90px; height: 90px} -.shield_2_v1 {background-position: -1620px 0; width: 90px; height: 90px} -.shield_2_v0 {background-position: -1710px 0; width: 90px; height: 90px} -.shield_1_v1 {background-position: -1800px 0; width: 90px; height: 90px} -.shield_1_v0 {background-position: -1890px 0; width: 90px; height: 90px} -._shield_4_v1 {background-position: -1980px 0; width: 90px; height: 90px} -.nh_hair_white_v1 {background-position: -2070px 0; width: 90px; height: 90px} -.nh_hair_white_v0 {background-position: -2160px 0; width: 90px; height: 90px} -.nh_hair_brown_v1 {background-position: -2250px 0; width: 90px; height: 90px} -.nh_hair_brown_v0 {background-position: -2340px 0; width: 90px; height: 90px} -.nh_hair_blond_v1 {background-position: -2430px 0; width: 90px; height: 90px} -.nh_hair_blond_v0 {background-position: -2520px 0; width: 90px; height: 90px} -.nh_hair_black_v1 {background-position: -2610px 0; width: 90px; height: 90px} -.nh_hair_black_v0 {background-position: -2700px 0; width: 90px; height: 90px} -.head_5_v2 {background-position: -2790px 0; width: 90px; height: 90px} -.head_5_v1 {background-position: -2880px 0; width: 90px; height: 90px} -.head_5_v0 {background-position: -2970px 0; width: 90px; height: 90px} -.head_4_v2 {background-position: -3060px 0; width: 90px; height: 90px} -.head_4_v1 {background-position: -3150px 0; width: 90px; height: 90px} -.head_4_v0 {background-position: -3240px 0; width: 90px; height: 90px} -.head_3_v2 {background-position: -3330px 0; width: 90px; height: 90px} -.head_3_v1 {background-position: -3420px 0; width: 90px; height: 90px} -.head_3_v0 {background-position: -3510px 0; width: 90px; height: 90px} -.head_2_v2 {background-position: -3600px 0; width: 90px; height: 90px} -.head_2_v1 {background-position: -3690px 0; width: 90px; height: 90px} -.head_2_v0 {background-position: -3780px 0; width: 90px; height: 90px} -.head_1_v1 {background-position: -3870px 0; width: 90px; height: 90px} -.head_1_v0 {background-position: -3960px 0; width: 90px; height: 90px} -.head_0_v1 {background-position: -4050px 0; width: 90px; height: 90px} -.head_0_v0 {background-position: -4140px 0; width: 90px; height: 90px} -.hair_white_v1 {background-position: -4230px 0; width: 90px; height: 90px} -.hair_white_v0 {background-position: -4320px 0; width: 90px; height: 90px} -.hair_brown_v1 {background-position: -4410px 0; width: 90px; height: 90px} -.hair_brown_v0 {background-position: -4500px 0; width: 90px; height: 90px} -.hair_blond_v1 {background-position: -4590px 0; width: 90px; height: 90px} -.hair_blond_v0 {background-position: -4680px 0; width: 90px; height: 90px} -.hair_black_v1 {background-position: -4770px 0; width: 90px; height: 90px} -.hair_black_v0 {background-position: -4860px 0; width: 90px; height: 90px} -.armor_5_v1 {background-position: -4950px 0; width: 90px; height: 90px} -.armor_5_v0 {background-position: -5040px 0; width: 90px; height: 90px} -.armor_4_v1 {background-position: -5130px 0; width: 90px; height: 90px} -.armor_4_v0 {background-position: -5220px 0; width: 90px; height: 90px} -.armor_3_v1 {background-position: -5310px 0; width: 90px; height: 90px} -.armor_3_v0 {background-position: -5400px 0; width: 90px; height: 90px} -.armor_2_v0 {background-position: -5490px 0; width: 90px; height: 90px} -.armor_1_v1 {background-position: -5580px 0; width: 90px; height: 90px} -.armor_1_v0 {background-position: -5670px 0; width: 90px; height: 90px} -.armor_0_v11 {background-position: -5760px 0; width: 90px; height: 90px} -.armor_0_v10 {background-position: -5850px 0; width: 90px; height: 90px} -.armor_0_v9 {background-position: -5940px 0; width: 90px; height: 90px} -.armor_0_v8 {background-position: -6030px 0; width: 90px; height: 90px} -.armor_0_v7 {background-position: -6120px 0; width: 90px; height: 90px} -.armor_0_v6 {background-position: -6210px 0; width: 90px; height: 90px} -.armor_0_v5 {background-position: -6300px 0; width: 90px; height: 90px} -.armor_0_v4 {background-position: -6390px 0; width: 90px; height: 90px} -.armor_0_v3 {background-position: -6480px 0; width: 90px; height: 90px} -.armor_0_v2 {background-position: -6570px 0; width: 90px; height: 90px} -.armor_0_v1 {background-position: -6660px 0; width: 90px; height: 90px} -.armor_0_v0 {background-position: -6750px 0; width: 90px; height: 90px} diff --git a/public/img/sprites/player_sprites.png b/public/img/sprites/player_sprites.png deleted file mode 100644 index 104ae3681b..0000000000 Binary files a/public/img/sprites/player_sprites.png and /dev/null differ diff --git a/public/img/sprites/player_sprites105x.png b/public/img/sprites/player_sprites105x.png deleted file mode 100644 index 0eaf332e77..0000000000 Binary files a/public/img/sprites/player_sprites105x.png and /dev/null differ diff --git a/public/img/sprites/shop.xcf b/public/img/sprites/shop.xcf deleted file mode 100644 index 35fc264f42..0000000000 Binary files a/public/img/sprites/shop.xcf and /dev/null differ diff --git a/public/img/sprites/shop_sprites.css b/public/img/sprites/shop_sprites.css deleted file mode 100644 index eacd25a1ac..0000000000 --- a/public/img/sprites/shop_sprites.css +++ /dev/null @@ -1,27 +0,0 @@ -weapon_6, weapon_5, weapon_4, weapon_3, weapon_2, weapon_1, shield_5, shield_4, shield_3, shield_2, shield_1, head_5, head_4, head_3, head_2, head_1, armor_5, armor_4, armor_3, armor_2, armor_1, reroll, potion, copper, silver, gold {background: url(shop_sprites.css) no-repeat} -weapon_6 {background-position: 0 0; width: 40px; height: 40px} -weapon_5 {background-position: -40px 0; width: 40px; height: 40px} -weapon_4 {background-position: -80px 0; width: 40px; height: 40px} -weapon_3 {background-position: -120px 0; width: 40px; height: 40px} -weapon_2 {background-position: -160px 0; width: 40px; height: 40px} -weapon_1 {background-position: -200px 0; width: 40px; height: 40px} -shield_5 {background-position: -240px 0; width: 40px; height: 40px} -shield_4 {background-position: -280px 0; width: 40px; height: 40px} -shield_3 {background-position: -320px 0; width: 40px; height: 40px} -shield_2 {background-position: -360px 0; width: 40px; height: 40px} -shield_1 {background-position: -400px 0; width: 40px; height: 40px} -head_5 {background-position: -440px 0; width: 40px; height: 40px} -head_4 {background-position: -480px 0; width: 40px; height: 40px} -head_3 {background-position: -520px 0; width: 40px; height: 40px} -head_2 {background-position: -560px 0; width: 40px; height: 40px} -head_1 {background-position: -600px 0; width: 40px; height: 40px} -armor_5 {background-position: -640px 0; width: 40px; height: 40px} -armor_4 {background-position: -680px 0; width: 40px; height: 40px} -armor_3 {background-position: -720px 0; width: 40px; height: 40px} -armor_2 {background-position: -760px 0; width: 40px; height: 40px} -armor_1 {background-position: -800px 0; width: 40px; height: 40px} -reroll {background-position: -840px 0; width: 40px; height: 40px} -potion {background-position: -880px 0; width: 40px; height: 40px} -copper {background-position: -920px 0; width: 40px; height: 40px} -silver {background-position: -960px 0; width: 40px; height: 40px} -gold {background-position: -1000px 0; width: 40px; height: 40px} diff --git a/public/img/sprites/shop_sprites.png b/public/img/sprites/shop_sprites.png deleted file mode 100644 index c012533b13..0000000000 Binary files a/public/img/sprites/shop_sprites.png and /dev/null differ diff --git a/public/img/sprites/sprites.css b/public/img/sprites/sprites.css deleted file mode 100644 index c5a3d6ec72..0000000000 --- a/public/img/sprites/sprites.css +++ /dev/null @@ -1,65 +0,0 @@ -item-goldensword, item-redsword, item-bluesword, item-morningstar, item-axe, item-sword2, item-sword1, f_shield_5, f_shield_4, f_shield_3, f_shield_2, f_shield_1, m_shield_5, m_shield_4, m_shield_3, m_shield_2, m_shield_1, m_head_5, m_head_4, m_head_3, m_head_2, m_head_1, m_head_0, f_head_5_v2, f_head_5_v1, f_head_4_v2, f_head_4_v1, f_head_3_v2, f_head_3_v1, f_head_2_v2, f_head_2_v1, f_head_1, f_head_0, f_hair_white, f_hair_brown, f_hair_black, f_hair_blond, m_hair blond, m_hair black, m_hair brown, m_hair white, f_armor_5, f_armor_4, f_armor_3, f_armor_2, f_armor_1, f_armor_0_v2, f_armor_0_v1, m_armor_5, m_armor_4, m_armor_3, m_armor_2, m_armor_1, m_armor_0, f_skin_dead, f_skin_orc, f_skin_asian, f_skin_black, f_skin_white, m_skin_dead, m_skin_orc, m_skin_asian, m_skin_black, m_skin_white {background: url(css_sprite.png) no-repeat} -item-goldensword {background-position: 0 0; width: 90px; height: 90px} -item-redsword {background-position: -90px 0; width: 90px; height: 90px} -item-bluesword {background-position: -180px 0; width: 90px; height: 90px} -item-morningstar {background-position: -270px 0; width: 90px; height: 90px} -item-axe {background-position: -360px 0; width: 90px; height: 90px} -item-sword2 {background-position: -450px 0; width: 90px; height: 90px} -item-sword1 {background-position: -540px 0; width: 90px; height: 90px} -f_shield_5 {background-position: -630px 0; width: 90px; height: 90px} -f_shield_4 {background-position: -720px 0; width: 90px; height: 90px} -f_shield_3 {background-position: -810px 0; width: 90px; height: 90px} -f_shield_2 {background-position: -900px 0; width: 90px; height: 90px} -f_shield_1 {background-position: -990px 0; width: 90px; height: 90px} -m_shield_5 {background-position: -1080px 0; width: 90px; height: 90px} -m_shield_4 {background-position: -1170px 0; width: 90px; height: 90px} -m_shield_3 {background-position: -1260px 0; width: 90px; height: 90px} -m_shield_2 {background-position: -1350px 0; width: 90px; height: 90px} -m_shield_1 {background-position: -1440px 0; width: 90px; height: 90px} -m_head_5 {background-position: -1530px 0; width: 90px; height: 90px} -m_head_4 {background-position: -1620px 0; width: 90px; height: 90px} -m_head_3 {background-position: -1710px 0; width: 90px; height: 90px} -m_head_2 {background-position: -1800px 0; width: 90px; height: 90px} -m_head_1 {background-position: -1890px 0; width: 90px; height: 90px} -m_head_0 {background-position: -1980px 0; width: 90px; height: 90px} -f_head_5_v2 {background-position: -2070px 0; width: 90px; height: 90px} -f_head_5_v1 {background-position: -2160px 0; width: 90px; height: 90px} -f_head_4_v2 {background-position: -2250px 0; width: 90px; height: 90px} -f_head_4_v1 {background-position: -2340px 0; width: 90px; height: 90px} -f_head_3_v2 {background-position: -2430px 0; width: 90px; height: 90px} -f_head_3_v1 {background-position: -2520px 0; width: 90px; height: 90px} -f_head_2_v2 {background-position: -2610px 0; width: 90px; height: 90px} -f_head_2_v1 {background-position: -2700px 0; width: 90px; height: 90px} -f_head_1 {background-position: -2790px 0; width: 90px; height: 90px} -f_head_0 {background-position: -2880px 0; width: 90px; height: 90px} -f_hair_white {background-position: -2970px 0; width: 90px; height: 90px} -f_hair_brown {background-position: -3060px 0; width: 90px; height: 90px} -f_hair_black {background-position: -3150px 0; width: 90px; height: 90px} -f_hair_blond {background-position: -3240px 0; width: 90px; height: 90px} -m_hair blond {background-position: -3330px 0; width: 90px; height: 90px} -m_hair black {background-position: -3420px 0; width: 90px; height: 90px} -m_hair brown {background-position: -3510px 0; width: 90px; height: 90px} -m_hair white {background-position: -3600px 0; width: 90px; height: 90px} -f_armor_5 {background-position: -3690px 0; width: 90px; height: 90px} -f_armor_4 {background-position: -3780px 0; width: 90px; height: 90px} -f_armor_3 {background-position: -3870px 0; width: 90px; height: 90px} -f_armor_2 {background-position: -3960px 0; width: 90px; height: 90px} -f_armor_1 {background-position: -4050px 0; width: 90px; height: 90px} -f_armor_0_v2 {background-position: -4140px 0; width: 90px; height: 90px} -f_armor_0_v1 {background-position: -4230px 0; width: 90px; height: 90px} -m_armor_5 {background-position: -4320px 0; width: 90px; height: 90px} -m_armor_4 {background-position: -4410px 0; width: 90px; height: 90px} -m_armor_3 {background-position: -4500px 0; width: 90px; height: 90px} -m_armor_2 {background-position: -4590px 0; width: 90px; height: 90px} -m_armor_1 {background-position: -4680px 0; width: 90px; height: 90px} -m_armor_0 {background-position: -4770px 0; width: 90px; height: 90px} -f_skin_dead {background-position: -4860px 0; width: 90px; height: 90px} -f_skin_orc {background-position: -4950px 0; width: 90px; height: 90px} -f_skin_asian {background-position: -5040px 0; width: 90px; height: 90px} -f_skin_black {background-position: -5130px 0; width: 90px; height: 90px} -f_skin_white {background-position: -5220px 0; width: 90px; height: 90px} -m_skin_dead {background-position: -5310px 0; width: 90px; height: 90px} -m_skin_orc {background-position: -5400px 0; width: 90px; height: 90px} -m_skin_asian {background-position: -5490px 0; width: 90px; height: 90px} -m_skin_black {background-position: -5580px 0; width: 90px; height: 90px} -m_skin_white {background-position: -5670px 0; width: 90px; height: 90px} diff --git a/public/img/unprocessed/1d5cc0f4-80d5-11e2-9cd5-92712ef2cc54.gif b/public/img/unprocessed/1d5cc0f4-80d5-11e2-9cd5-92712ef2cc54.gif deleted file mode 100644 index 4efa8c789e..0000000000 Binary files a/public/img/unprocessed/1d5cc0f4-80d5-11e2-9cd5-92712ef2cc54.gif and /dev/null differ diff --git a/public/img/unprocessed/272fa94c-8338-11e2-80f8-eba642a48a63.png b/public/img/unprocessed/272fa94c-8338-11e2-80f8-eba642a48a63.png deleted file mode 100644 index 0a4eab9615..0000000000 Binary files a/public/img/unprocessed/272fa94c-8338-11e2-80f8-eba642a48a63.png and /dev/null differ diff --git a/public/img/unprocessed/70470c0c-70b8-11e2-9448-a2ac8b8779d1.png b/public/img/unprocessed/70470c0c-70b8-11e2-9448-a2ac8b8779d1.png deleted file mode 100644 index e38298d7ab..0000000000 Binary files a/public/img/unprocessed/70470c0c-70b8-11e2-9448-a2ac8b8779d1.png and /dev/null differ diff --git a/public/img/unprocessed/79cace6c-8512-11e2-87f4-fff9639ec4cb.gif b/public/img/unprocessed/79cace6c-8512-11e2-87f4-fff9639ec4cb.gif deleted file mode 100644 index 48b607f2f5..0000000000 Binary files a/public/img/unprocessed/79cace6c-8512-11e2-87f4-fff9639ec4cb.gif and /dev/null differ diff --git a/public/img/unprocessed/8926c83e-70b8-11e2-88d6-8e114af266f9.gif b/public/img/unprocessed/8926c83e-70b8-11e2-88d6-8e114af266f9.gif deleted file mode 100644 index e7da02d4f7..0000000000 Binary files a/public/img/unprocessed/8926c83e-70b8-11e2-88d6-8e114af266f9.gif and /dev/null differ diff --git a/public/img/unprocessed/957247ce-70a6-11e2-839c-96add9efa68d.png b/public/img/unprocessed/957247ce-70a6-11e2-839c-96add9efa68d.png deleted file mode 100644 index 5cc6af84e6..0000000000 Binary files a/public/img/unprocessed/957247ce-70a6-11e2-839c-96add9efa68d.png and /dev/null differ diff --git a/public/img/unprocessed/armored_samurai/18f83282-7f1d-11e2-9605-686c0f6603be.png b/public/img/unprocessed/armored_samurai/18f83282-7f1d-11e2-9605-686c0f6603be.png deleted file mode 100644 index 03e1bdf4f2..0000000000 Binary files a/public/img/unprocessed/armored_samurai/18f83282-7f1d-11e2-9605-686c0f6603be.png and /dev/null differ diff --git a/public/img/unprocessed/armored_samurai/193a14b8-7f1d-11e2-991a-2897b90a61c4.png b/public/img/unprocessed/armored_samurai/193a14b8-7f1d-11e2-991a-2897b90a61c4.png deleted file mode 100644 index de47ac52d0..0000000000 Binary files a/public/img/unprocessed/armored_samurai/193a14b8-7f1d-11e2-991a-2897b90a61c4.png and /dev/null differ diff --git a/public/img/unprocessed/armored_samurai/274333e6-7f1d-11e2-887d-157238988fb9.png b/public/img/unprocessed/armored_samurai/274333e6-7f1d-11e2-887d-157238988fb9.png deleted file mode 100644 index 5d7f89df92..0000000000 Binary files a/public/img/unprocessed/armored_samurai/274333e6-7f1d-11e2-887d-157238988fb9.png and /dev/null differ diff --git a/public/img/unprocessed/armored_samurai/2a920c8e-7f1d-11e2-9656-d4b63e736b26.png b/public/img/unprocessed/armored_samurai/2a920c8e-7f1d-11e2-9656-d4b63e736b26.png deleted file mode 100644 index 7ef25a11bc..0000000000 Binary files a/public/img/unprocessed/armored_samurai/2a920c8e-7f1d-11e2-9656-d4b63e736b26.png and /dev/null differ diff --git a/public/img/unprocessed/backer/1246120a-8838-11e2-96fc-da7484553abd.gif b/public/img/unprocessed/backer/1246120a-8838-11e2-96fc-da7484553abd.gif deleted file mode 100644 index f88037a4e6..0000000000 Binary files a/public/img/unprocessed/backer/1246120a-8838-11e2-96fc-da7484553abd.gif and /dev/null differ diff --git a/public/img/unprocessed/backer/415d1c5c-7adf-11e2-8865-7bf7dd3dac9d.gif b/public/img/unprocessed/backer/415d1c5c-7adf-11e2-8865-7bf7dd3dac9d.gif deleted file mode 100644 index 3e55728320..0000000000 Binary files a/public/img/unprocessed/backer/415d1c5c-7adf-11e2-8865-7bf7dd3dac9d.gif and /dev/null differ diff --git a/public/img/unprocessed/backer/64482d46-8238-11e2-805f-b90ca16a575a.png b/public/img/unprocessed/backer/64482d46-8238-11e2-805f-b90ca16a575a.png deleted file mode 100644 index 7f0ee85adf..0000000000 Binary files a/public/img/unprocessed/backer/64482d46-8238-11e2-805f-b90ca16a575a.png and /dev/null differ diff --git a/public/img/unprocessed/backer/6c742fa6-7801-11e2-8ce2-02ca676c031d.gif b/public/img/unprocessed/backer/6c742fa6-7801-11e2-8ce2-02ca676c031d.gif deleted file mode 100644 index 2cc75ebeab..0000000000 Binary files a/public/img/unprocessed/backer/6c742fa6-7801-11e2-8ce2-02ca676c031d.gif and /dev/null differ diff --git a/public/img/unprocessed/backer/96c696a0-7f8f-11e2-9bf9-5e67f9e4ed85.gif b/public/img/unprocessed/backer/96c696a0-7f8f-11e2-9bf9-5e67f9e4ed85.gif deleted file mode 100644 index 612a424d55..0000000000 Binary files a/public/img/unprocessed/backer/96c696a0-7f8f-11e2-9bf9-5e67f9e4ed85.gif and /dev/null differ diff --git a/public/img/unprocessed/backer/ab1da3a4-77b6-11e2-95c0-5e5e3300f202.gif b/public/img/unprocessed/backer/ab1da3a4-77b6-11e2-95c0-5e5e3300f202.gif deleted file mode 100644 index 539113d8cc..0000000000 Binary files a/public/img/unprocessed/backer/ab1da3a4-77b6-11e2-95c0-5e5e3300f202.gif and /dev/null differ diff --git a/public/img/unprocessed/backer/d54f6bae-869c-11e2-88eb-b4d254a14c3b.gif b/public/img/unprocessed/backer/d54f6bae-869c-11e2-88eb-b4d254a14c3b.gif deleted file mode 100644 index 69c4bf6cc4..0000000000 Binary files a/public/img/unprocessed/backer/d54f6bae-869c-11e2-88eb-b4d254a14c3b.gif and /dev/null differ diff --git a/public/img/unprocessed/backer/e600780c-8837-11e2-8ab6-a91cc9ebab74.gif b/public/img/unprocessed/backer/e600780c-8837-11e2-8ab6-a91cc9ebab74.gif deleted file mode 100644 index 252b1e6908..0000000000 Binary files a/public/img/unprocessed/backer/e600780c-8837-11e2-8ab6-a91cc9ebab74.gif and /dev/null differ diff --git a/public/img/unprocessed/backer/f6be0b84-8bf5-11e2-940c-6f8b5ab8cd63.gif b/public/img/unprocessed/backer/f6be0b84-8bf5-11e2-940c-6f8b5ab8cd63.gif deleted file mode 100644 index 276483e0ec..0000000000 Binary files a/public/img/unprocessed/backer/f6be0b84-8bf5-11e2-940c-6f8b5ab8cd63.gif and /dev/null differ diff --git a/public/img/unprocessed/bride/d09359ee-800d-11e2-92be-000b9ce042c2.gif b/public/img/unprocessed/bride/d09359ee-800d-11e2-92be-000b9ce042c2.gif deleted file mode 100644 index 3e5be58f41..0000000000 Binary files a/public/img/unprocessed/bride/d09359ee-800d-11e2-92be-000b9ce042c2.gif and /dev/null differ diff --git a/public/img/unprocessed/bride/d0d1c5f8-800d-11e2-869c-46f3ce3925f2.gif b/public/img/unprocessed/bride/d0d1c5f8-800d-11e2-869c-46f3ce3925f2.gif deleted file mode 100644 index bd4267a5f8..0000000000 Binary files a/public/img/unprocessed/bride/d0d1c5f8-800d-11e2-869c-46f3ce3925f2.gif and /dev/null differ diff --git a/public/img/unprocessed/bride/d1120898-800d-11e2-9fea-be1dc75b04ce.gif b/public/img/unprocessed/bride/d1120898-800d-11e2-9fea-be1dc75b04ce.gif deleted file mode 100644 index 11c95837f3..0000000000 Binary files a/public/img/unprocessed/bride/d1120898-800d-11e2-9fea-be1dc75b04ce.gif and /dev/null differ diff --git a/public/img/unprocessed/c9633120-8dab-11e2-8291-73b4993357a0.png b/public/img/unprocessed/c9633120-8dab-11e2-8291-73b4993357a0.png deleted file mode 100644 index 4b025ef899..0000000000 Binary files a/public/img/unprocessed/c9633120-8dab-11e2-8291-73b4993357a0.png and /dev/null differ diff --git a/public/img/unprocessed/cat_ears/906bf600-81c0-11e2-9b89-8bde0a5209bc.png b/public/img/unprocessed/cat_ears/906bf600-81c0-11e2-9b89-8bde0a5209bc.png deleted file mode 100644 index 9c5e6c7a79..0000000000 Binary files a/public/img/unprocessed/cat_ears/906bf600-81c0-11e2-9b89-8bde0a5209bc.png and /dev/null differ diff --git a/public/img/unprocessed/cat_ears/95d8d428-81c0-11e2-89ef-24dc63060497.png b/public/img/unprocessed/cat_ears/95d8d428-81c0-11e2-89ef-24dc63060497.png deleted file mode 100644 index ed2584e6d8..0000000000 Binary files a/public/img/unprocessed/cat_ears/95d8d428-81c0-11e2-89ef-24dc63060497.png and /dev/null differ diff --git a/public/img/unprocessed/dragon_hunter/2b4edd44-80aa-11e2-91fd-ae7dc21d69e7.gif b/public/img/unprocessed/dragon_hunter/2b4edd44-80aa-11e2-91fd-ae7dc21d69e7.gif deleted file mode 100644 index e1a5963b39..0000000000 Binary files a/public/img/unprocessed/dragon_hunter/2b4edd44-80aa-11e2-91fd-ae7dc21d69e7.gif and /dev/null differ diff --git a/public/img/unprocessed/dragon_hunter/2e6af9d6-80aa-11e2-8c2e-812b03736b26.gif b/public/img/unprocessed/dragon_hunter/2e6af9d6-80aa-11e2-8c2e-812b03736b26.gif deleted file mode 100644 index b50ee081a2..0000000000 Binary files a/public/img/unprocessed/dragon_hunter/2e6af9d6-80aa-11e2-8c2e-812b03736b26.gif and /dev/null differ diff --git a/public/img/unprocessed/dragon_hunter/e854c3b4-80a9-11e2-94e2-048c2cf36920.gif b/public/img/unprocessed/dragon_hunter/e854c3b4-80a9-11e2-94e2-048c2cf36920.gif deleted file mode 100644 index bec63f0915..0000000000 Binary files a/public/img/unprocessed/dragon_hunter/e854c3b4-80a9-11e2-94e2-048c2cf36920.gif and /dev/null differ diff --git a/public/img/unprocessed/dragon_hunter/ed357a86-80a9-11e2-997f-35c1841e1688.gif b/public/img/unprocessed/dragon_hunter/ed357a86-80a9-11e2-997f-35c1841e1688.gif deleted file mode 100644 index 39086a14ff..0000000000 Binary files a/public/img/unprocessed/dragon_hunter/ed357a86-80a9-11e2-997f-35c1841e1688.gif and /dev/null differ diff --git a/public/img/unprocessed/dragon_hunter/f08a5012-80a9-11e2-8c99-dc58828b4e2a.gif b/public/img/unprocessed/dragon_hunter/f08a5012-80a9-11e2-8c99-dc58828b4e2a.gif deleted file mode 100644 index ec52bdddcb..0000000000 Binary files a/public/img/unprocessed/dragon_hunter/f08a5012-80a9-11e2-8c99-dc58828b4e2a.gif and /dev/null differ diff --git a/public/img/unprocessed/dragon_hunter/f48fc58e-80a9-11e2-860e-dc5d57325f7e.gif b/public/img/unprocessed/dragon_hunter/f48fc58e-80a9-11e2-860e-dc5d57325f7e.gif deleted file mode 100644 index 1141910799..0000000000 Binary files a/public/img/unprocessed/dragon_hunter/f48fc58e-80a9-11e2-860e-dc5d57325f7e.gif and /dev/null differ diff --git a/public/img/unprocessed/efbd21c4-82a1-11e2-8190-fbc609b5c58b.png b/public/img/unprocessed/efbd21c4-82a1-11e2-8190-fbc609b5c58b.png deleted file mode 100644 index a5415250fa..0000000000 Binary files a/public/img/unprocessed/efbd21c4-82a1-11e2-8190-fbc609b5c58b.png and /dev/null differ diff --git a/public/img/unprocessed/ff218da6-7ff6-11e2-90a5-691ce50f46a2.gif b/public/img/unprocessed/ff218da6-7ff6-11e2-90a5-691ce50f46a2.gif deleted file mode 100644 index 046c6b4817..0000000000 Binary files a/public/img/unprocessed/ff218da6-7ff6-11e2-90a5-691ce50f46a2.gif and /dev/null differ diff --git a/public/img/unprocessed/gladiator/23e7ab0e-7f0a-11e2-9d36-bfab6944f6b7.png b/public/img/unprocessed/gladiator/23e7ab0e-7f0a-11e2-9d36-bfab6944f6b7.png deleted file mode 100644 index 9143feb639..0000000000 Binary files a/public/img/unprocessed/gladiator/23e7ab0e-7f0a-11e2-9d36-bfab6944f6b7.png and /dev/null differ diff --git a/public/img/unprocessed/gladiator/2414bd4c-7f0a-11e2-8522-9becf9bdf198.png b/public/img/unprocessed/gladiator/2414bd4c-7f0a-11e2-8522-9becf9bdf198.png deleted file mode 100644 index 5f53907632..0000000000 Binary files a/public/img/unprocessed/gladiator/2414bd4c-7f0a-11e2-8522-9becf9bdf198.png and /dev/null differ diff --git a/public/img/unprocessed/gladiator/2441dfe8-7f0a-11e2-8289-74dc99e5d9cb.png b/public/img/unprocessed/gladiator/2441dfe8-7f0a-11e2-8289-74dc99e5d9cb.png deleted file mode 100644 index efc930ca6e..0000000000 Binary files a/public/img/unprocessed/gladiator/2441dfe8-7f0a-11e2-8289-74dc99e5d9cb.png and /dev/null differ diff --git a/public/img/unprocessed/gladiator/2454557e-7f0a-11e2-98e9-364700741380.png b/public/img/unprocessed/gladiator/2454557e-7f0a-11e2-98e9-364700741380.png deleted file mode 100644 index d057032960..0000000000 Binary files a/public/img/unprocessed/gladiator/2454557e-7f0a-11e2-98e9-364700741380.png and /dev/null differ diff --git a/public/img/unprocessed/gladiator/245a7d3c-7f0a-11e2-9aab-f5ad8aeeff98.png b/public/img/unprocessed/gladiator/245a7d3c-7f0a-11e2-9aab-f5ad8aeeff98.png deleted file mode 100644 index b72e693953..0000000000 Binary files a/public/img/unprocessed/gladiator/245a7d3c-7f0a-11e2-9aab-f5ad8aeeff98.png and /dev/null differ diff --git a/public/img/unprocessed/immortal/a23653d0-7f36-11e2-8993-7146e23b80d2.png b/public/img/unprocessed/immortal/a23653d0-7f36-11e2-8993-7146e23b80d2.png deleted file mode 100644 index bc31150249..0000000000 Binary files a/public/img/unprocessed/immortal/a23653d0-7f36-11e2-8993-7146e23b80d2.png and /dev/null differ diff --git a/public/img/unprocessed/immortal/a267e12a-7f36-11e2-8cc3-3b7ef849783c.png b/public/img/unprocessed/immortal/a267e12a-7f36-11e2-8cc3-3b7ef849783c.png deleted file mode 100644 index 7a4dfcca8f..0000000000 Binary files a/public/img/unprocessed/immortal/a267e12a-7f36-11e2-8cc3-3b7ef849783c.png and /dev/null differ diff --git a/public/img/unprocessed/immortal/a2986c6e-7f36-11e2-8858-f817af009adb.png b/public/img/unprocessed/immortal/a2986c6e-7f36-11e2-8858-f817af009adb.png deleted file mode 100644 index b7b70e237a..0000000000 Binary files a/public/img/unprocessed/immortal/a2986c6e-7f36-11e2-8858-f817af009adb.png and /dev/null differ diff --git a/public/img/unprocessed/immortal/a2ba320e-7f36-11e2-9bc6-d0a02b66408c.png b/public/img/unprocessed/immortal/a2ba320e-7f36-11e2-9bc6-d0a02b66408c.png deleted file mode 100644 index 2e61ea92b2..0000000000 Binary files a/public/img/unprocessed/immortal/a2ba320e-7f36-11e2-9bc6-d0a02b66408c.png and /dev/null differ diff --git a/public/img/unprocessed/pets/7beaf3ee-805c-11e2-994f-a8158102048c.gif b/public/img/unprocessed/pets/7beaf3ee-805c-11e2-994f-a8158102048c.gif deleted file mode 100644 index 0d873aa493..0000000000 Binary files a/public/img/unprocessed/pets/7beaf3ee-805c-11e2-994f-a8158102048c.gif and /dev/null differ diff --git a/public/img/unprocessed/pets/8839ff22-8837-11e2-84ed-3998b99719b0.png b/public/img/unprocessed/pets/8839ff22-8837-11e2-84ed-3998b99719b0.png deleted file mode 100644 index c97d47448c..0000000000 Binary files a/public/img/unprocessed/pets/8839ff22-8837-11e2-84ed-3998b99719b0.png and /dev/null differ diff --git a/public/img/unprocessed/pets/b13c795c-6f2a-11e2-8be9-dec462891e6f.png b/public/img/unprocessed/pets/b13c795c-6f2a-11e2-8be9-dec462891e6f.png deleted file mode 100644 index 897ed12bbd..0000000000 Binary files a/public/img/unprocessed/pets/b13c795c-6f2a-11e2-8be9-dec462891e6f.png and /dev/null differ diff --git a/public/img/unprocessed/robed_samurai/a4ade7e4-7f14-11e2-8aa2-c3b501009e1a.png b/public/img/unprocessed/robed_samurai/a4ade7e4-7f14-11e2-8aa2-c3b501009e1a.png deleted file mode 100644 index 37c8c1476e..0000000000 Binary files a/public/img/unprocessed/robed_samurai/a4ade7e4-7f14-11e2-8aa2-c3b501009e1a.png and /dev/null differ diff --git a/public/img/unprocessed/robed_samurai/a4dd91d8-7f14-11e2-9302-7b378721bb9b.png b/public/img/unprocessed/robed_samurai/a4dd91d8-7f14-11e2-9302-7b378721bb9b.png deleted file mode 100644 index 5137e84fad..0000000000 Binary files a/public/img/unprocessed/robed_samurai/a4dd91d8-7f14-11e2-9302-7b378721bb9b.png and /dev/null differ diff --git a/public/img/unprocessed/robed_samurai/a50d855a-7f14-11e2-8cb6-096ba49e0084.png b/public/img/unprocessed/robed_samurai/a50d855a-7f14-11e2-8cb6-096ba49e0084.png deleted file mode 100644 index ba738bcc80..0000000000 Binary files a/public/img/unprocessed/robed_samurai/a50d855a-7f14-11e2-8cb6-096ba49e0084.png and /dev/null differ diff --git a/public/img/unprocessed/robed_samurai/a53c91f6-7f14-11e2-98c0-d9ca8adfd77f.png b/public/img/unprocessed/robed_samurai/a53c91f6-7f14-11e2-98c0-d9ca8adfd77f.png deleted file mode 100644 index d8a77b9543..0000000000 Binary files a/public/img/unprocessed/robed_samurai/a53c91f6-7f14-11e2-98c0-d9ca8adfd77f.png and /dev/null differ diff --git a/public/img/unprocessed/rogue/300cde96-704f-11e2-95f1-25d59dee29c2.png b/public/img/unprocessed/rogue/300cde96-704f-11e2-95f1-25d59dee29c2.png deleted file mode 100644 index d2d541ecdc..0000000000 Binary files a/public/img/unprocessed/rogue/300cde96-704f-11e2-95f1-25d59dee29c2.png and /dev/null differ diff --git a/public/img/unprocessed/rogue/78aa437e-7111-11e2-97b5-1f1d1e2b99e0.png b/public/img/unprocessed/rogue/78aa437e-7111-11e2-97b5-1f1d1e2b99e0.png deleted file mode 100644 index 246f2031e6..0000000000 Binary files a/public/img/unprocessed/rogue/78aa437e-7111-11e2-97b5-1f1d1e2b99e0.png and /dev/null differ diff --git a/public/img/unprocessed/rogue/79016b86-7111-11e2-90e4-ad4483d9d0fa.png b/public/img/unprocessed/rogue/79016b86-7111-11e2-90e4-ad4483d9d0fa.png deleted file mode 100644 index 1396b6e37e..0000000000 Binary files a/public/img/unprocessed/rogue/79016b86-7111-11e2-90e4-ad4483d9d0fa.png and /dev/null differ diff --git a/public/img/unprocessed/rogue/7911afd2-7111-11e2-899b-e17fa4b0f758.png b/public/img/unprocessed/rogue/7911afd2-7111-11e2-899b-e17fa4b0f758.png deleted file mode 100644 index e579d5c15d..0000000000 Binary files a/public/img/unprocessed/rogue/7911afd2-7111-11e2-899b-e17fa4b0f758.png and /dev/null differ diff --git a/public/img/unprocessed/rogue/d665bcaa-7d6e-11e2-8389-ad021a8995e6.png b/public/img/unprocessed/rogue/d665bcaa-7d6e-11e2-8389-ad021a8995e6.png deleted file mode 100644 index f36e4aab2e..0000000000 Binary files a/public/img/unprocessed/rogue/d665bcaa-7d6e-11e2-8389-ad021a8995e6.png and /dev/null differ diff --git a/public/img/unprocessed/rogue/d7a969cc-7d6e-11e2-8ae6-4bfc48340897.png b/public/img/unprocessed/rogue/d7a969cc-7d6e-11e2-8ae6-4bfc48340897.png deleted file mode 100644 index bd1d337f61..0000000000 Binary files a/public/img/unprocessed/rogue/d7a969cc-7d6e-11e2-8ae6-4bfc48340897.png and /dev/null differ diff --git a/public/img/unprocessed/rogue/d96fa1b8-7d6e-11e2-97d2-35da41d621cc.png b/public/img/unprocessed/rogue/d96fa1b8-7d6e-11e2-97d2-35da41d621cc.png deleted file mode 100644 index f910ae3a91..0000000000 Binary files a/public/img/unprocessed/rogue/d96fa1b8-7d6e-11e2-97d2-35da41d621cc.png and /dev/null differ diff --git a/public/img/unprocessed/rogue/dbae71de-7d6e-11e2-9ed4-e695eb852666.png b/public/img/unprocessed/rogue/dbae71de-7d6e-11e2-9ed4-e695eb852666.png deleted file mode 100644 index ad89e6e5ca..0000000000 Binary files a/public/img/unprocessed/rogue/dbae71de-7d6e-11e2-9ed4-e695eb852666.png and /dev/null differ diff --git a/public/img/unprocessed/rogue/dcf2eb42-7d6e-11e2-96dd-5c943b1f26a9.png b/public/img/unprocessed/rogue/dcf2eb42-7d6e-11e2-96dd-5c943b1f26a9.png deleted file mode 100644 index 11fbb4cde3..0000000000 Binary files a/public/img/unprocessed/rogue/dcf2eb42-7d6e-11e2-96dd-5c943b1f26a9.png and /dev/null differ diff --git a/public/img/unprocessed/rogue/e091be2c-7d6e-11e2-99d7-6cdca4393a65.png b/public/img/unprocessed/rogue/e091be2c-7d6e-11e2-99d7-6cdca4393a65.png deleted file mode 100644 index c88818377a..0000000000 Binary files a/public/img/unprocessed/rogue/e091be2c-7d6e-11e2-99d7-6cdca4393a65.png and /dev/null differ diff --git a/public/img/unprocessed/rogue/e2088d76-7d6e-11e2-9488-0bd0f499213c.png b/public/img/unprocessed/rogue/e2088d76-7d6e-11e2-9488-0bd0f499213c.png deleted file mode 100644 index c084393ab6..0000000000 Binary files a/public/img/unprocessed/rogue/e2088d76-7d6e-11e2-9488-0bd0f499213c.png and /dev/null differ diff --git a/public/img/unprocessed/special/compstore bunny lavender.png b/public/img/unprocessed/special/compstore bunny lavender.png deleted file mode 100644 index adf317483b..0000000000 Binary files a/public/img/unprocessed/special/compstore bunny lavender.png and /dev/null differ diff --git a/public/img/unprocessed/special/compstore bunny light blue.png b/public/img/unprocessed/special/compstore bunny light blue.png deleted file mode 100644 index 2b0dee060c..0000000000 Binary files a/public/img/unprocessed/special/compstore bunny light blue.png and /dev/null differ diff --git a/public/img/unprocessed/special/compstore bunny pink.png b/public/img/unprocessed/special/compstore bunny pink.png deleted file mode 100644 index 19fddb633c..0000000000 Binary files a/public/img/unprocessed/special/compstore bunny pink.png and /dev/null differ diff --git a/public/img/unprocessed/special/compstore bunny yellow.png b/public/img/unprocessed/special/compstore bunny yellow.png deleted file mode 100644 index ac993a62c5..0000000000 Binary files a/public/img/unprocessed/special/compstore bunny yellow.png and /dev/null differ diff --git a/public/img/unprocessed/special/compstore bunny1.png b/public/img/unprocessed/special/compstore bunny1.png deleted file mode 100644 index 7ea2c2e388..0000000000 Binary files a/public/img/unprocessed/special/compstore bunny1.png and /dev/null differ diff --git a/public/img/unprocessed/special/compstore hermes white.png b/public/img/unprocessed/special/compstore hermes white.png deleted file mode 100644 index bf7e6475a2..0000000000 Binary files a/public/img/unprocessed/special/compstore hermes white.png and /dev/null differ diff --git a/public/img/unprocessed/special/compstore hermes.png b/public/img/unprocessed/special/compstore hermes.png deleted file mode 100644 index 0c51fe8d30..0000000000 Binary files a/public/img/unprocessed/special/compstore hermes.png and /dev/null differ diff --git a/public/img/unprocessed/special/compstore kitties1.png b/public/img/unprocessed/special/compstore kitties1.png deleted file mode 100644 index 9a5386d355..0000000000 Binary files a/public/img/unprocessed/special/compstore kitties1.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/056fe680-7d5e-11e2-995d-92d377750e12.png b/public/img/unprocessed/wizard/056fe680-7d5e-11e2-995d-92d377750e12.png deleted file mode 100644 index e3b195d449..0000000000 Binary files a/public/img/unprocessed/wizard/056fe680-7d5e-11e2-995d-92d377750e12.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/0a8db056-7c7e-11e2-8cc3-743d54724f15.png b/public/img/unprocessed/wizard/0a8db056-7c7e-11e2-8cc3-743d54724f15.png deleted file mode 100644 index 1a53a0bd63..0000000000 Binary files a/public/img/unprocessed/wizard/0a8db056-7c7e-11e2-8cc3-743d54724f15.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/0c731010-7d5e-11e2-85b1-63b96dc716e7.png b/public/img/unprocessed/wizard/0c731010-7d5e-11e2-85b1-63b96dc716e7.png deleted file mode 100644 index 6517e33078..0000000000 Binary files a/public/img/unprocessed/wizard/0c731010-7d5e-11e2-85b1-63b96dc716e7.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/1653261e-7dbe-11e2-9905-1746529f137b.png b/public/img/unprocessed/wizard/1653261e-7dbe-11e2-9905-1746529f137b.png deleted file mode 100644 index 608c77e10e..0000000000 Binary files a/public/img/unprocessed/wizard/1653261e-7dbe-11e2-9905-1746529f137b.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/1b4e12c8-7dbe-11e2-8a37-ae0693395de9.png b/public/img/unprocessed/wizard/1b4e12c8-7dbe-11e2-8a37-ae0693395de9.png deleted file mode 100644 index 2985f66163..0000000000 Binary files a/public/img/unprocessed/wizard/1b4e12c8-7dbe-11e2-8a37-ae0693395de9.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/1d9e2166-8670-11e2-9b44-7e58fa80c479.png b/public/img/unprocessed/wizard/1d9e2166-8670-11e2-9b44-7e58fa80c479.png deleted file mode 100644 index a37b543dae..0000000000 Binary files a/public/img/unprocessed/wizard/1d9e2166-8670-11e2-9b44-7e58fa80c479.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/1fa8bc34-7d5e-11e2-8ba9-7cc5d914c82a.png b/public/img/unprocessed/wizard/1fa8bc34-7d5e-11e2-8ba9-7cc5d914c82a.png deleted file mode 100644 index 40084bca48..0000000000 Binary files a/public/img/unprocessed/wizard/1fa8bc34-7d5e-11e2-8ba9-7cc5d914c82a.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/20445f76-7dbe-11e2-9f63-a80d7a8caa47.png b/public/img/unprocessed/wizard/20445f76-7dbe-11e2-9f63-a80d7a8caa47.png deleted file mode 100644 index 39842812c7..0000000000 Binary files a/public/img/unprocessed/wizard/20445f76-7dbe-11e2-9f63-a80d7a8caa47.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/22967a7e-8670-11e2-8306-f9c38bc4d573.png b/public/img/unprocessed/wizard/22967a7e-8670-11e2-8306-f9c38bc4d573.png deleted file mode 100644 index 2f9f99f89f..0000000000 Binary files a/public/img/unprocessed/wizard/22967a7e-8670-11e2-8306-f9c38bc4d573.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/2c40e622-8670-11e2-8363-55bf3fe07c92.png b/public/img/unprocessed/wizard/2c40e622-8670-11e2-8363-55bf3fe07c92.png deleted file mode 100644 index 4b1c240bb3..0000000000 Binary files a/public/img/unprocessed/wizard/2c40e622-8670-11e2-8363-55bf3fe07c92.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/3bb788ae-8670-11e2-842a-315c136bb7bc.png b/public/img/unprocessed/wizard/3bb788ae-8670-11e2-842a-315c136bb7bc.png deleted file mode 100644 index a7bea79ca0..0000000000 Binary files a/public/img/unprocessed/wizard/3bb788ae-8670-11e2-842a-315c136bb7bc.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/40c01002-7d5e-11e2-8226-b8cde96483aa.png b/public/img/unprocessed/wizard/40c01002-7d5e-11e2-8226-b8cde96483aa.png deleted file mode 100644 index 831cae9f58..0000000000 Binary files a/public/img/unprocessed/wizard/40c01002-7d5e-11e2-8226-b8cde96483aa.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/4ac3b2c0-7d5e-11e2-928a-9ab34f91ce77.png b/public/img/unprocessed/wizard/4ac3b2c0-7d5e-11e2-928a-9ab34f91ce77.png deleted file mode 100644 index a8a3d3fd5a..0000000000 Binary files a/public/img/unprocessed/wizard/4ac3b2c0-7d5e-11e2-928a-9ab34f91ce77.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/5cb7a96e-7d5e-11e2-99d0-f9a52eb29c27.png b/public/img/unprocessed/wizard/5cb7a96e-7d5e-11e2-99d0-f9a52eb29c27.png deleted file mode 100644 index e8005412b0..0000000000 Binary files a/public/img/unprocessed/wizard/5cb7a96e-7d5e-11e2-99d0-f9a52eb29c27.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/638eb6ce-7d5e-11e2-9bcc-0e3de0e4d484.png b/public/img/unprocessed/wizard/638eb6ce-7d5e-11e2-9bcc-0e3de0e4d484.png deleted file mode 100644 index 01c83ff60f..0000000000 Binary files a/public/img/unprocessed/wizard/638eb6ce-7d5e-11e2-9bcc-0e3de0e4d484.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/8c23270a-7d5e-11e2-9ca0-60b5ef2de784.png b/public/img/unprocessed/wizard/8c23270a-7d5e-11e2-9ca0-60b5ef2de784.png deleted file mode 100644 index f2696f09d0..0000000000 Binary files a/public/img/unprocessed/wizard/8c23270a-7d5e-11e2-9ca0-60b5ef2de784.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/981aebd8-86c3-11e2-8856-bee7c4eaa60d.png b/public/img/unprocessed/wizard/981aebd8-86c3-11e2-8856-bee7c4eaa60d.png deleted file mode 100644 index d0c79cf98c..0000000000 Binary files a/public/img/unprocessed/wizard/981aebd8-86c3-11e2-8856-bee7c4eaa60d.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/9b44e94e-86c3-11e2-9aa9-a0a999d60f4c.png b/public/img/unprocessed/wizard/9b44e94e-86c3-11e2-9aa9-a0a999d60f4c.png deleted file mode 100644 index 983c0c44ad..0000000000 Binary files a/public/img/unprocessed/wizard/9b44e94e-86c3-11e2-9aa9-a0a999d60f4c.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/cba70400-7d5e-11e2-8e7a-1c216a2074e1.png b/public/img/unprocessed/wizard/cba70400-7d5e-11e2-8e7a-1c216a2074e1.png deleted file mode 100644 index 54807f6093..0000000000 Binary files a/public/img/unprocessed/wizard/cba70400-7d5e-11e2-8e7a-1c216a2074e1.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/d318da56-7d5e-11e2-9d79-79ea485542c9.png b/public/img/unprocessed/wizard/d318da56-7d5e-11e2-9d79-79ea485542c9.png deleted file mode 100644 index 464e5ad3ae..0000000000 Binary files a/public/img/unprocessed/wizard/d318da56-7d5e-11e2-9d79-79ea485542c9.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/df8f8496-704e-11e2-8511-3170ca6c0df2.png b/public/img/unprocessed/wizard/df8f8496-704e-11e2-8511-3170ca6c0df2.png deleted file mode 100644 index d4f58be318..0000000000 Binary files a/public/img/unprocessed/wizard/df8f8496-704e-11e2-8511-3170ca6c0df2.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/e34309a0-7d6e-11e2-841b-e54bddb82577.png b/public/img/unprocessed/wizard/e34309a0-7d6e-11e2-841b-e54bddb82577.png deleted file mode 100644 index ac4bac66a3..0000000000 Binary files a/public/img/unprocessed/wizard/e34309a0-7d6e-11e2-841b-e54bddb82577.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/e55999e8-7c7e-11e2-80f7-c4d91580bf60.png b/public/img/unprocessed/wizard/e55999e8-7c7e-11e2-80f7-c4d91580bf60.png deleted file mode 100644 index 664ad5ed83..0000000000 Binary files a/public/img/unprocessed/wizard/e55999e8-7c7e-11e2-80f7-c4d91580bf60.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/e71ce75e-7c7d-11e2-9d15-635aaff4e8d1.png b/public/img/unprocessed/wizard/e71ce75e-7c7d-11e2-9d15-635aaff4e8d1.png deleted file mode 100644 index 240c549bb4..0000000000 Binary files a/public/img/unprocessed/wizard/e71ce75e-7c7d-11e2-9d15-635aaff4e8d1.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/eb37ac0c-7d5e-11e2-8ab8-eb061afe4082.png b/public/img/unprocessed/wizard/eb37ac0c-7d5e-11e2-8ab8-eb061afe4082.png deleted file mode 100644 index 1ef5a4083d..0000000000 Binary files a/public/img/unprocessed/wizard/eb37ac0c-7d5e-11e2-8ab8-eb061afe4082.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/f04973e2-7dbd-11e2-9f40-e6c166d2bbc7 (1).png b/public/img/unprocessed/wizard/f04973e2-7dbd-11e2-9f40-e6c166d2bbc7 (1).png deleted file mode 100644 index c81719e62b..0000000000 Binary files a/public/img/unprocessed/wizard/f04973e2-7dbd-11e2-9f40-e6c166d2bbc7 (1).png and /dev/null differ diff --git a/public/img/unprocessed/wizard/f1bac41a-7c7d-11e2-90f3-f2f53b5e2a00.png b/public/img/unprocessed/wizard/f1bac41a-7c7d-11e2-90f3-f2f53b5e2a00.png deleted file mode 100644 index 6ed26e1c2c..0000000000 Binary files a/public/img/unprocessed/wizard/f1bac41a-7c7d-11e2-90f3-f2f53b5e2a00.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/f1e7c3c0-7d5e-11e2-8857-b58547e05c76.png b/public/img/unprocessed/wizard/f1e7c3c0-7d5e-11e2-8857-b58547e05c76.png deleted file mode 100644 index fbd1e287ce..0000000000 Binary files a/public/img/unprocessed/wizard/f1e7c3c0-7d5e-11e2-8857-b58547e05c76.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/f5653fc6-7d60-11e2-96f4-d6c887747abc.png b/public/img/unprocessed/wizard/f5653fc6-7d60-11e2-96f4-d6c887747abc.png deleted file mode 100644 index c3d0298789..0000000000 Binary files a/public/img/unprocessed/wizard/f5653fc6-7d60-11e2-96f4-d6c887747abc.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/f9700c38-7d5e-11e2-8914-d456c3c0ece0.png b/public/img/unprocessed/wizard/f9700c38-7d5e-11e2-8914-d456c3c0ece0.png deleted file mode 100644 index f28037da01..0000000000 Binary files a/public/img/unprocessed/wizard/f9700c38-7d5e-11e2-8914-d456c3c0ece0.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/final/1ac07976-8c3d-11e2-8be6-b20569cccbbc.png b/public/img/unprocessed/wizard/final/1ac07976-8c3d-11e2-8be6-b20569cccbbc.png deleted file mode 100644 index 0910c08d6f..0000000000 Binary files a/public/img/unprocessed/wizard/final/1ac07976-8c3d-11e2-8be6-b20569cccbbc.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/final/3a151098-8c3d-11e2-9b2d-b1fa78c39718.png b/public/img/unprocessed/wizard/final/3a151098-8c3d-11e2-9b2d-b1fa78c39718.png deleted file mode 100644 index 5895b86f24..0000000000 Binary files a/public/img/unprocessed/wizard/final/3a151098-8c3d-11e2-9b2d-b1fa78c39718.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/final/3fee9142-8c3d-11e2-9e55-a1034a05deba.png b/public/img/unprocessed/wizard/final/3fee9142-8c3d-11e2-9e55-a1034a05deba.png deleted file mode 100644 index 377f9b69a3..0000000000 Binary files a/public/img/unprocessed/wizard/final/3fee9142-8c3d-11e2-9e55-a1034a05deba.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/final/7aed8c94-8c3d-11e2-8197-db26cdcb1275.png b/public/img/unprocessed/wizard/final/7aed8c94-8c3d-11e2-8197-db26cdcb1275.png deleted file mode 100644 index 92f9048e73..0000000000 Binary files a/public/img/unprocessed/wizard/final/7aed8c94-8c3d-11e2-8197-db26cdcb1275.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/final/80f159d6-8c3d-11e2-89c6-e7ec50cd4a85.png b/public/img/unprocessed/wizard/final/80f159d6-8c3d-11e2-89c6-e7ec50cd4a85.png deleted file mode 100644 index 2ff417a7d9..0000000000 Binary files a/public/img/unprocessed/wizard/final/80f159d6-8c3d-11e2-89c6-e7ec50cd4a85.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/final/86682dbc-8f0e-11e2-9f1c-a54959ffaa72.png b/public/img/unprocessed/wizard/final/86682dbc-8f0e-11e2-9f1c-a54959ffaa72.png deleted file mode 100644 index b6c1d745aa..0000000000 Binary files a/public/img/unprocessed/wizard/final/86682dbc-8f0e-11e2-9f1c-a54959ffaa72.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/final/8a448746-8f0e-11e2-8763-4c4c7ab97775.png b/public/img/unprocessed/wizard/final/8a448746-8f0e-11e2-8763-4c4c7ab97775.png deleted file mode 100644 index c22d69040b..0000000000 Binary files a/public/img/unprocessed/wizard/final/8a448746-8f0e-11e2-8763-4c4c7ab97775.png and /dev/null differ diff --git a/public/img/unprocessed/wizard/final/e002d874-8c3c-11e2-96ad-16523c29bd32.png b/public/img/unprocessed/wizard/final/e002d874-8c3c-11e2-96ad-16523c29bd32.png deleted file mode 100644 index 1348413c7d..0000000000 Binary files a/public/img/unprocessed/wizard/final/e002d874-8c3c-11e2-96ad-16523c29bd32.png and /dev/null differ diff --git a/public/js/app.js b/public/js/app.js new file mode 100644 index 0000000000..cdb890c820 --- /dev/null +++ b/public/js/app.js @@ -0,0 +1,184 @@ +"use strict"; + +window.habitrpg = angular.module('habitrpg', + ['ngResource', 'ngSanitize', 'userServices', 'groupServices', 'memberServices', 'challengeServices', + 'sharedServices', 'authServices', 'notificationServices', 'guideServices', + 'ui.bootstrap', 'ui.keypress', 'ui.router', 'chieffancypants.loadingBar']) + + // @see https://github.com/angular-ui/ui-router/issues/110 and https://github.com/HabitRPG/habitrpg/issues/1705 + // temporary hack until they have a better solution + .value('$anchorScroll', angular.noop) + + .constant("API_URL", "") + .constant("STORAGE_USER_ID", 'habitrpg-user') + .constant("STORAGE_SETTINGS_ID", 'habit-mobile-settings') + //.constant("STORAGE_GROUPS_ID", "") // if we decide to take groups offline + + .config(['$stateProvider', '$urlRouterProvider', '$httpProvider', 'STORAGE_SETTINGS_ID', + function($stateProvider, $urlRouterProvider, $httpProvider, STORAGE_SETTINGS_ID) { + + $urlRouterProvider + // Setup default selected tabs + .when('/options', '/options/profile/avatar') + .when('/options/profile', '/options/profile/avatar') + .when('/options/groups', '/options/groups/tavern') + .when('/options/groups/guilds', '/options/groups/guilds/public') + .when('/options/inventory', '/options/inventory/inventory') + + // redirect states that don't match + .otherwise("/tasks"); + + $stateProvider + + // Tasks + .state('tasks', { + url: "/tasks", + templateUrl: "partials/main.html" + }) + + // Options + .state('options', { + url: "/options", + templateUrl: "partials/options.html", + controller: function(){} + }) + + // Options > Profile + .state('options.profile', { + url: "/profile", + templateUrl: "partials/options.profile.html", + controller: 'UserCtrl' + }) + .state('options.profile.avatar', { + url: "/avatar", + templateUrl: "partials/options.profile.avatar.html" + }) + .state('options.profile.stats', { + url: "/stats", + templateUrl: "partials/options.profile.stats.html" + }) + .state('options.profile.profile', { + url: "/profile", + templateUrl: "partials/options.profile.profile.html" + }) + + // Options > Groups + .state('options.social', { + url: "/groups", + templateUrl: "partials/options.social.html" + }) + .state('options.social.tavern', { + url: "/tavern", + templateUrl: "partials/options.social.tavern.html", + controller: 'TavernCtrl' + }) + .state('options.social.party', { + url: '/party', + templateUrl: "partials/options.social.party.html", + controller: 'PartyCtrl' + }) + .state('options.social.guilds', { + url: '/guilds', + templateUrl: "partials/options.social.guilds.html", + controller: 'GuildsCtrl' + }) + .state('options.social.guilds.public', { + url: '/public', + templateUrl: "partials/options.social.guilds.public.html" + }) + .state('options.social.guilds.create', { + url: '/create', + templateUrl: "partials/options.social.guilds.create.html" + }) + .state('options.social.guilds.detail', { + url: '/:gid', + templateUrl: 'partials/options.social.guilds.detail.html', + controller: ['$scope', 'Groups', '$stateParams', function($scope, Groups, $stateParams){ + $scope.group = Groups.Group.get({gid:$stateParams.gid}); + }] + }) + + // Options > Social > Challenges + .state('options.social.challenges', { + url: "/challenges", + controller: 'ChallengesCtrl', + templateUrl: "partials/options.social.challenges.html" + }) + .state('options.social.challenges.detail', { + url: '/:cid', + templateUrl: 'partials/options.social.challenges.detail.html', + controller: ['$scope', 'Challenges', '$stateParams', + function($scope, Challenges, $stateParams){ + $scope.obj = $scope.challenge = Challenges.Challenge.get({cid:$stateParams.cid}, function(){ + $scope.challenge._locked = true; + }); + }] + }) + .state('options.social.challenges.detail.member', { + url: '/:uid', + templateUrl: 'partials/options.social.challenges.detail.member.html', + controller: ['$scope', 'Challenges', '$stateParams', + function($scope, Challenges, $stateParams){ + $scope.obj = Challenges.Challenge.getMember({cid:$stateParams.cid, uid:$stateParams.uid}, function(){ + $scope.obj._locked = true; + }); + }] + }) + + // Options > Inventory + .state('options.inventory', { + url: '/inventory', + templateUrl: "partials/options.inventory.html" + }) + .state('options.inventory.inventory', { + url: '/inventory', + templateUrl: "partials/options.inventory.inventory.html" + }) + .state('options.inventory.stable', { + url: '/stable', + templateUrl: "partials/options.inventory.stable.html" + }) + + // Options > Settings + .state('options.settings', { + url: "/settings", + controller: 'SettingsCtrl', + templateUrl: "partials/options.settings.html" + }) + + // Options > Settings + .state('options.admin', { + url: "/admin", + controller: 'AdminCtrl', + templateUrl: "partials/options.admin.html" + }) + + var settings = JSON.parse(localStorage.getItem(STORAGE_SETTINGS_ID)); + if (settings && settings.auth) { + $httpProvider.defaults.headers.common['Content-Type'] = 'application/json;charset=utf-8'; + $httpProvider.defaults.headers.common['x-api-user'] = settings.auth.apiId; + $httpProvider.defaults.headers.common['x-api-key'] = settings.auth.apiToken; + } + + // Handle errors + var interceptor = ['$rootScope', '$q', function ($rootScope, $q) { + function success(response) { + return response; + } + function error(response) { + //var status = response.status; + response.data = (response.data.err) ? response.data.err : response.data; + if (response.status == 0) response.data = 'Server currently unreachable.'; + if (response.status == 500) response.data += ' (see Chrome console for more details).'; + + var error = response.status == 0 ? response.data : ('Error ' + response.status + ': ' + response.data); + $rootScope.$broadcast('responseError', error); + console.log(arguments); + return $q.reject(response); + } + return function (promise) { + return promise.then(success, error); + } + }]; + $httpProvider.responseInterceptors.push(interceptor); + }]) \ No newline at end of file diff --git a/public/js/controllers/adminCtrl.js b/public/js/controllers/adminCtrl.js new file mode 100644 index 0000000000..33059d5d86 --- /dev/null +++ b/public/js/controllers/adminCtrl.js @@ -0,0 +1,16 @@ +"use strict"; + +habitrpg.controller("AdminCtrl", ['$scope', '$rootScope', 'User', 'Members', 'Notification', + function($scope, $rootScope, User, Members, Notification) { + $scope.profile = undefined; + $scope.loadUser = function(uuid){ + $scope.profile = Members.Member.get({uid:uuid}); + } + $scope.save = function(profile) { + profile.$save(function(){ + Notification.text("User updated"); + $scope.profile = undefined; + $scope._uuid = undefined; + }) + } + }]) \ No newline at end of file diff --git a/public/js/controllers/authCtrl.js b/public/js/controllers/authCtrl.js new file mode 100644 index 0000000000..f1d4edecb3 --- /dev/null +++ b/public/js/controllers/authCtrl.js @@ -0,0 +1,96 @@ +"use strict"; + +/* + The authentication controller (login & facebook) + */ + +habitrpg.controller("AuthCtrl", ['$scope', '$rootScope', 'User', '$http', '$location', '$window','API_URL', + function($scope, $rootScope, User, $http, $location, $window, API_URL) { + var runAuth; + var showedFacebookMessage; + + $scope.useUUID = false; + $scope.toggleUUID = function() { + if (showedFacebookMessage === false) { + alert("Until we add Facebook, use your UUID and API Token to log in (found at https://habitrpg.com > Options > Settings)."); + showedFacebookMessage = true; + } + $scope.useUUID = !$scope.useUUID; + }; + + $scope.logout = function() { + localStorage.clear(); + window.location.href = '/logout'; + }; + + runAuth = function(id, token) { + User.authenticate(id, token, function(err) { + $window.location.href = '/'; + //$rootScope.modals.login = false; + }); + }; + + $scope.register = function() { + /*TODO highlight invalid inputs + we have this as a workaround for https://github.com/HabitRPG/habitrpg-mobile/issues/64 + */ + if ($scope.registrationForm.$invalid) { + return; + } + $http.post(API_URL + "/api/v1/register", $scope.registerVals).success(function(data, status, headers, config) { + runAuth(data.id, data.apiToken); + }).error(function(data, status, headers, config) { + if (status === 0) { + $window.alert("Server not currently reachable, try again later"); + } else if (!!data && !!data.err) { + $window.alert(data.err); + } else { + $window.alert("ERROR: " + status); + } + }); + }; + + function errorAlert(data, status, headers, config) { + if (status === 0) { + $window.alert("Server not currently reachable, try again later"); + } else if (!!data && !!data.err) { + $window.alert(data.err); + } else { + $window.alert("ERROR: " + status); + } + } + + $scope.auth = function() { + var data = { + username: $scope.loginUsername, + password: $scope.loginPassword + }; + if ($scope.useUUID) { + runAuth($scope.loginUsername, $scope.loginPassword); + } else { + $http.post(API_URL + "/api/v1/user/auth/local", data) + .success(function(data, status, headers, config) { + runAuth(data.id, data.token); + }).error(errorAlert); + } + }; + + $scope.playButtonClick = function(){ + if (User.authenticated()) { + window.location.href = '/#/tasks'; + } else { + $('#login-modal').modal('show'); + } + } + + $scope.passwordReset = function(email){ + $http.post(API_URL + '/api/v1/user/reset-password', {email:email}) + .success(function(){ + alert('New password sent.'); + }) + .error(function(data){ + alert(data.err); + }); + } + } +]); diff --git a/public/js/controllers/challengesCtrl.js b/public/js/controllers/challengesCtrl.js new file mode 100644 index 0000000000..96f61acf77 --- /dev/null +++ b/public/js/controllers/challengesCtrl.js @@ -0,0 +1,219 @@ +"use strict"; + +habitrpg.controller("ChallengesCtrl", ['$scope', 'User', 'Challenges', 'Notification', '$compile', 'Groups', '$state', + function($scope, User, Challenges, Notification, $compile, Groups, $state) { + + // FIXME get this from cache + Groups.Group.query({type:'party,guilds,tavern'}, function(groups){ + $scope.groups = groups; + $scope.search = { + group: _.reduce(groups, function(m,g){m[g._id]=true;return m;}, {}) + }; + }); + // FIXME $scope.challenges needs to be resolved first (see app.js) + $scope.challenges = Challenges.Challenge.query(); + // we should fix this, that's pretty brittle + +// $scope.$watch('search', function(search){ +// if (!search) $scope.filteredChallenges = $scope.challenges; +// $scope.filteredChallenges = $filter('filter')($scope.challenges, function(chal) { +// return (search.group[chal.group._id] && +// (typeof search._isMember == 'undefined' || search._isMember == chal._isMember)); +// }) +// }) + // TODO probably better to use $watch above, to avoid this being calculated on every digest cycle + $scope.filterChallenges = function(chal){ + return (!$scope.search) ? true : + ($scope.search.group[chal.group._id] && + (typeof $scope.search._isMember == 'undefined' || $scope.search._isMember == chal._isMember)); + } + + $scope.$watch('newChallenge.group', function(gid){ + if (!gid) return; + var group = _.find($scope.groups, {_id:gid}); + $scope.maxPrize = User.user.balance*4 + ((group && group.balance && group.leader==User.user._id) ? group.balance*4 : 0); + if (gid == 'habitrpg') $scope.newChallenge.prize = 1; + }) + + // override score() for tasks listed in challenges-editing pages, so that nothing happens + $scope.score = function(){} + + //------------------------------------------------------------ + // Challenge + //------------------------------------------------------------ + + /** + * Create + */ + $scope.create = function() { + $scope.obj = $scope.newChallenge = new Challenges.Challenge({ + name: '', + description: '', + habits: [], + dailys: [], + todos: [], + rewards: [], + leader: User.user._id, + group: null, + timestamp: +(new Date), + members: [] + }); + }; + + /** + * Save + */ + $scope.save = function(challenge) { + if (!challenge.group) return alert('Please select group'); + var isNew = !challenge._id; + challenge.$save(function(_challenge){ + if (isNew) { + Notification.text('Challenge Created'); + $state.go('options.social.challenges.detail', {cid: _challenge._id}); + $scope.discard(); + $scope.challenges = Challenges.Challenge.query(); + User.sync(); + } else { + // TODO figure out a more elegant way about this + //challenge._editing = false; + challenge._locked = true; + } + }); + }; + + /** + * Discard + */ + $scope.discard = function() { + $scope.newChallenge = null; + }; + + + /** + * Close Challenge + * ------------------ + */ + function backToChallenges(){ + $scope.popoverEl.popover('destroy'); + $state.go('options.social.challenges'); + $scope.challenges = Challenges.Challenge.query(); + User.log({}); + } + $scope.cancelClosing = function() { + $scope.popoverEl.popover('destroy'); + $scope.popoverEl = undefined; + $scope.closingChal = undefined; + } + $scope["delete"] = function(challenge) { + if (!confirm("Delete challenge, are you sure?")) return; + challenge.$delete(function(){ + $scope.popoverEl.popover('destroy'); + backToChallenges(); + }); + }; + $scope.selectWinner = function(challenge) { + if (!confirm("Are you sure?")) return; + challenge.$close({uid:challenge.winner}, function(){ + $scope.popoverEl.popover('destroy'); + backToChallenges(); + }) + } + $scope.close = function(challenge, $event) { + $scope.closingChal = challenge; + $scope.popoverEl = $($event.target); + var html = $compile('
')($scope); + $scope.popoverEl.popover('destroy').popover({ + html: true, + placement: 'right', + trigger: 'manual', + title: 'Close challenge and...', + content: html + }).popover('show'); + + } + + $scope.toggle = function(id){ + if($state.includes('options.social.challenges.detail', {cid: id})){ + $state.go('options.social.challenges') + }else{ + $state.go('options.social.challenges.detail', {cid: id}); + } + } + + $scope.toggleMember = function(cid, uid){ + if($state.includes('options.social.challenges.detail.member', {cid: cid, uid: uid})){ + $state.go('options.social.challenges.detail') + }else{ + $state.go('options.social.challenges.detail.member', {cid: cid, uid: uid}); + } + } + + //------------------------------------------------------------ + // Tasks + //------------------------------------------------------------ + + $scope.addTask = function(addTo, listDef) { + var task = window.habitrpgShared.helpers.taskDefaults({text: listDef.newTask, type: listDef.type}); + addTo.unshift(task); + //User.log({op: "addTask", data: task}); //TODO persist + delete listDef.newTask; + }; + + $scope.removeTask = function(list, $index) { + if (!confirm("Are you sure you want to delete this task?")) return; + //TODO persist + // User.log({op: "delTask", data: task}); + list.splice($index, 1); + }; + + $scope.saveTask = function(task){ + task._editing = false; + // TODO persist + } + + /* + -------------------------- + Subscription + -------------------------- + */ + + $scope.join = function(challenge){ + challenge.$join(function(){ + $scope.challenges = Challenges.Challenge.query(); + User.log({}); + }); + + } + + $scope.leave = function(keep) { + if (keep == 'cancel') { + $scope.selectedChal = undefined; + } else { + $scope.selectedChal.$leave({keep:keep}, function(){ + $scope.challenges = Challenges.Challenge.query(); + User.log({}); + }); + } + $scope.popoverEl.popover('destroy'); + } + + /** + * Named "clickLeave" to distinguish between "actual" leave above, since this triggers the + * "are you sure?" dialog. + */ + $scope.clickLeave = function(chal, $event) { + $scope.selectedChal = chal; + $scope.popoverEl = $($event.target); + var html = $compile( + 'Remove Tasks
\nKeep Tasks
\nCancel
' + )($scope); + $scope.popoverEl.popover('destroy').popover({ + html: true, + placement: 'top', + trigger: 'manual', + title: 'Leave challenge and...', + content: html + }).popover('show'); + } + +}]); \ No newline at end of file diff --git a/public/js/controllers/filtersCtrl.js b/public/js/controllers/filtersCtrl.js new file mode 100644 index 0000000000..3839074a6c --- /dev/null +++ b/public/js/controllers/filtersCtrl.js @@ -0,0 +1,43 @@ +"use strict"; + +habitrpg.controller("FiltersCtrl", ['$scope', '$rootScope', 'User', 'API_URL', '$http', + function($scope, $rootScope, User, API_URL, $http) { + var user = User.user; + $scope._editing = false; + + $scope.saveOrEdit = function(){ + if ($scope._editing) { + User.log({op:'set',data:{'tags':user.tags}}); + } + $scope._editing = !$scope._editing; + } + + $scope.toggleFilter = function(tag) { + user.filters[tag.id] = !user.filters[tag.id]; + // no longer persisting this, it was causing a lot of confusion - users thought they'd permanently lost tasks + // Note: if we want to persist for just this computer, easy method is: + // User.save(); + }; + + $scope.createTag = function(name) { + user.tags = user.tags || []; + user.tags.push({ + id: window.habitrpgShared.helpers.uuid(), + name: name + }); + User.log({op:'set',data:{'tags':user.tags}}); + $scope._newTag = ''; + }; + + + $scope['delete'] = function(tag, $index){ + delete user.filters[tag.id]; + user.tags.splice($index,1); + // remove tag from all tasks + _.each(user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards), function(task) { + delete task.tags[tag.id]; + }); + User.log({op:'delTag',data:{'tag':tag.id}}) + } + +}]); diff --git a/public/js/controllers/footerCtrl.js b/public/js/controllers/footerCtrl.js new file mode 100644 index 0000000000..401c40b9fc --- /dev/null +++ b/public/js/controllers/footerCtrl.js @@ -0,0 +1,65 @@ +"use strict"; + +habitrpg.controller("FooterCtrl", ['$scope', '$rootScope', 'User', '$http', 'Notification', 'API_URL', + function($scope, $rootScope, User, $http, Notification, API_URL) { + + /** + External Scripts + JS files not needed right away (google charts) or entirely optional (analytics) + Each file gets loaded async via $.getScript, so it doesn't bog page-load + */ + $scope.deferredScripts = function(){ + + // Stripe + $.getScript('//checkout.stripe.com/v2/checkout.js'); + + // Amazon Affiliate +// if ($rootScope.authenticated() && !User.user.purchased.ads) { +// $.getScript('//wms.assoc-amazon.com/20070822/US/js/link-enhancer-common.js?tag=ha0d2-20').fail(function() { +// $('body').append(''); +// }); +// } + + // Google Analytics, only in production + if (window.env.NODE_ENV === 'production') { + window._gaq = [["_setAccount", "UA-33510635-1"], ["_setDomainName", "habitrpg.com"], ["_trackPageview"]]; + $.getScript(("https:" === document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js"); + } + + // Scripts only for desktop + if (!window.env.IS_MOBILE) { + // Add This + $.getScript("//s7.addthis.com/js/250/addthis_widget.js#pubid=lefnire"); + + // Google Charts + $.getScript("//www.google.com/jsapi", function() { + google.load("visualization", "1", { + packages: ["corechart"], + callback: function() {} + }); + }); + } + } + + /** + * Debug functions. Note that the server route for gems is only available if process.env.DEBUG=true + */ + $scope.addMissedDay = function(){ + if (!confirm("Are you sure you want to reset the day?")) return; + var dayBefore = moment(User.user.lastCron).subtract('days', 1).toDate(); + User.set('lastCron', dayBefore); + Notification.text('-1 day, remember to refresh'); + } + $scope.addTenGems = function(){ + console.log(API_URL); + $http.post(API_URL + '/api/v1/user/addTenGems').success(function(){ + User.log({}); + }) + } + $scope.addLevelsAndGold = function(){ + User.setMultiple({ + 'stats.exp': User.user.stats.exp + 10000, + 'stats.gp': User.user.stats.gp + 10000 + }); + } + }]) \ No newline at end of file diff --git a/public/js/controllers/groupsCtrl.js b/public/js/controllers/groupsCtrl.js new file mode 100644 index 0000000000..5f6bd6e115 --- /dev/null +++ b/public/js/controllers/groupsCtrl.js @@ -0,0 +1,240 @@ +"use strict"; + +habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'API_URL', '$q', 'User', 'Members', '$state', + function($scope, $rootScope, Groups, $http, API_URL, $q, User, Members, $state) { + + $scope.isMember = function(user, group){ + return ~(group.members.indexOf(user._id)); + } + + $scope.Members = Members; + $scope._editing = {group:false}; + + $scope.save = function(group){ + if(group._newLeader && group._newLeader._id) group.leader = group._newLeader._id; + group.$save(); + group._editing = false; + } + + $scope.addWebsite = function(group){ + group.websites.push(group._newWebsite); + group._newWebsite = ''; + } + + $scope.removeWebsite = function(group, $index){ + group.websites.splice($index,1); + } + + // ------ Modals ------ + + $scope.clickMember = function(uid, forceShow) { + if (User.user._id == uid && !forceShow) { + if ($state.is('tasks')) { + $state.go('options'); + } else { + $state.go('tasks'); + } + } else { + // We need the member information up top here, but then we pass it down to the modal controller + // down below. Better way of handling this? + Members.selectMember(uid); + $rootScope.modals.member = true; + } + } + + $scope.removeMember = function(group, member, isMember){ + var yes = confirm("Do you really want to remove this member from the party?") + if(yes){ + Groups.Group.removeMember({gid: group._id, uuid: member._id }, undefined, function(){ + if(isMember){ + _.pull(group.members, member); + }else{ + _.pull(group.invites, member); + } + }); + } + } + + // ------ Invites ------ + + $scope.invite = function(group){ + Groups.Group.invite({gid: group._id, uuid: group.invitee}, undefined, function(){ + group.invitee = ''; + }, function(){ + group.invitee = ''; + }); + } + } + ]) + + .controller("MemberModalCtrl", ['$scope', '$rootScope', 'Members', + function($scope, $rootScope, Members) { + $scope.timestamp = function(timestamp){ + return moment(timestamp).format('MM/DD/YYYY'); + } + // We watch Members.selectedMember because it's asynchronously set, so would be a hassle to handle updates here + $scope.$watch( function() { return Members.selectedMember; }, function (member) { + $scope.profile = member; + }); + } + ]) + + .controller('ChatCtrl', ['$scope', 'Groups', 'User', function($scope, Groups, User){ + $scope._chatMessage = ''; + $scope._sending = false; + + $scope.postChat = function(group, message){ + if (_.isEmpty(message) || $scope._sending) return; + $scope._sending = true; + var previousMsg = (group.chat && group.chat[0]) ? group.chat[0].id : false; + Groups.Group.postChat({gid: group._id, message:message, previousMsg: previousMsg}, undefined, function(data){ + if(data.chat){ + group.chat = data.chat; + }else if(data.message){ + group.chat.unshift(data.message); + } + $scope._chatMessage = ''; + $scope._sending = false; + }, function(err){ + $scope._sending = false; + }); + } + + $scope.deleteChatMessage = function(group, message){ + if(message.uuid === User.user.id || (User.user.backer && User.user.contributor.admin)){ + var previousMsg = (group.chat && group.chat[0]) ? group.chat[0].id : false; + Groups.Group.deleteChatMessage({gid:group._id, messageId:message.id, previousMsg:previousMsg}, undefined, function(data){ + if(data.chat) group.chat = data.chat; + + var i = _.findIndex(group.chat, {id: message.id}); + if(i !== -1) group.chat.splice(i, 1); + }); + } + } + + $scope.sync = function(group){ + group.$get(); + } + + }]) + + .controller("GuildsCtrl", ['$scope', 'Groups', 'User', '$rootScope', '$state', '$location', + function($scope, Groups, User, $rootScope, $state, $location) { + $scope.groups = { + guilds: Groups.myGuilds(), + "public": Groups.publicGuilds() + } + $scope.type = 'guild'; + $scope.text = 'Guild'; + $scope.newGroup = new Groups.Group({type:'guild', privacy:'private', leader: User.user._id, members: [User.user._id]}); + + $scope.create = function(group){ + if (User.user.balance < 1) return $rootScope.modals.buyGems = true; + + if (confirm("Create Guild for 4 Gems?")) { + group.$save(function(saved){ + User.user.balance--; + $scope.groups.guilds.push(saved); + if(saved.privacy === 'public') $scope.groups.public.push(saved); + $state.go('options.social.guilds.detail', {gid: saved._id}); + }); + } + } + + $scope.join = function(group){ + // If we're accepting an invitation, we don't have the actual group object, but a faux group object (for performance + // purposes) {id, name}. Let's trick ngResource into thinking we have a group, so we can call the same $join + // function (server calls .attachGroup(), which finds group by _id and handles this properly) + if (group.id && !group._id) { + group = new Groups.Group({_id:group.id}); + } + + group.$join(function(joined){ + var i = _.findIndex(User.user.invitations.guilds, {id:joined._id}); + if (~i) User.user.invitations.guilds.splice(i,1); + $scope.groups.guilds.push(joined); + if(joined.privacy == 'public'){ + joined._isMember = true; + joined.memberCount++; + } + $state.go('options.social.guilds.detail', {gid: joined._id}); + }) + } + + $scope.leave = function(group){ + if (confirm("Are you sure you want to leave this guild?") !== true) { + return; + } + Groups.Group.leave({gid: group._id}, undefined, function(){ + $scope.groups.guilds.splice(_.indexOf($scope.groups.guilds, group), 1); + // remove user from group members if guild is public so that he can re-join it immediately + if(group.privacy == 'public' || !group.privacy){ //public guilds with only some fields fetched + var i = _.findIndex($scope.groups.public, {_id: group._id}); + if(~i){ + var guild = $scope.groups.public[i]; + guild.memberCount--; + guild._isMember = false; + } + } + $state.go('options.social.guilds'); + }); + } + + $scope.reject = function(guild){ + var i = _.findIndex(User.user.invitations.guilds, {id:guild.id}); + if (~i){ + User.user.invitations.guilds.splice(i, 1); + User.set('invitations.guilds', User.user.invitations.guilds); + } + } + } + ]) + + .controller("PartyCtrl", ['$scope', 'Groups', 'User', '$state', + function($scope, Groups, User, $state) { + $scope.type = 'party'; + $scope.text = 'Party'; + $scope.group = Groups.party(); + $scope.newGroup = new Groups.Group({type:'party', leader: User.user._id, members: [User.user._id]}); + $scope.create = function(group){ + group.$save(function(newGroup){ + $scope.group = newGroup; + }); + } + + $scope.join = function(party){ + var group = new Groups.Group({_id: party.id, name: party.name}); + // there a better way to access GroupsCtrl.groups.party? + group.$join(function(groupJoined){ + $scope.group = groupJoined; + }); + } + + $scope.leave = function(group){ + if (confirm("Are you sure you want to leave this party?") !== true) { + return; + } + Groups.Group.leave({gid: group._id}, undefined, function(){ + $scope.group = undefined; + }); + } + + $scope.reject = function(){ + User.user.invitations.party = undefined; + User.log({op:'set',data:{'invitations.party':{}}}); + } + } + ]) + + .controller("TavernCtrl", ['$scope', 'Groups', 'User', + function($scope, Groups, User) { + $scope.group = Groups.tavern(); + $scope.rest = function(){ + User.user.flags.rest = !User.user.flags.rest; + User.log({op:'set',data:{'flags.rest':User.user.flags.rest}}); + } + $scope.toggleUserTier = function($event) { + $($event.target).next().toggle(); + } + } + ]) diff --git a/public/js/controllers/headerCtrl.js b/public/js/controllers/headerCtrl.js new file mode 100644 index 0000000000..65da48b89e --- /dev/null +++ b/public/js/controllers/headerCtrl.js @@ -0,0 +1,11 @@ +"use strict"; + +habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User', + function($scope, Groups, User) { + $scope.party = Groups.party(function(){ + $scope.partyMinusSelf = _.filter($scope.party.members, function(member){ + return member._id !== User.user._id; + }); + }); + } +]); diff --git a/public/js/controllers/inventoryCtrl.js b/public/js/controllers/inventoryCtrl.js new file mode 100644 index 0000000000..6dc8d16955 --- /dev/null +++ b/public/js/controllers/inventoryCtrl.js @@ -0,0 +1,92 @@ +habitrpg.controller("InventoryCtrl", ['$scope', 'User', + function($scope, User) { + + // convenience vars since these are accessed frequently + $scope.userEggs = User.user.items.eggs; + $scope.userHatchingPotions = User.user.items.hatchingPotions; + + $scope.selectedEgg = null; // {index: 1, name: "Tiger", value: 5} + $scope.selectedPotion = null; // {index: 5, name: "Red", value: 3} + + $scope.chooseEgg = function(egg, $index){ + if ($scope.selectedEgg && $scope.selectedEgg.index == $index) { + return $scope.selectedEgg = null; // clicked same egg, unselect + } + var eggData = _.defaults({index:$index}, egg); + if (!$scope.selectedPotion) { + $scope.selectedEgg = eggData; + } else { + $scope.hatch(eggData, $scope.selectedPotion); + } + } + + $scope.choosePotion = function(potion, $index){ + if ($scope.selectedPotion && $scope.selectedPotion.index == $index) { + return $scope.selectedPotion = null; // clicked same egg, unselect + } + // we really didn't think through the way these things are stored and getting passed around... + var potionData = _.findWhere(window.habitrpgShared.items.items.hatchingPotions, {name:potion}); + potionData = _.defaults({index:$index}, potionData); + if (!$scope.selectedEgg) { + $scope.selectedPotion = potionData; + } else { + $scope.hatch($scope.selectedEgg, potionData); + } + } + + $scope.sellInventory = function() { + if ($scope.selectedEgg) { + $scope.userEggs.splice($scope.selectedEgg.index, 1); + User.setMultiple({ + 'items.eggs': $scope.userEggs, + 'stats.gp': User.user.stats.gp + $scope.selectedEgg.value + }); + $scope.selectedEgg = null; + } else if ($scope.selectedPotion) { + $scope.userHatchingPotions.splice($scope.selectedPotion.index, 1); + User.setMultiple({ + 'items.hatchingPotions': $scope.userHatchingPotions, + 'stats.gp': User.user.stats.gp + $scope.selectedPotion.value + }); + $scope.selectedPotion = null; + } + } + + $scope.ownsPet = function(egg, potion){ + if (!egg || !potion) return; + var pet = egg.name + '-' + potion; + return User.user.items.pets && ~User.user.items.pets.indexOf(pet) + } + + $scope.selectableInventory = function(egg, potion, $index) { + if (!egg || !potion) return; + // FIXME this isn't updating the view for some reason + //if ($scope.selectedEgg && $scope.selectedEgg.index == $index) return 'selectableInventory'; + //if ($scope.selectedPotion && $scope.selectedPotion.index == $index) return 'selectableInventory'; + if (!$scope.ownsPet(egg, potion)) return 'selectableInventory'; + } + + $scope.hatch = function(egg, potion){ + if ($scope.ownsPet(egg, potion.name)){ + return alert("You already have that pet, hatch a different combo.") + } + var pet = egg.name + '-' + potion.name; + $scope.userEggs.splice(egg.index, 1); + $scope.userHatchingPotions.splice(potion.index, 1); + + if(!User.user.items.pets) User.user.items.pets = []; + User.user.items.pets.push(pet); + + User.log([ + { op: 'set', data: {'items.pets': User.user.items.pets} }, + { op: 'set', data: {'items.eggs': $scope.userEggs} }, + { op: 'set', data: {'items.hatchingPotions': $scope.userHatchingPotions} } + ]); + + alert("Your egg hatched! Visit your stable to equip your pet."); + + $scope.selectedEgg = null; + $scope.selectedPotion = null; + } + + }]); \ No newline at end of file diff --git a/public/js/controllers/marketCtrl.js b/public/js/controllers/marketCtrl.js new file mode 100644 index 0000000000..c0cf429539 --- /dev/null +++ b/public/js/controllers/marketCtrl.js @@ -0,0 +1,37 @@ +habitrpg.controller("MarketCtrl", ['$rootScope', '$scope', 'User', 'API_URL', '$http', + function($rootScope, $scope, User, API_URL, $http) { + + $scope.eggs = window.habitrpgShared.items.items.pets; + $scope.hatchingPotions = window.habitrpgShared.items.items.hatchingPotions; + $scope.userEggs = User.user.items.eggs; + $scope.userHatchingPotions = User.user.items.hatchingPotions; + + $scope.buy = function(type, item){ + var gems = User.user.balance * 4, + store = type === 'egg' ? $scope.userEggs : $scope.userHatchingPotions, + storePath = type === 'egg' ? 'items.eggs' : 'items.hatchingPotions' + + if(gems < item.value){ + return $rootScope.modals.buyGems = true; + } + + var message = "Buy this " + (type == 'egg' ? 'egg' : 'hatching potion') + " with " + item.value + " of your " + gems + " Gems?" + + if(confirm(message)){ + $http.post(API_URL + '/api/v1/market/buy?type=' + type, item) + .success(function(data){ + // don't know what's going on, but trying to work with the returned data (a) isn't updating the ui, (b) isnt' + // stickign between refreshes until a force-refresh is called (user._v--). + User.user._v--; + User.log({}); + //User.user.balance = data.balance; + store.push(type === 'egg' ? item : item.name); + //$scope.items = data.items.eggs; // FIXME this isn't updating the UI + }).error(function(data){ + alert(data); + console.error(data); + }); + } + } + + }]); \ No newline at end of file diff --git a/public/js/controllers/notificationCtrl.js b/public/js/controllers/notificationCtrl.js new file mode 100644 index 0000000000..618964f70f --- /dev/null +++ b/public/js/controllers/notificationCtrl.js @@ -0,0 +1,75 @@ +'use strict'; + +habitrpg.controller('NotificationCtrl', + ['$scope', '$rootScope', 'User', 'Guide', 'Notification', function ($scope, $rootScope, User, Guide, Notification) { + + $rootScope.$watch('user.stats.hp', function(after, before) { + if (after == before) return; + Notification.hp(after - before, 'hp'); + }); + + $rootScope.$watch('user.stats.exp', function(after, before) { + if (after == before) return; + Notification.exp(after - before); + }); + + $rootScope.$watch('user.stats.gp', function(after, before) { + if (after == before) return; + var money = after - before; + Notification.gp(money); + + //Append Bonus + var bonus = User.user._tmp.streakBonus; + + if ((money > 0) && !!bonus) { + if (bonus < 0.01) bonus = 0.01; + Notification.text("+ " + Notification.coins(bonus) + " Streak Bonus!"); + delete User.user._tmp.streakBonus; + } + }); + + $rootScope.$watch('user._tmp.drop', function(after, before){ + if (after == before || !after) return; + $rootScope.modals.drop = true; + }); + + $rootScope.$watch('user.achievements.streak', function(after, before){ + if(after == before || after < before) return; + $rootScope.modals.achievements.streak = true; + }); + + $rootScope.$watch('user.achievements.ultimateGear', function(after, before){ + if (after === before || after !== true) return; + $rootScope.modals.achievements.ultimateGear = true; + }); + + $rootScope.$watch('user.items.pets.length', function(after, before){ + if(after === before || after < 90) return; + User.user.achievements.beastMaster = true; + $rootScope.modals.achievements.beastMaster = true; + }) + + /*_.each(['weapon', 'head', 'chest', 'shield'], function(watched){ + $rootScope.$watch('user.items.' + watched, function(before, after){ + if (after == before) return; + if (+after < +before) { + Notification.death(); + //don't want to day "lost a head" + if (watched === 'head') watched = 'helm'; + Notification.text('Lost GP, 1 LVL, ' + watched); + } + }) + });*/ + + $rootScope.$watch('user.stats.lvl', function(after, before) { + if (after == before) return; + if (after > before) { + Notification.lvl(); + } + }); + + $rootScope.$on('responseError', function(ev, error){ + Notification.error(error); + }); + } +]); diff --git a/public/js/controllers/petsCtrl.js b/public/js/controllers/petsCtrl.js new file mode 100644 index 0000000000..7d4e6ba5ed --- /dev/null +++ b/public/js/controllers/petsCtrl.js @@ -0,0 +1,32 @@ +habitrpg.controller("PetsCtrl", ['$scope', 'User', + function($scope, User) { + + $scope.userPets = User.user.items.pets; + $scope.userCurrentPet = User.user.items.currentPet; + $scope.pets = window.habitrpgShared.items.items.pets; + $scope.hatchingPotions = window.habitrpgShared.items.items.hatchingPotions; + $scope.totalPets = $scope.pets.length * $scope.hatchingPotions.length; + + $scope.hasPet = function(name, potion){ + if (!$scope.userPets) return false; + return _.contains($scope.userPets, name + '-' + potion) ? true : false; + } + + $scope.isCurrentPet = function(name, potion){ + if (!$scope.userCurrentPet || !$scope.userPets) return false; + return $scope.userCurrentPet.str === (name + '-' + potion); + } + + $scope.choosePet = function(name, potion){ + if($scope.userCurrentPet && $scope.userCurrentPet.str === (name + '-' + potion)){ + $scope.userCurrentPet = null; + }else{ + var pet = _.find($scope.pets, {name: name}); + pet.modifier = potion; + pet.str = name + '-' + potion; + $scope.userCurrentPet = pet; + } + User.set('items.currentPet', $scope.userCurrentPet); + } + + }]); \ No newline at end of file diff --git a/public/js/controllers/rootCtrl.js b/public/js/controllers/rootCtrl.js new file mode 100644 index 0000000000..eab96974a5 --- /dev/null +++ b/public/js/controllers/rootCtrl.js @@ -0,0 +1,121 @@ +"use strict"; + +/* Make user and settings available for everyone through root scope. + */ + +habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$http', '$state', '$stateParams', + function($scope, $rootScope, $location, User, $http, $state, $stateParams) { + $rootScope.modals = {}; + $rootScope.modals.achievements = {}; + $rootScope.User = User; + $rootScope.user = User.user; + $rootScope.settings = User.settings; + + // Angular UI Router + $rootScope.$state = $state; + $rootScope.$stateParams = $stateParams; + + // indexOf helper + $scope.indexOf = function(haystack, needle){ + return haystack && ~haystack.indexOf(needle); + } + + $scope.safeApply = function(fn) { + var phase = this.$root.$$phase; + if(phase == '$apply' || phase == '$digest') { + if(fn && (typeof(fn) === 'function')) { + fn(); + } + } else { + this.$apply(fn); + } + }; + + /* + FIXME this is dangerous, organize helpers.coffee better, so we can group them by which controller needs them, + and then simply _.defaults($scope, Helpers.user) kinda thing + */ + _.defaults($rootScope, window.habitrpgShared.algos); + _.defaults($rootScope, window.habitrpgShared.helpers); + + $rootScope.set = User.set; + $rootScope.authenticated = User.authenticated; + + $rootScope.dismissAlert = function() { + $rootScope.modals.newStuff = false; + $rootScope.set('flags.newStuff',false); + } + + $rootScope.notPorted = function(){ + alert("This feature is not yet ported from the original site."); + } + + $rootScope.dismissErrorOrWarning = function(type, $index){ + $rootScope.flash[type].splice($index, 1); + } + + $rootScope.showStripe = function() { + StripeCheckout.open({ + key: window.env.STRIPE_PUB_KEY, + address: false, + amount: 500, + name: "Checkout", + description: "Buy 20 Gems, Disable Ads, Support the Developers", + panelLabel: "Checkout", + token: function(data) { + $scope.$apply(function(){ + $http.post("/api/v1/user/buy-gems", data) + .success(function() { + window.location.href = "/"; + }).error(function(err) { + alert(err); + }); + }) + } + }); + } + + $scope.contribText = function(contrib, backer){ + if (!contrib && !backer) return; + if (backer && backer.npc) return backer.npc; + var l = contrib && contrib.level; + if (l && l > 0) { + var level = (l < 3) ? 'Friend' : (l < 5) ? 'Elite' : (l < 7) ? 'Champion' : (l < 8) ? 'Legendary' : 'Heroic'; + return level + ' ' + contrib.text; + } + } + + $rootScope.charts = {}; + $rootScope.toggleChart = function(id, task) { + var history = [], matrix, data, chart, options; + switch (id) { + case 'exp': + $rootScope.charts.exp = !$rootScope.charts.exp; + history = User.user.history.exp; + break; + case 'todos': + $rootScope.charts.todos = !$rootScope.charts.todos; + history = User.user.history.todos; + break; + default: + $rootScope.charts[id] = !$rootScope.charts[id]; + history = task.history; + if (task && task._editing) task._editing = false; + } + matrix = [['Date', 'Score']]; + _.each(history, function(obj) { + matrix.push([moment(obj.date).format('MM/DD/YY'), obj.value]); + }); + data = google.visualization.arrayToDataTable(matrix); + options = { + title: 'History', + backgroundColor: { + fill: 'transparent' + }, + width:300 + }; + chart = new google.visualization.LineChart($("." + id + "-chart")[0]); + chart.draw(data, options); + }; + } +]); diff --git a/public/js/controllers/settingsCtrl.js b/public/js/controllers/settingsCtrl.js new file mode 100644 index 0000000000..dec606770f --- /dev/null +++ b/public/js/controllers/settingsCtrl.js @@ -0,0 +1,110 @@ +'use strict'; + +// Make user and settings available for everyone through root scope. +habitrpg.controller('SettingsCtrl', + ['$scope', 'User', '$rootScope', '$http', 'API_URL', 'Guide', '$location', + function($scope, User, $rootScope, $http, API_URL, Guide, $location) { + + // FIXME we have this re-declared everywhere, figure which is the canonical version and delete the rest +// $scope.auth = function (id, token) { +// User.authenticate(id, token, function (err) { +// if (!err) { +// alert('Login successful!'); +// $location.path("/habit"); +// } +// }); +// } + + $scope.showTour = function(){ + User.set('flags.showTour',true); + Guide.initTour(); + $location.path('/tasks'); + } + + $scope.showBailey = function(){ + User.set('flags.newStuff',true); + } + + $scope.saveDayStart = function(){ + var dayStart = +User.user.preferences.dayStart; + if (dayStart < 0 || dayStart > 24) { + dayStart = 0; + } + User.log({'op':'set', data:{'preferences.dayStart': dayStart}}); + } + + $scope.reroll = function(){ + + $http.post(API_URL + '/api/v1/user/reroll') + .success(function(){ + window.location.href = '/'; + // FIXME, I can't get the tasks to update in the browser, even with _.extend(user,data). refreshing for now + }) + .error(function(data){ + alert(data.err) + }) + } + + $scope.changePassword = function(changePass){ + if (!changePass.oldPassword || !changePass.newPassword || !changePass.confirmNewPassword) { + return alert("Please fill out all fields"); + } + $http.post(API_URL + '/api/v1/user/change-password', changePass) + .success(function(){ + alert("Password successfully changed"); + $scope.changePass = {}; + }) + .error(function(data){ + alert(data); + }); + } + + $scope.restoreValues = {}; + $rootScope.$watch('modals.restore', function(value){ + if(value === true){ + $scope.restoreValues.stats = angular.copy(User.user.stats); + $scope.restoreValues.items = angular.copy(User.user.items); + $scope.restoreValues.achievements = {streak: User.user.achievements.streak || 0}; + } + }) + + $scope.restore = function(){ + var stats = $scope.restoreValues.stats, + items = $scope.restoreValues.items, + achievements = $scope.restoreValues.achievements; + User.setMultiple({ + "stats.hp": stats.hp, + "stats.exp": stats.exp, + "stats.gp": stats.gp, + "stats.lvl": stats.lvl, + "items.weapon": items.weapon, + "items.armor": items.armor, + "items.head": items.head, + "items.shield": items.shield, + "achievements.streak": achievements.streak + }); + $rootScope.modals.restore = false; + } + $scope.reset = function(){ + $http.post(API_URL + '/api/v1/user/reset') + .success(function(){ + User.user._v--; + User.log({}); + $rootScope.modals.reset = false; + }) + .error(function(data){ + alert(data); + }); + } + $scope['delete'] = function(){ + $http['delete'](API_URL + '/api/v1/user') + .success(function(){ + localStorage.clear(); + window.location.href = '/logout'; + }) + .error(function(data){ + alert(data); + }); + } + } +]); diff --git a/public/js/controllers/tasksCtrl.js b/public/js/controllers/tasksCtrl.js new file mode 100644 index 0000000000..5b599e9473 --- /dev/null +++ b/public/js/controllers/tasksCtrl.js @@ -0,0 +1,146 @@ +"use strict"; + +habitrpg.controller("TasksCtrl", ['$scope', '$rootScope', '$location', 'User', 'Algos', 'Helpers', 'Notification', '$http', 'API_URL', + function($scope, $rootScope, $location, User, Algos, Helpers, Notification, $http, API_URL) { + $scope.obj = User.user; // used for task-lists + + $scope.score = function(task, direction) { + if (task.type === "reward" && User.user.stats.gp < task.value){ + return Notification.text('Not enough GP.'); + } + Algos.score(User.user, task, direction); + User.log({op: "score",data: task, dir: direction}); + + }; + + $scope.addTask = function(addTo, listDef) { + var task = window.habitrpgShared.helpers.taskDefaults({text: listDef.newTask, type: listDef.type}, User.user.filters); + addTo.unshift(task); + User.log({op: "addTask", data: task}); + delete listDef.newTask; + }; + + /** + * Add the new task to the actions log + */ + $scope.clearDoneTodos = function() {}; + + /** + * This is calculated post-change, so task.completed=true if they just checked it + */ + $scope.changeCheck = function(task) { + if (task.completed) { + $scope.score(task, "up"); + } else { + $scope.score(task, "down"); + } + }; + /* TODO this should be somewhere else, but fits the html location better here + */ + + $scope.removeTask = function(list, $index) { + if (!confirm("Are you sure you want to delete this task?")) return; + User.log({ op: "delTask", data: list[$index] }); + list.splice($index, 1); + }; + + $scope.saveTask = function(task) { + var setVal = function(k, v) { + var op; + if (typeof v !== "undefined") { + op = { op: "set", data: {} }; + op.data["tasks." + task.id + "." + k] = v; + return log.push(op); + } + }; + var log = []; + setVal("text", task.text); + setVal("notes", task.notes); + setVal("priority", task.priority); + setVal("tags", task.tags); + if (task.type === "habit") { + setVal("up", task.up); + setVal("down", task.down); + } else if (task.type === "daily") { + setVal("repeat", task.repeat); + // TODO we'll remove this once rewrite's running for a while. This was a patch for derby issues + setVal("streak", task.streak); + + } else if (task.type === "todo") { + setVal("date", task.date); + } else { + if (task.type === "reward") { + setVal("value", task.value); + } + } + User.log(log); + task._editing = false; + }; + + /** + * Reset $scope.task to $scope.originalTask + */ + $scope.cancel = function() { + var key; + for (key in $scope.task) { + $scope.task[key] = $scope.originalTask[key]; + } + $scope.originalTask = null; + $scope.editedTask = null; + $scope.editing = false; + }; + + $scope.unlink = function(task, keep) { + // TODO move this to userServices, turn userSerivces.user into ng-resource + $http.post(API_URL + '/api/v1/user/task/' + task.id + '/unlink?keep=' + keep) + .success(function(){ + User.log({}); + }); + }; + + /* + ------------------------ + Items + ------------------------ + */ + + var updateStore = function(){ + var sorted, updated; + updated = window.habitrpgShared.items.updateStore(User.user); + /* Figure out whether we wanna put this in habitrpg-shared + */ + + sorted = [updated.weapon, updated.armor, updated.head, updated.shield, updated.potion, updated.reroll]; + $scope.itemStore = sorted; + } + + updateStore(); + + $scope.buy = function(type) { + var hasEnough = window.habitrpgShared.items.buyItem(User.user, type); + if (hasEnough) { + User.log({op: "buy",type: type}); + Notification.text("Item purchased."); + updateStore(); + } else { + Notification.text("Not enough GP."); + } + }; + + $scope.clearCompleted = function() { + User.user.todos = _.reject(User.user.todos, {completed:true}); + User.log({op: 'clear-completed'}); + } + + /** + * See conversation on http://productforums.google.com/forum/#!topic/adsense/WYkC_VzKwbA, + * Adsense is very sensitive. It must be called once-and-only-once for every , else things break. + * Additionally, angular won't run javascript embedded into a script template, so we can't copy/paste + * the html provided by adsense - we need to run this function post-link + */ + $scope.initAds = function(){ + $.getScript('//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js'); + (window.adsbygoogle = window.adsbygoogle || []).push({}); + } + + }]); diff --git a/public/js/controllers/userCtrl.js b/public/js/controllers/userCtrl.js new file mode 100644 index 0000000000..d306020935 --- /dev/null +++ b/public/js/controllers/userCtrl.js @@ -0,0 +1,41 @@ +"use strict"; + +habitrpg.controller("UserCtrl", ['$rootScope', '$scope', '$location', 'User', '$http', + function($rootScope, $scope, $location, User, $http) { + $scope.profile = User.user; + $scope.hideUserAvatar = function() { + $(".userAvatar").hide(); + }; + $scope.toggleHelm = function(val){ + User.log({op:'set', data:{'preferences.showHelm':val}}); + } + + $scope.$watch('_editing.profile', function(value){ + if(value === true) $scope.editingProfile = angular.copy(User.user.profile); + }); + + $scope.save = function(){ + var values = {}; + _.each($scope.editingProfile, function(value, key){ + // Using toString because we need to compare two arrays (websites) + var curVal = $scope.profile.profile[key]; + if(!curVal || $scope.editingProfile[key].toString() !== curVal.toString()) + values['profile.' + key] = value; + }); + User.setMultiple(values); + $scope._editing.profile = false; + } + + $scope.addWebsite = function(){ + if (!$scope.editingProfile.websites) $scope.editingProfile.websites = []; + $scope.editingProfile.websites.push($scope._newWebsite); + $scope._newWebsite = ''; + } + $scope.removeWebsite = function($index){ + $scope.editingProfile.websites.splice($index,1); + } + + $scope.unlock = User.unlock; + + } +]); diff --git a/public/js/directives/directives.js b/public/js/directives/directives.js new file mode 100644 index 0000000000..62c225f39f --- /dev/null +++ b/public/js/directives/directives.js @@ -0,0 +1,155 @@ +'use strict'; + +/** + * Directive that places focus on the element it is applied to when the expression it binds to evaluates to true. + */ +habitrpg.directive('taskFocus', + ['$timeout', + function($timeout) { + return function(scope, elem, attrs) { + scope.$watch(attrs.taskFocus, function(newval) { + if ( newval ) { + $timeout(function() { + elem[0].focus(); + }, 0, false); + } + }); + }; + } +]); + +habitrpg.directive('habitrpgAdsense', function() { + return { + restrict: 'A', + transclude: true, + replace: true, + template: '
', + link: function ($scope, element, attrs) {} + } +}) + +habitrpg.directive('whenScrolled', function() { + return function(scope, elm, attr) { + var raw = elm[0]; + + elm.bind('scroll', function() { + if (raw.scrollTop + raw.offsetHeight >= raw.scrollHeight) { + scope.$apply(attr.whenScrolled); + } + }); + }; +}); + +/** + * Add sortable + */ +habitrpg.directive('habitrpgSortable', ['User', function(User) { + return function($scope, element, attrs, ngModel) { + $(element).sortable({ + axis: "y", + distance: 5, + start: function (event, ui) { + ui.item.data('startIndex', ui.item.index()); + }, + stop: function (event, ui) { + var taskType = angular.element(ui.item[0]).scope().task.type + 's'; + var startIndex = ui.item.data('startIndex'); + var task = User.user[taskType][startIndex]; + // FIXME - this is a really inconsistent way of API handling. we need to fix the batch-update route + User.log({op: 'sortTask', data: _.defaults({from: startIndex, to: ui.item.index()}, task)}); + } + }); + } +}]); + +/** + * Markdown + * See http://www.heikura.me/#!/angularjs-markdown-directive + */ +(function(){ + var md = function () { + marked.setOptions({ + gfm:true, + pedantic:false, + sanitize:true + // callback for code highlighter + // Uncomment this (and htljs.tabReplace below) if we add in highlight.js (http://www.heikura.me/#!/angularjs-markdown-directive) +// highlight:function (code, lang) { +// if (lang != undefined) +// return hljs.highlight(lang, code).value; +// +// return hljs.highlightAuto(code).value; +// } + }); + + var toHtml = function (markdown) { + if (markdown == undefined) + return ''; + + return marked(markdown); + }; + + //hljs.tabReplace = ' '; + + return { + toHtml:toHtml + }; + }(); + + habitrpg.directive('markdown', function() { + return { + restrict: 'E', + link: function(scope, element, attrs) { + scope.$watch(attrs.ngModel, function(value, oldValue) { + var markdown = value; + var html = md.toHtml(markdown); + element.html(html); + }); + } + }; + }); +})() + +habitrpg + .directive('habitrpgTasks', ['$rootScope', 'User', function($rootScope, User) { + return { + restrict: 'EA', + templateUrl: 'templates/habitrpg-tasks.html', + //transclude: true, + //scope: { + // main: '@', // true if it's the user's main list + // obj: '=' + //}, + controller: ['$scope', '$rootScope', function($scope, $rootScope){ + $scope.editTask = function(task){ + task._editing = !task._editing; + if($rootScope.charts[task.id]) $rootScope.charts[task.id] = false; + }; + }], + link: function(scope, element, attrs) { + // $scope.obj needs to come from controllers, so we can pass by ref + scope.main = attrs.main; + $rootScope.lists = [ + { + header: 'Habits', + type: 'habit', + placeHolder: 'New Habit' + }, { + header: 'Dailies', + type: 'daily', + placeHolder: 'New Daily' + }, { + header: 'To-Dos', + type: 'todo', + placeHolder: 'New To-Do' + }, { + header: 'Rewards', + type: 'reward', + placeHolder: 'New Reward' + } + ]; + + } + } + }]); + diff --git a/public/js/filters/filters.js b/public/js/filters/filters.js new file mode 100644 index 0000000000..65223c5957 --- /dev/null +++ b/public/js/filters/filters.js @@ -0,0 +1,10 @@ +angular.module('habitrpg') + .filter('gold', function () { + return function (gp) { + return Math.floor(gp); + } + }).filter('silver', function () { + return function (gp) { + return Math.floor((gp - Math.floor(gp))*100); + } + }); diff --git a/public/js/services/authServices.js b/public/js/services/authServices.js new file mode 100644 index 0000000000..4efa0efd46 --- /dev/null +++ b/public/js/services/authServices.js @@ -0,0 +1,104 @@ +'use strict'; + +/** + * Services that persists and retrieves user from localStorage. + * FIXME is this file ever used? + */ + +var facebook = {} + +angular.module('authServices', ['userServices']). +factory('Facebook', + ['$http', '$location', 'User', 'API_URL', + function($http, $location, User, API_URL) { + //TODO FB.init({appId: '${section.parameters['facebook.app.id']}', status: true, cookie: true, xfbml: true}); + var auth, user = User.user; + + facebook.handleStatusChange = function(session) { + if (session.authResponse) { + + FB.api('/me', { + fields: 'name, picture, email' + }, function(response) { + console.log(response.error) + if (!response.error) { + + var data = { + name: response.name, + facebook_id: response.id, + email: response.email + } + + $http.post(API_URL + '/api/v1/user/auth/facebook', data).success(function(data, status, headers, config) { + User.authenticate(data.id, data.token, function(err) { + if (!err) { + alert('Login successful!'); + $location.path("/habit"); + } + }); + }).error(function(response) { + console.log('error') + }) + + } else { + alert('napaka') + } + //clearAction(); + }); + } else { + document.body.className = 'not_connected'; + //clearAction(); + } + } + + return { + + authUser: function() { + FB.Event.subscribe('auth.statusChange', facebook.handleStatusChange); + }, + + getAuth: function() { + return auth; + }, + + login: function() { + + FB.login(null, { + scope: 'email' + }); + }, + + logout: function() { + FB.logout(function(response) { + window.location.reload(); + }); + } + } + + } +]) + +.factory('LocalAuth', + ['$http', 'User', + function($http, User) { + var auth, + user = User.user; + + return { + getAuth: function() { + return auth; + }, + + login: function() { + user.id = ''; + user.apiToken = ''; + User.authenticate(); + return; + + }, + + logout: function() {} + } + + } +]); diff --git a/public/js/services/challengeServices.js b/public/js/services/challengeServices.js new file mode 100644 index 0000000000..f21cbc9d82 --- /dev/null +++ b/public/js/services/challengeServices.js @@ -0,0 +1,27 @@ +'use strict'; + +/** + * Services that persists and retrieves user from localStorage. + */ + +angular.module('challengeServices', ['ngResource']). + factory('Challenges', ['API_URL', '$resource', 'User', '$q', 'Members', + function(API_URL, $resource, User, $q, Members) { + var Challenge = $resource(API_URL + '/api/v1/challenges/:cid', + {cid:'@_id'}, + { + //'query': {method: "GET", isArray:false} + join: {method: "POST", url: API_URL + '/api/v1/challenges/:cid/join'}, + leave: {method: "POST", url: API_URL + '/api/v1/challenges/:cid/leave'}, + close: {method: "POST", params: {uid:''}, url: API_URL + '/api/v1/challenges/:cid/close'}, + getMember: {method: "GET", url: API_URL + '/api/v1/challenges/:cid/member/:uid'} + }); + + //var challenges = []; + + return { + Challenge: Challenge + //challenges: challenges + } + } +]); diff --git a/public/js/services/groupServices.js b/public/js/services/groupServices.js new file mode 100644 index 0000000000..bce061f374 --- /dev/null +++ b/public/js/services/groupServices.js @@ -0,0 +1,47 @@ +'use strict'; + +/** + * Services that persists and retrieves user from localStorage. + */ + +angular.module('groupServices', ['ngResource']). + factory('Groups', ['API_URL', '$resource', '$q', + function(API_URL, $resource, $q) { + var Group = $resource(API_URL + '/api/v1/groups/:gid', + {gid:'@_id', messageId: '@_messageId'}, + { + //query: {method: "GET", isArray:false}, + postChat: {method: "POST", url: API_URL + '/api/v1/groups/:gid/chat'}, + deleteChatMessage: {method: "DELETE", url: API_URL + '/api/v1/groups/:gid/chat/:messageId'}, + join: {method: "POST", url: API_URL + '/api/v1/groups/:gid/join'}, + leave: {method: "POST", url: API_URL + '/api/v1/groups/:gid/leave'}, + invite: {method: "POST", url: API_URL + '/api/v1/groups/:gid/invite'}, + removeMember: {method: "POST", url: API_URL + '/api/v1/groups/:gid/removeMember'} + }); + + // Defer loading everything until they're requested + var party, myGuilds, publicGuilds, tavern; + + return { + party: function(cb){ + if (!party) return (party = Group.get({gid: 'party'}, cb)); + return (cb) ? cb(party) : party; + }, + publicGuilds: function(){ + //TODO combine these as {type:'guilds,public'} and create a $filter() to separate them + if (!publicGuilds) publicGuilds = Group.query({type:'public'}); + return publicGuilds; + }, + myGuilds: function(){ + if (!myGuilds) myGuilds = Group.query({type:'guilds'}); + return myGuilds; + }, + tavern: function(){ + if (!tavern) tavern = Group.get({gid:'habitrpg'}); + return tavern; + }, + + Group: Group + } + } +]); diff --git a/public/js/services/guideServices.js b/public/js/services/guideServices.js new file mode 100644 index 0000000000..3e709ce4c5 --- /dev/null +++ b/public/js/services/guideServices.js @@ -0,0 +1,134 @@ +'use strict'; + +/** + * Services for each tour step when you unlock features + */ + +angular.module('guideServices', []). + factory('Guide', ['$rootScope', 'User', 'Items', 'Helpers', function($rootScope, User, Items, Helpers) { + + /** + * Init and show the welcome tour. Note we do it listening to a $rootScope broadcasted 'userLoaded' message, + * this because we need to determine whether to show the tour *after* the user has been pulled from the server, + * otherwise it's always start off as true, and then get set to false later + */ + $rootScope.$on('userUpdated', initTour); + function initTour(){ + if (User.user.flags.showTour === false) return; + var tourSteps = [ + { + element: ".main-herobox", + title: "Welcome to HabitRPG", + content: "Welcome to HabitRPG, a habit-tracker which treats your goals like a Role Playing Game. I'm Justin, your guide! " + }, { + element: "#bars", + title: "Achieve goals and level up", + content: "As you accomplish goals, you level up. If you fail your goals, you lose hit points. Lose all your HP and you die." + }, { + element: "ul.habits", + title: "Habits", + content: "Habits are goals that you constantly track.", + placement: "bottom" + }, { + element: "ul.dailys", + title: "Dailies", + content: "Dailies are goals that you want to complete once a day.", + placement: "bottom" + }, { + element: "ul.todos", + title: "Todos", + content: "Todos are one-off goals which need to be completed eventually.", + placement: "bottom" + }, { + element: "ul.rewards", + title: "Rewards", + content: "As you complete goals, you earn gold to buy rewards. Buy them liberally - rewards are integral in forming good habits.", + placement: "bottom" + }, { + element: "ul.habits li:first-child", + title: "Hover over comments", + content: "Different task-types have special properties. Hover over each task's comment for more information. When you're ready to get started, delete the existing tasks and add your own.", + placement: "right" + } + ]; + _.each(tourSteps, function(step){ + step.content = "
" + step.content + "
"; // add Justin NPC img + }); + $('.main-herobox').popover('destroy'); + var tour = new Tour({ + onEnd: function(){ + User.set('flags.showTour', false); + } + }); + tourSteps.forEach(function(step) { + tour.addStep(_.defaults(step, {html: true})); + }); + tour.restart(); // Tour doesn't quite mesh with our handling of flags.showTour, just restart it on page load + //tour.start(true); + }; + + var alreadyShown = function(before, after) { + return !(!before && after === true); + }; + + var showPopover = function(selector, title, html, placement) { + if (!placement) placement = 'bottom'; + $(selector).popover('destroy'); + var button = ""; + html = "
" + html + '
' + button + '
'; + $(selector).popover({ + title: title, + placement: placement, + trigger: 'manual', + html: true, + content: html + }).popover('show'); + }; + + $rootScope.$watch('user.flags.customizationsNotification', function(after, before) { + if (alreadyShown(before, after)) return; + showPopover('.main-herobox', 'Customize Your Avatar', "Click your avatar to customize your appearance.", 'bottom'); + }); + + $rootScope.$watch('user.flags.itemsEnabled', function(after, before) { + if (alreadyShown(before, after)) return; + var html = "Congratulations, you have unlocked the Item Store! You can now buy weapons, armor, potions, etc. Read each item's comment for more information."; + showPopover('div.rewards', 'Item Store Unlocked', html, 'left'); + }); + + $rootScope.$watch('user.flags.petsEnabled', function(after, before) { + //TODO is this ever used? I think dropsEnabled is the one that's used + if (alreadyShown(before, after)) return; + var html = "You have unlocked Pets! You can now buy pets with Gems (note, you replenish Gems with real-life money - so chose your pets wisely!)"; + showPopover('#rewardsTabs', 'Pets Unlocked', html, 'left'); + }); + + $rootScope.$watch('user.flags.partyEnabled', function(after, before) { + if (alreadyShown(before, after)) return; + var html = "Be social, join a party and play Habit with your friends! You'll be better at your habits with accountability partners. Click User -> Options -> Party, and follow the instructions. LFG anyone?"; + showPopover('.user-menu', 'Party System', html, 'bottom'); + }); + + $rootScope.$watch('user.flags.dropsEnabled', function(after, before) { + if (alreadyShown(before, after)) return; + var drop = Helpers.randomVal(Items.items.pets); + var eggs = User.user.items.eggs || []; + eggs.push(drop); // FIXME put this on server instead + User.set('items.eggs', eggs); + $rootScope.modals.dropsEnabled = true; + }); + + $rootScope.$watch('user.items.pets', function(after, before) { + if (User.user.achievements && User.user.achievements.beastMaster) return; + if (before >= 90) { + User.set('achievements.beastMaster', true); + $('#beastmaster-achievement-modal').modal('show'); // FIXME + } + }); + + return { + initTour:initTour + }; + + } +]); diff --git a/public/js/services/memberServices.js b/public/js/services/memberServices.js new file mode 100644 index 0000000000..3b375eca65 --- /dev/null +++ b/public/js/services/memberServices.js @@ -0,0 +1,84 @@ +'use strict'; + +/** + * Services that persists and retrieves user from localStorage. + */ + +angular.module('memberServices', ['ngResource']). + factory('Members', ['$rootScope', 'API_URL', '$resource', + function($rootScope, API_URL, $resource) { + var members = {}; + var Member = $resource(API_URL + '/api/v1/members/:uid', {uid:'@_id'}); + var memberServices = { + + Member: Member, + + members: members, + + /** + * Allows us to lazy-load party / group / public members throughout the application. + * @param obj - either a group or an individual member. If it's a group, we lazy-load all of its members. + */ + populate: function(obj){ + + function populateGroup(group){ + _.each(group.members, function(member){ + // meaning `populate('members')` wasn't run on the server, so we're getting the "in-database" form of + // the members array, which is just a list of IDs - not the populated objects + if (_.isString(member)) return; + + // lazy-load + members[member._id] = member; + }) + } + + // Array of groups + if (_.isArray(obj)) { + if (obj[0] && obj[0].members) { + _.each(obj, function(group){ + populateGroup(group); + }) + } + + // Individual Group + } else if (obj.members) + populateGroup(obj); + + // individual Member + if (obj._id) { + members[obj._id] = obj; + } + }, + + selectedMember: undefined, + + /** + * Once users are populated, we fetch them throughout the application (eg, modals). This + * either gets them or fetches if not available + * @param uid + */ + selectMember: function(uid) { + var self = this; + // Fetch from cache if we can. For guild members, only their uname will have been fetched on initial load, + // check if they have full fields (eg, check profile.items and an item inside + // because sometimes profile.items exists but it's empty like when user is fetched for party + // and then for guild) + // and if not, fetch them + if (members[uid] && members[uid].items && members[uid].items.weapon) { + self.selectedMember = members[uid]; + } else { + Member.get({uid: uid}, function(member){ + self.populate(member); // lazy load for later + self.selectedMember = members[member._id]; + }); + } + } + } + + $rootScope.$on('userUpdated', function(event, user){ + memberServices.populate(user); + }) + + return memberServices; + } +]); diff --git a/public/js/services/notificationServices.js b/public/js/services/notificationServices.js new file mode 100644 index 0000000000..5ac1b06d64 --- /dev/null +++ b/public/js/services/notificationServices.js @@ -0,0 +1,74 @@ +/** + Set up "+1 Exp", "Level Up", etc notifications + */ +angular.module("notificationServices", []) + .factory("Notification", ['User', function(User) { + function growl(html, type) { + $.bootstrapGrowl(html, { + ele: '#notification-area', + type: type, //(null, 'info', 'error', 'success', 'gp', 'xp', 'hp', 'lvl','death') + top_offset: 20, + align: 'right', //('left', 'right', or 'center') + width: 250, //(integer, or 'auto') + delay: 3000, + allow_dismiss: true, + stackup_spacing: 10 // spacing between consecutive stacecked growls. + }); + }; + + /** + Show "+ 5 {gold_coin} 3 {silver_coin}" + */ + function coins(money) { + var absolute, gold, silver; + absolute = Math.abs(money); + gold = Math.floor(absolute); + silver = Math.floor((absolute - gold) * 100); + if (gold && silver > 0) { + return "" + gold + " " + silver + " "; + } else if (gold > 0) { + return "" + gold + " "; + } else if (silver > 0) { + return "" + silver + " "; + } + }; + + var sign = function(number){ + return number?number<0?'-':'+':'+'; + } + + var round = function(number){ + return Math.abs(number.toFixed(1)); + } + + return { + coins: coins, + hp: function(val) { + // don't show notifications if user dead + if (User.user.stats.lvl == 0) return; + growl(" " + sign(val) + " " + round(val) + " HP", 'hp'); + }, + exp: function(val) { + if (User.user.stats.lvl == 0) return; + if (val < -50) return; // don't show when they level up (resetting their exp) + growl(" " + sign(val) + " " + round(val) + " XP", 'xp'); + }, + gp: function(val) { + if (User.user.stats.lvl == 0) return; + growl(sign(val) + " " + coins(val), 'gp'); + }, + text: function(val){ + growl(val); + }, + lvl: function(){ + growl(' Level Up!', 'lvl'); + }, + death: function(){ + growl(" Respawn!", "death"); + }, + error: function(error){ + growl(" " + error, "error"); + } + }; + } +]); diff --git a/public/js/services/sharedServices.js b/public/js/services/sharedServices.js new file mode 100644 index 0000000000..50c3fdb72d --- /dev/null +++ b/public/js/services/sharedServices.js @@ -0,0 +1,16 @@ +'use strict'; + +/** + * Services that persists and retrieves user from localStorage. + */ + +angular.module('sharedServices', [] ). + factory("Items", ['$rootScope', function($rootScope){ + return window.habitrpgShared.items; + }]). + factory("Algos", ['$rootScope', function($rootScope){ + return window.habitrpgShared.algos; + }]). + factory("Helpers", ['$rootScope', function($rootScope){ + return window.habitrpgShared.helpers; + }]); \ No newline at end of file diff --git a/public/js/services/userServices.js b/public/js/services/userServices.js new file mode 100644 index 0000000000..12b0112b42 --- /dev/null +++ b/public/js/services/userServices.js @@ -0,0 +1,248 @@ +'use strict'; + +/** + * Services that persists and retrieves user from localStorage. + */ + +angular.module('userServices', []). + factory('User', ['$rootScope', '$http', '$location', '$window', 'API_URL', 'STORAGE_USER_ID', 'STORAGE_SETTINGS_ID', + function($rootScope, $http, $location, $window, API_URL, STORAGE_USER_ID, STORAGE_SETTINGS_ID) { + var authenticated = false, + defaultSettings = { + auth: { apiId: '', apiToken: ''}, + sync: { + queue: [], //here OT will be queued up, this is NOT call-back queue! + sent: [] //here will be OT which have been sent, but we have not got reply from server yet. + }, + fetching: false, // whether fetch() was called or no. this is to avoid race conditions + online: false + }, + settings = {}, //habit mobile settings (like auth etc.) to be stored here + user = {}; // this is stored as a reference accessible to all controllers, that way updates propagate + + //first we populate user with schema + _.extend(user, $window.habitrpgShared.helpers.newUser()); + user.apiToken = user._id = ''; // we use id / apitoken to determine if registered + + //than we try to load localStorage + if (localStorage.getItem(STORAGE_USER_ID)) { + _.extend(user, JSON.parse(localStorage.getItem(STORAGE_USER_ID))); + } + + var syncQueue = function (cb) { + if (!authenticated) { + $window.alert("Not authenticated, can't sync, go to settings first."); + return; + } + + var queue = settings.sync.queue; + var sent = settings.sync.sent; + if (queue.length === 0) { + // Sync: Queue is empty + return; + } + if (settings.fetching) { + // Sync: Already fetching + return; + } + if (settings.online!==true) { + // Sync: Not online + return; + } + + settings.fetching = true; + // move all actions from queue array to sent array + _.times(queue.length, function () { + sent.push(queue.shift()); + }); + + $http.post(API_URL + '/api/v1/user/batch-update', sent, {params: {data:+new Date, _v:user._v}}) + .success(function (data, status, heacreatingders, config) { + //make sure there are no pending actions to sync. If there are any it is not safe to apply model from server as we may overwrite user data. + if (!queue.length) { + //we can't do user=data as it will not update user references in all other angular controllers. + + // the user has been modified from another application, sync up + if(data.wasModified) { + delete data.wasModified; + _.extend(user, data); + $rootScope.$emit('userUpdated', user); + } + user._v = data._v; + + // FIXME handle this somewhere else, we don't need to check every single time + var offset = moment().zone(); // eg, 240 - this will be converted on server as -(offset/60) + if (!user.preferences.timezoneOffset || user.preferences.timezoneOffset !== offset) { + userServices.set('preferences.timezoneOffset', offset); + } + } + sent.length = 0; + settings.fetching = false; + save(); + if (cb) { + cb(false) + } + + syncQueue(); // call syncQueue to check if anyone pushed more actions to the queue while we were talking to server. + }) + .error(function (data, status, headers, config) { + //move sent actions back to queue + _.times(sent.length, function () { + queue.push(sent.shift()) + }); + settings.fetching = false; + //Notification.push({type:'text', text:"We're offline"}) + }); + } + + + var save = function () { + localStorage.setItem(STORAGE_USER_ID, JSON.stringify(user)); + localStorage.setItem(STORAGE_SETTINGS_ID, JSON.stringify(settings)); + }; + var userServices = { + user: user, + online: function (status) { + if (status===true) { + settings.online = true; + syncQueue(); + } else { + settings.online = false; + }; + }, + + authenticate: function (uuid, token, cb) { + if (!!uuid && !!token) { + $http.defaults.headers.common['x-api-user'] = uuid; + $http.defaults.headers.common['x-api-key'] = token; + authenticated = true; + settings.auth.apiId = uuid; + settings.auth.apiToken = token; + settings.online = true; + if (user && user._v) user._v--; // shortcut to always fetch new updates on page reload + userServices.log({}, cb); + } else { + alert('Please enter your ID and Token in settings.') + } + }, + + authenticated: function(){ + return this.settings.auth.apiId !== ""; + }, + + log: function (action, cb) { + //push by one buy one if an array passed in. + if (_.isArray(action)) { + action.forEach(function (a) { + settings.sync.queue.push(a); + }); + } else { + settings.sync.queue.push(action); + } + + save(); + syncQueue(cb); + }, + + sync: function(){ + user._v--; + userServices.log({}); + }, + + /* + Very simple path-set. `set('preferences.gender','m')` for example. We'll deprecate this once we have a complete API + */ + set: function(k, v) { + var log = { op: 'set', data: {} }; + $window.habitrpgShared.helpers.dotSet(k, v, this.user); + log.data[k] = v; + userServices.log(log); + }, + + setMultiple: function(obj){ + var log = { op: 'set', data: {} }; + _.each(obj, function(v,k){ + $window.habitrpgShared.helpers.dotSet(k, v, userServices.user); + log.data[k] = v; + }); + userServices.log(log); + }, + + revive: function(){ + $window.habitrpgShared.algos.revive(user); + userServices.log({ op: "revive" }); + }, + + /** + * For gem-unlockable preferences, (a) if owned, select preference (b) else, purchase + * @param path: User.preferences <-> User.purchased maps like User.preferences.skin=abc <-> User.purchased.skin.abc. + * Pass in this paramater as "skin.abc". Alternatively, pass as an array ["skin.abc", "skin.xyz"] to unlock sets + */ + unlock: function(path){ + var self = userServices; //this; // why isn't this working? + + if (_.isArray(path)) { + if (confirm("Purchase for 5 Gems?") !== true) return; + if (user.balance < 1.25) return $rootScope.modals.buyGems = true; + path = path.join(','); + } else { + if ($window.habitrpgShared.helpers.dotGet('purchased.' + path, user)) { + var pref = path.split('.')[0], + val = path.split('.')[1]; + return self.set('preferences.' + pref, val); + } else { + if (confirm("Purchase for 2 Gems?") !== true) return; + if (user.balance < 0.5) return $rootScope.modals.buyGems = true; + } + } + + $http.post(API_URL + '/api/v1/user/unlock?path=' + path) + .success(function(data, status, headers, config){ + self.log({}); // sync new unlocked & preferences + }).error(function(data, status, headers, config){ + alert(status + ': ' + data); + //FIXME use method used elsewhere for handling this error, this is temp while developing + }) + }, + + save: save, + + settings: settings + }; + + + //load settings if we have them + if (localStorage.getItem(STORAGE_SETTINGS_ID)) { + //use extend here to make sure we keep object reference in other angular controllers + _.extend(settings, JSON.parse(localStorage.getItem(STORAGE_SETTINGS_ID))); + + //if settings were saved while fetch was in process reset the flag. + settings.fetching = false; + //create and load if not + } else { + localStorage.setItem(STORAGE_SETTINGS_ID, JSON.stringify(defaultSettings)); + _.extend(settings, defaultSettings); + } + + //If user does not have ApiID that forward him to settings. + if (!settings.auth.apiId || !settings.auth.apiToken) { + //var search = $location.search(); // FIXME this should be working, but it's returning an empty object when at a root url /?_id=... + var search = $location.search($window.location.search.substring(1)).$$search; // so we use this fugly hack instead + if (search.err) return alert(search.err); + if (search._id && search.apiToken) { + userServices.authenticate(search._id, search.apiToken, function(){ + $window.location.href='/'; + }); + } else { + if ($window.location.pathname.indexOf('/static') !== 0){ + localStorage.clear(); + $window.location.href = '/logout'; + } + } + } else { + userServices.authenticate(settings.auth.apiId, settings.auth.apiToken) + } + + return userServices; + } +]); diff --git a/public/js/static.js b/public/js/static.js new file mode 100644 index 0000000000..4eaee31a96 --- /dev/null +++ b/public/js/static.js @@ -0,0 +1,6 @@ +"use strict"; + +window.habitrpg = angular.module('habitrpg', ['userServices', 'chieffancypants.loadingBar']) + .constant("API_URL", "") + .constant("STORAGE_USER_ID", 'habitrpg-user') + .constant("STORAGE_SETTINGS_ID", 'habit-mobile-settings') \ No newline at end of file diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000000..ee6d559b95 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,85 @@ +{ + "app": { + "js": [ + "bower_components/jquery/jquery.js", + "bower_components/jquery.cookie/jquery.cookie.js", + "bower_components/bootstrap-growl/jquery.bootstrap-growl.js", + "bower_components/bootstrap-tour/build/js/bootstrap-tour.js", + "bower_components/angular/angular.js", + "bower_components/angular-sanitize/angular-sanitize.js", + "bower_components/marked/lib/marked.js", + "bower_components/angular-ui-router/release/angular-ui-router.js", + "bower_components/angular-resource/angular-resource.min.js", + "bower_components/angular-ui/build/angular-ui.js", + "bower_components/angular-ui-utils/modules/keypress/keypress.js", + "bower_components/angular-loading-bar/build/loading-bar.js", + + "bower_components/bootstrap/docs/assets/js/bootstrap.js", + "bower_components/angular-bootstrap/ui-bootstrap.js", + "bower_components/angular-bootstrap/ui-bootstrap-tpls.js", + + "bower_components/jquery-ui/ui/minified/jquery.ui.core.min.js", + "bower_components/jquery-ui/ui/minified/jquery.ui.widget.min.js", + "bower_components/jquery-ui/ui/minified/jquery.ui.mouse.min.js", + "bower_components/jquery-ui/ui/minified/jquery.ui.sortable.min.js", + + "bower_components/habitrpg-shared/dist/habitrpg-shared.js", + + "js/app.js", + "js/services/authServices.js", + "js/services/notificationServices.js", + "js/services/sharedServices.js", + "js/services/userServices.js", + "js/services/groupServices.js", + "js/services/memberServices.js", + "js/services/guideServices.js", + "js/services/challengeServices.js", + + "js/filters/filters.js", + + "js/directives/directives.js", + + "js/controllers/authCtrl.js", + "js/controllers/notificationCtrl.js", + "js/controllers/rootCtrl.js", + "js/controllers/settingsCtrl.js", + "js/controllers/headerCtrl.js", + "js/controllers/tasksCtrl.js", + "js/controllers/filtersCtrl.js", + "js/controllers/userCtrl.js", + "js/controllers/groupsCtrl.js", + "js/controllers/petsCtrl.js", + "js/controllers/inventoryCtrl.js", + "js/controllers/marketCtrl.js", + "js/controllers/footerCtrl.js", + "js/controllers/challengesCtrl.js", + "js/controllers/adminCtrl.js" + ], + "css": [ + "bower_components/bootstrap/docs/assets/css/bootstrap.css", + "app.css", + "bower_components/habitrpg-shared/dist/spritesheets.css" + ] + }, + "static": { + "js": [ + "bower_components/jquery/jquery.js", + "bower_components/habitrpg-shared/dist/habitrpg-shared.js", + "bower_components/angular/angular.js", + + "bower_components/bootstrap/docs/assets/js/bootstrap.js", + + "bower_components/angular-loading-bar/build/loading-bar.js", + "js/static.js", + "js/services/userServices.js", + "js/controllers/authCtrl.js" + ], + "css": [ + "bower_components/bootstrap/docs/assets/css/bootstrap.css", + "bower_components/bootstrap/docs/assets/css/bootstrap-responsive.css", + "bower_components/bootstrap/docs/assets/css/docs.css", + + "static.css" + ] + } +} \ No newline at end of file diff --git a/public/page-loader.gif b/public/page-loader.gif new file mode 100644 index 0000000000..8be8ba338d Binary files /dev/null and b/public/page-loader.gif differ diff --git a/public/refresh.png b/public/refresh.png new file mode 100644 index 0000000000..ffcdf968a6 Binary files /dev/null and b/public/refresh.png differ diff --git a/public/vendor/BrowserQuest b/public/vendor/BrowserQuest deleted file mode 160000 index af32d247ca..0000000000 --- a/public/vendor/BrowserQuest +++ /dev/null @@ -1 +0,0 @@ -Subproject commit af32d247cac3495ca430d0effbb88dd5f3250b2c diff --git a/public/vendor/bootstrap-tour b/public/vendor/bootstrap-tour deleted file mode 160000 index 4f94fa056c..0000000000 --- a/public/vendor/bootstrap-tour +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4f94fa056c88c6099dea135b644d8f95d38ac9e1 diff --git a/public/vendor/bootstrap/css/bootstrap-responsive.css b/public/vendor/bootstrap/css/bootstrap-responsive.css deleted file mode 100644 index fcd72f7a77..0000000000 --- a/public/vendor/bootstrap/css/bootstrap-responsive.css +++ /dev/null @@ -1,1109 +0,0 @@ -/*! - * Bootstrap Responsive v2.3.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -@-ms-viewport { - width: device-width; -} - -.hidden { - display: none; - visibility: hidden; -} - -.visible-phone { - display: none !important; -} - -.visible-tablet { - display: none !important; -} - -.hidden-desktop { - display: none !important; -} - -.visible-desktop { - display: inherit !important; -} - -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} - -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} - -.visible-print { - display: none !important; -} - -@media print { - .visible-print { - display: inherit !important; - } - .hidden-print { - display: none !important; - } -} - -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 30px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 1170px; - } - .span12 { - width: 1170px; - } - .span11 { - width: 1070px; - } - .span10 { - width: 970px; - } - .span9 { - width: 870px; - } - .span8 { - width: 770px; - } - .span7 { - width: 670px; - } - .span6 { - width: 570px; - } - .span5 { - width: 470px; - } - .span4 { - width: 370px; - } - .span3 { - width: 270px; - } - .span2 { - width: 170px; - } - .span1 { - width: 70px; - } - .offset12 { - margin-left: 1230px; - } - .offset11 { - margin-left: 1130px; - } - .offset10 { - margin-left: 1030px; - } - .offset9 { - margin-left: 930px; - } - .offset8 { - margin-left: 830px; - } - .offset7 { - margin-left: 730px; - } - .offset6 { - margin-left: 630px; - } - .offset5 { - margin-left: 530px; - } - .offset4 { - margin-left: 430px; - } - .offset3 { - margin-left: 330px; - } - .offset2 { - margin-left: 230px; - } - .offset1 { - margin-left: 130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.564102564102564%; - *margin-left: 2.5109110747408616%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.564102564102564%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.45299145299145%; - *width: 91.39979996362975%; - } - .row-fluid .span10 { - width: 82.90598290598291%; - *width: 82.8527914166212%; - } - .row-fluid .span9 { - width: 74.35897435897436%; - *width: 74.30578286961266%; - } - .row-fluid .span8 { - width: 65.81196581196582%; - *width: 65.75877432260411%; - } - .row-fluid .span7 { - width: 57.26495726495726%; - *width: 57.21176577559556%; - } - .row-fluid .span6 { - width: 48.717948717948715%; - *width: 48.664757228587014%; - } - .row-fluid .span5 { - width: 40.17094017094017%; - *width: 40.11774868157847%; - } - .row-fluid .span4 { - width: 31.623931623931625%; - *width: 31.570740134569924%; - } - .row-fluid .span3 { - width: 23.076923076923077%; - *width: 23.023731587561375%; - } - .row-fluid .span2 { - width: 14.52991452991453%; - *width: 14.476723040552828%; - } - .row-fluid .span1 { - width: 5.982905982905983%; - *width: 5.929714493544281%; - } - .row-fluid .offset12 { - margin-left: 105.12820512820512%; - *margin-left: 105.02182214948171%; - } - .row-fluid .offset12:first-child { - margin-left: 102.56410256410257%; - *margin-left: 102.45771958537915%; - } - .row-fluid .offset11 { - margin-left: 96.58119658119658%; - *margin-left: 96.47481360247316%; - } - .row-fluid .offset11:first-child { - margin-left: 94.01709401709402%; - *margin-left: 93.91071103837061%; - } - .row-fluid .offset10 { - margin-left: 88.03418803418803%; - *margin-left: 87.92780505546462%; - } - .row-fluid .offset10:first-child { - margin-left: 85.47008547008548%; - *margin-left: 85.36370249136206%; - } - .row-fluid .offset9 { - margin-left: 79.48717948717949%; - *margin-left: 79.38079650845607%; - } - .row-fluid .offset9:first-child { - margin-left: 76.92307692307693%; - *margin-left: 76.81669394435352%; - } - .row-fluid .offset8 { - margin-left: 70.94017094017094%; - *margin-left: 70.83378796144753%; - } - .row-fluid .offset8:first-child { - margin-left: 68.37606837606839%; - *margin-left: 68.26968539734497%; - } - .row-fluid .offset7 { - margin-left: 62.393162393162385%; - *margin-left: 62.28677941443899%; - } - .row-fluid .offset7:first-child { - margin-left: 59.82905982905982%; - *margin-left: 59.72267685033642%; - } - .row-fluid .offset6 { - margin-left: 53.84615384615384%; - *margin-left: 53.739770867430444%; - } - .row-fluid .offset6:first-child { - margin-left: 51.28205128205128%; - *margin-left: 51.175668303327875%; - } - .row-fluid .offset5 { - margin-left: 45.299145299145295%; - *margin-left: 45.1927623204219%; - } - .row-fluid .offset5:first-child { - margin-left: 42.73504273504273%; - *margin-left: 42.62865975631933%; - } - .row-fluid .offset4 { - margin-left: 36.75213675213675%; - *margin-left: 36.645753773413354%; - } - .row-fluid .offset4:first-child { - margin-left: 34.18803418803419%; - *margin-left: 34.081651209310785%; - } - .row-fluid .offset3 { - margin-left: 28.205128205128204%; - *margin-left: 28.0987452264048%; - } - .row-fluid .offset3:first-child { - margin-left: 25.641025641025642%; - *margin-left: 25.53464266230224%; - } - .row-fluid .offset2 { - margin-left: 19.65811965811966%; - *margin-left: 19.551736679396257%; - } - .row-fluid .offset2:first-child { - margin-left: 17.094017094017094%; - *margin-left: 16.98763411529369%; - } - .row-fluid .offset1 { - margin-left: 11.11111111111111%; - *margin-left: 11.004728132387708%; - } - .row-fluid .offset1:first-child { - margin-left: 8.547008547008547%; - *margin-left: 8.440625568285142%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 30px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 1156px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 1056px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 956px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 856px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 756px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 656px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 556px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 456px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 356px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 256px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 156px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 56px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } - .row-fluid .thumbnails { - margin-left: 0; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.7624309392265194%; - *margin-left: 2.709239449864817%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.7624309392265194%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.43646408839778%; - *width: 91.38327259903608%; - } - .row-fluid .span10 { - width: 82.87292817679558%; - *width: 82.81973668743387%; - } - .row-fluid .span9 { - width: 74.30939226519337%; - *width: 74.25620077583166%; - } - .row-fluid .span8 { - width: 65.74585635359117%; - *width: 65.69266486422946%; - } - .row-fluid .span7 { - width: 57.18232044198895%; - *width: 57.12912895262725%; - } - .row-fluid .span6 { - width: 48.61878453038674%; - *width: 48.56559304102504%; - } - .row-fluid .span5 { - width: 40.05524861878453%; - *width: 40.00205712942283%; - } - .row-fluid .span4 { - width: 31.491712707182323%; - *width: 31.43852121782062%; - } - .row-fluid .span3 { - width: 22.92817679558011%; - *width: 22.87498530621841%; - } - .row-fluid .span2 { - width: 14.3646408839779%; - *width: 14.311449394616199%; - } - .row-fluid .span1 { - width: 5.801104972375691%; - *width: 5.747913483013988%; - } - .row-fluid .offset12 { - margin-left: 105.52486187845304%; - *margin-left: 105.41847889972962%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243093922652%; - *margin-left: 102.6560479605031%; - } - .row-fluid .offset11 { - margin-left: 96.96132596685082%; - *margin-left: 96.8549429881274%; - } - .row-fluid .offset11:first-child { - margin-left: 94.1988950276243%; - *margin-left: 94.09251204890089%; - } - .row-fluid .offset10 { - margin-left: 88.39779005524862%; - *margin-left: 88.2914070765252%; - } - .row-fluid .offset10:first-child { - margin-left: 85.6353591160221%; - *margin-left: 85.52897613729868%; - } - .row-fluid .offset9 { - margin-left: 79.8342541436464%; - *margin-left: 79.72787116492299%; - } - .row-fluid .offset9:first-child { - margin-left: 77.07182320441989%; - *margin-left: 76.96544022569647%; - } - .row-fluid .offset8 { - margin-left: 71.2707182320442%; - *margin-left: 71.16433525332079%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729281768%; - *margin-left: 68.40190431409427%; - } - .row-fluid .offset7 { - margin-left: 62.70718232044199%; - *margin-left: 62.600799341718584%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138121547%; - *margin-left: 59.838368402492065%; - } - .row-fluid .offset6 { - margin-left: 54.14364640883978%; - *margin-left: 54.037263430116376%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121546961326%; - *margin-left: 51.27483249088986%; - } - .row-fluid .offset5 { - margin-left: 45.58011049723757%; - *margin-left: 45.47372751851417%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767955801105%; - *margin-left: 42.71129657928765%; - } - .row-fluid .offset4 { - margin-left: 37.01657458563536%; - *margin-left: 36.91019160691196%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414364640884%; - *margin-left: 34.14776066768544%; - } - .row-fluid .offset3 { - margin-left: 28.45303867403315%; - *margin-left: 28.346655695309746%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773480663%; - *margin-left: 25.584224756083227%; - } - .row-fluid .offset2 { - margin-left: 19.88950276243094%; - *margin-left: 19.783119783707537%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182320442%; - *margin-left: 17.02068884448102%; - } - .row-fluid .offset1 { - margin-left: 11.32596685082873%; - *margin-left: 11.219583872105325%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591160221%; - *margin-left: 8.457152932878806%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} - -@media (max-width: 767px) { - body { - padding-right: 20px; - padding-left: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-right: -20px; - margin-left: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - width: auto; - clear: none; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - display: block; - float: none; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - right: 20px; - left: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 20px; - } -} - -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-right: 10px; - padding-left: 10px; - } - .media .pull-left, - .media .pull-right { - display: block; - float: none; - margin-bottom: 10px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 10px; - right: 10px; - left: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} - -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-right: 10px; - padding-left: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .nav > li > a:focus, - .nav-collapse .dropdown-menu a:hover, - .nav-collapse .dropdown-menu a:focus { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a, - .navbar-inverse .nav-collapse .dropdown-menu a { - color: #999999; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .nav > li > a:focus, - .navbar-inverse .nav-collapse .dropdown-menu a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:focus { - background-color: #111111; - } - .nav-collapse.in .btn-group { - padding: 0; - margin-top: 5px; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - display: none; - float: none; - max-width: none; - padding: 0; - margin: 0 15px; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .open > .dropdown-menu { - display: block; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - height: 0; - overflow: hidden; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-right: 10px; - padding-left: 10px; - } -} - -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} diff --git a/public/vendor/bootstrap/css/bootstrap-responsive.min.css b/public/vendor/bootstrap/css/bootstrap-responsive.min.css deleted file mode 100644 index d1b7f4b0b8..0000000000 --- a/public/vendor/bootstrap/css/bootstrap-responsive.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap Responsive v2.3.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/public/vendor/bootstrap/css/bootstrap.css b/public/vendor/bootstrap/css/bootstrap.css deleted file mode 100644 index 2f56af33f3..0000000000 --- a/public/vendor/bootstrap/css/bootstrap.css +++ /dev/null @@ -1,6158 +0,0 @@ -/*! - * Bootstrap v2.3.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - width: auto\9; - height: auto; - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -#map_canvas img, -.google-maps img { - max-width: none; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} - -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #333333; - background-color: #ffffff; -} - -a { - color: #0088cc; - text-decoration: none; -} - -a:hover, -a:focus { - color: #005580; - text-decoration: underline; -} - -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} - -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} - -.row { - margin-left: -20px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - line-height: 0; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} - -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.span12 { - width: 940px; -} - -.span11 { - width: 860px; -} - -.span10 { - width: 780px; -} - -.span9 { - width: 700px; -} - -.span8 { - width: 620px; -} - -.span7 { - width: 540px; -} - -.span6 { - width: 460px; -} - -.span5 { - width: 380px; -} - -.span4 { - width: 300px; -} - -.span3 { - width: 220px; -} - -.span2 { - width: 140px; -} - -.span1 { - width: 60px; -} - -.offset12 { - margin-left: 980px; -} - -.offset11 { - margin-left: 900px; -} - -.offset10 { - margin-left: 820px; -} - -.offset9 { - margin-left: 740px; -} - -.offset8 { - margin-left: 660px; -} - -.offset7 { - margin-left: 580px; -} - -.offset6 { - margin-left: 500px; -} - -.offset5 { - margin-left: 420px; -} - -.offset4 { - margin-left: 340px; -} - -.offset3 { - margin-left: 260px; -} - -.offset2 { - margin-left: 180px; -} - -.offset1 { - margin-left: 100px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.127659574468085%; - *margin-left: 2.074468085106383%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.127659574468085%; -} - -.row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; -} - -.row-fluid .span11 { - width: 91.48936170212765%; - *width: 91.43617021276594%; -} - -.row-fluid .span10 { - width: 82.97872340425532%; - *width: 82.92553191489361%; -} - -.row-fluid .span9 { - width: 74.46808510638297%; - *width: 74.41489361702126%; -} - -.row-fluid .span8 { - width: 65.95744680851064%; - *width: 65.90425531914893%; -} - -.row-fluid .span7 { - width: 57.44680851063829%; - *width: 57.39361702127659%; -} - -.row-fluid .span6 { - width: 48.93617021276595%; - *width: 48.88297872340425%; -} - -.row-fluid .span5 { - width: 40.42553191489362%; - *width: 40.37234042553192%; -} - -.row-fluid .span4 { - width: 31.914893617021278%; - *width: 31.861702127659576%; -} - -.row-fluid .span3 { - width: 23.404255319148934%; - *width: 23.351063829787233%; -} - -.row-fluid .span2 { - width: 14.893617021276595%; - *width: 14.840425531914894%; -} - -.row-fluid .span1 { - width: 6.382978723404255%; - *width: 6.329787234042553%; -} - -.row-fluid .offset12 { - margin-left: 104.25531914893617%; - *margin-left: 104.14893617021275%; -} - -.row-fluid .offset12:first-child { - margin-left: 102.12765957446808%; - *margin-left: 102.02127659574467%; -} - -.row-fluid .offset11 { - margin-left: 95.74468085106382%; - *margin-left: 95.6382978723404%; -} - -.row-fluid .offset11:first-child { - margin-left: 93.61702127659574%; - *margin-left: 93.51063829787232%; -} - -.row-fluid .offset10 { - margin-left: 87.23404255319149%; - *margin-left: 87.12765957446807%; -} - -.row-fluid .offset10:first-child { - margin-left: 85.1063829787234%; - *margin-left: 84.99999999999999%; -} - -.row-fluid .offset9 { - margin-left: 78.72340425531914%; - *margin-left: 78.61702127659572%; -} - -.row-fluid .offset9:first-child { - margin-left: 76.59574468085106%; - *margin-left: 76.48936170212764%; -} - -.row-fluid .offset8 { - margin-left: 70.2127659574468%; - *margin-left: 70.10638297872339%; -} - -.row-fluid .offset8:first-child { - margin-left: 68.08510638297872%; - *margin-left: 67.9787234042553%; -} - -.row-fluid .offset7 { - margin-left: 61.70212765957446%; - *margin-left: 61.59574468085106%; -} - -.row-fluid .offset7:first-child { - margin-left: 59.574468085106375%; - *margin-left: 59.46808510638297%; -} - -.row-fluid .offset6 { - margin-left: 53.191489361702125%; - *margin-left: 53.085106382978715%; -} - -.row-fluid .offset6:first-child { - margin-left: 51.063829787234035%; - *margin-left: 50.95744680851063%; -} - -.row-fluid .offset5 { - margin-left: 44.68085106382979%; - *margin-left: 44.57446808510638%; -} - -.row-fluid .offset5:first-child { - margin-left: 42.5531914893617%; - *margin-left: 42.4468085106383%; -} - -.row-fluid .offset4 { - margin-left: 36.170212765957444%; - *margin-left: 36.06382978723405%; -} - -.row-fluid .offset4:first-child { - margin-left: 34.04255319148936%; - *margin-left: 33.93617021276596%; -} - -.row-fluid .offset3 { - margin-left: 27.659574468085104%; - *margin-left: 27.5531914893617%; -} - -.row-fluid .offset3:first-child { - margin-left: 25.53191489361702%; - *margin-left: 25.425531914893618%; -} - -.row-fluid .offset2 { - margin-left: 19.148936170212764%; - *margin-left: 19.04255319148936%; -} - -.row-fluid .offset2:first-child { - margin-left: 17.02127659574468%; - *margin-left: 16.914893617021278%; -} - -.row-fluid .offset1 { - margin-left: 10.638297872340425%; - *margin-left: 10.53191489361702%; -} - -.row-fluid .offset1:first-child { - margin-left: 8.51063829787234%; - *margin-left: 8.404255319148938%; -} - -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} - -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} - -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - line-height: 0; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} - -small { - font-size: 85%; -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -cite { - font-style: normal; -} - -.muted { - color: #999999; -} - -a.muted:hover, -a.muted:focus { - color: #808080; -} - -.text-warning { - color: #c09853; -} - -a.text-warning:hover, -a.text-warning:focus { - color: #a47e3c; -} - -.text-error { - color: #b94a48; -} - -a.text-error:hover, -a.text-error:focus { - color: #953b39; -} - -.text-info { - color: #3a87ad; -} - -a.text-info:hover, -a.text-info:focus { - color: #2d6987; -} - -.text-success { - color: #468847; -} - -a.text-success:hover, -a.text-success:focus { - color: #356635; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-center { - text-align: center; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1, -h2, -h3 { - line-height: 40px; -} - -h1 { - font-size: 38.5px; -} - -h2 { - font-size: 31.5px; -} - -h3 { - font-size: 24.5px; -} - -h4 { - font-size: 17.5px; -} - -h5 { - font-size: 14px; -} - -h6 { - font-size: 11.9px; -} - -h1 small { - font-size: 24.5px; -} - -h2 small { - font-size: 17.5px; -} - -h3 small { - font-size: 14px; -} - -h4 small { - font-size: 14px; -} - -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -li { - line-height: 20px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} - -ul.inline > li, -ol.inline > li { - display: inline-block; - *display: inline; - padding-right: 5px; - padding-left: 5px; - *zoom: 1; -} - -dl { - margin-bottom: 20px; -} - -dt, -dd { - line-height: 20px; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 10px; -} - -.dl-horizontal { - *zoom: 1; -} - -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - line-height: 0; - content: ""; -} - -.dl-horizontal:after { - clear: both; -} - -.dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dl-horizontal dd { - margin-left: 180px; -} - -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - margin-bottom: 0; - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} - -blockquote small { - display: block; - line-height: 20px; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -blockquote.pull-right small:before { - content: ''; -} - -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} - -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -code { - padding: 2px 4px; - color: #d14; - white-space: nowrap; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 20px; -} - -pre code { - padding: 0; - color: inherit; - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 20px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -legend small { - font-size: 15px; - color: #999999; -} - -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} - -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -label { - display: block; - margin-bottom: 5px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 10px; - font-size: 14px; - line-height: 20px; - color: #555555; - vertical-align: middle; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -input, -textarea, -.uneditable-input { - width: 206px; -} - -textarea { - height: auto; -} - -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - *margin-top: 0; - line-height: normal; -} - -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} - -select, -input[type="file"] { - height: 30px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 30px; -} - -select { - width: 220px; - background-color: #ffffff; - border: 1px solid #cccccc; -} - -select[multiple], -select[size] { - height: auto; -} - -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.uneditable-input, -.uneditable-textarea { - color: #999999; - cursor: not-allowed; - background-color: #fcfcfc; - border-color: #cccccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999999; -} - -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999999; -} - -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999999; -} - -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} - -.controls-row { - *zoom: 1; -} - -.controls-row:before, -.controls-row:after { - display: table; - line-height: 0; - content: ""; -} - -.controls-row:after { - clear: both; -} - -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} - -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} - -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} - -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} - -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; -} - -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} - -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} - -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} - -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} - -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} - -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} - -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - line-height: 0; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.help-block, -.help-inline { - color: #595959; -} - -.help-block { - display: block; - margin-bottom: 10px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-append, -.input-prepend { - display: inline-block; - margin-bottom: 10px; - font-size: 0; - white-space: nowrap; - vertical-align: middle; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu, -.input-append .popover, -.input-prepend .popover { - font-size: 14px; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} - -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #eeeeee; - border: 1px solid #ccc; -} - -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} - -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -/* Allow for input prepend/append in search forms */ - -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - vertical-align: middle; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 10px; -} - -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - line-height: 0; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 180px; -} - -.form-horizontal .help-block { - margin-bottom: 0; -} - -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} - -.form-horizontal .form-actions { - padding-left: 180px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table th { - font-weight: bold; -} - -.table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table { - background-color: #ffffff; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child, -.table-bordered tbody:first-child tr:first-child > th:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child, -.table-bordered tbody:first-child tr:first-child > th:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tbody:last-child tr:last-child > th:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > th:first-child { - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tbody:last-child tr:last-child > th:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > th:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; -} - -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-striped tbody > tr:nth-child(odd) > td, -.table-striped tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} - -.table-hover tbody tr:hover > td, -.table-hover tbody tr:hover > th { - background-color: #f5f5f5; -} - -table td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} - -.table td.span1, -.table th.span1 { - float: none; - width: 44px; - margin-left: 0; -} - -.table td.span2, -.table th.span2 { - float: none; - width: 124px; - margin-left: 0; -} - -.table td.span3, -.table th.span3 { - float: none; - width: 204px; - margin-left: 0; -} - -.table td.span4, -.table th.span4 { - float: none; - width: 284px; - margin-left: 0; -} - -.table td.span5, -.table th.span5 { - float: none; - width: 364px; - margin-left: 0; -} - -.table td.span6, -.table th.span6 { - float: none; - width: 444px; - margin-left: 0; -} - -.table td.span7, -.table th.span7 { - float: none; - width: 524px; - margin-left: 0; -} - -.table td.span8, -.table th.span8 { - float: none; - width: 604px; - margin-left: 0; -} - -.table td.span9, -.table th.span9 { - float: none; - width: 684px; - margin-left: 0; -} - -.table td.span10, -.table th.span10 { - float: none; - width: 764px; - margin-left: 0; -} - -.table td.span11, -.table th.span11 { - float: none; - width: 844px; - margin-left: 0; -} - -.table td.span12, -.table th.span12 { - float: none; - width: 924px; - margin-left: 0; -} - -.table tbody tr.success > td { - background-color: #dff0d8; -} - -.table tbody tr.error > td { - background-color: #f2dede; -} - -.table tbody tr.warning > td { - background-color: #fcf8e3; -} - -.table tbody tr.info > td { - background-color: #d9edf7; -} - -.table-hover tbody tr.success:hover > td { - background-color: #d0e9c6; -} - -.table-hover tbody tr.error:hover > td { - background-color: #ebcccc; -} - -.table-hover tbody tr.warning:hover > td { - background-color: #faf2cc; -} - -.table-hover tbody tr.info:hover > td { - background-color: #c4e3f3; -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - margin-top: 1px; - *margin-right: .3em; - line-height: 14px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -/* White icons with optional class, or on hover/focus/active states of certain elements */ - -.icon-white, -.nav-pills > .active > a > [class^="icon-"], -.nav-pills > .active > a > [class*=" icon-"], -.nav-list > .active > a > [class^="icon-"], -.nav-list > .active > a > [class*=" icon-"], -.navbar-inverse .nav > .active > a > [class^="icon-"], -.navbar-inverse .nav > .active > a > [class*=" icon-"], -.dropdown-menu > li > a:hover > [class^="icon-"], -.dropdown-menu > li > a:focus > [class^="icon-"], -.dropdown-menu > li > a:hover > [class*=" icon-"], -.dropdown-menu > li > a:focus > [class*=" icon-"], -.dropdown-menu > .active > a > [class^="icon-"], -.dropdown-menu > .active > a > [class*=" icon-"], -.dropdown-submenu:hover > a > [class^="icon-"], -.dropdown-submenu:focus > a > [class^="icon-"], -.dropdown-submenu:hover > a > [class*=" icon-"], -.dropdown-submenu:focus > a > [class*=" icon-"] { - background-image: url("../img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - width: 16px; - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - width: 16px; - background-position: -384px -120px; -} - -.icon-folder-open { - width: 16px; - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-submenu:hover > a, -.dropdown-submenu:focus > a { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - outline: 0; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999999; -} - -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: default; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open { - *z-index: 1000; -} - -.open > .dropdown-menu { - display: block; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} - -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 5px 5px 5px 0; - -moz-border-radius: 5px 5px 5px 0; - border-radius: 5px 5px 5px 0; -} - -.dropdown-submenu > a:after { - display: block; - float: right; - width: 0; - height: 0; - margin-top: 5px; - margin-right: -10px; - border-color: transparent; - border-left-color: #cccccc; - border-style: solid; - border-width: 5px 0 5px 5px; - content: " "; -} - -.dropdown-submenu:hover > a:after { - border-left-color: #ffffff; -} - -.dropdown-submenu.pull-left { - float: none; -} - -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.dropdown .dropdown-menu .nav-header { - padding-right: 20px; - padding-left: 20px; -} - -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover, -.close:focus { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn { - display: inline-block; - *display: inline; - padding: 4px 12px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 14px; - line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - *background-color: #e6e6e6; - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border: 1px solid #cccccc; - *border: 0; - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:hover, -.btn:focus, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333333; - background-color: #e6e6e6; - *background-color: #d9d9d9; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover, -.btn:focus { - color: #333333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 11px 19px; - font-size: 17.5px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} - -.btn-small { - padding: 2px 10px; - font-size: 11.9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} - -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} - -.btn-mini { - padding: 0 6px; - font-size: 10.5px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} - -.btn-primary { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #006dcc; - *background-color: #0044cc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(to bottom, #0088cc, #0044cc); - background-repeat: repeat-x; - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #ffffff; - background-color: #0044cc; - *background-color: #003bb3; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #003399 \9; -} - -.btn-warning { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - *background-color: #f89406; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #ffffff; - background-color: #f89406; - *background-color: #df8505; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} - -.btn-danger { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - *background-color: #bd362f; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #ffffff; - background-color: #bd362f; - *background-color: #a9302a; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} - -.btn-success { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - *background-color: #51a351; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #ffffff; - background-color: #51a351; - *background-color: #499249; -} - -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} - -.btn-info { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - *background-color: #2f96b4; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #ffffff; - background-color: #2f96b4; - *background-color: #2a85a0; -} - -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} - -.btn-inverse { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - *background-color: #222222; - background-image: -moz-linear-gradient(top, #444444, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); - background-image: -webkit-linear-gradient(top, #444444, #222222); - background-image: -o-linear-gradient(top, #444444, #222222); - background-image: linear-gradient(to bottom, #444444, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:focus, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #ffffff; - background-color: #222222; - *background-color: #151515; -} - -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-link { - color: #0088cc; - cursor: pointer; - border-color: transparent; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-link:hover, -.btn-link:focus { - color: #005580; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover, -.btn-link[disabled]:focus { - color: #333333; - text-decoration: none; -} - -.btn-group { - position: relative; - display: inline-block; - *display: inline; - *margin-left: .3em; - font-size: 0; - white-space: nowrap; - vertical-align: middle; - *zoom: 1; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 5px; -} - -.btn-toolbar { - margin-top: 10px; - margin-bottom: 10px; - font-size: 0; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn + .btn { - margin-left: -1px; -} - -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 14px; -} - -.btn-group > .btn-mini { - font-size: 10.5px; -} - -.btn-group > .btn-small { - font-size: 11.9px; -} - -.btn-group > .btn-large { - font-size: 17.5px; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .btn + .dropdown-toggle { - *padding-top: 5px; - padding-right: 8px; - *padding-bottom: 5px; - padding-left: 8px; - -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); - -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); - 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); -} - -.btn-group > .btn-mini + .dropdown-toggle { - *padding-top: 2px; - padding-right: 5px; - *padding-bottom: 2px; - padding-left: 5px; -} - -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large + .dropdown-toggle { - *padding-top: 7px; - padding-right: 12px; - *padding-bottom: 7px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0044cc; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} - -.btn .caret { - margin-top: 8px; - margin-left: 0; -} - -.btn-large .caret { - margin-top: 6px; -} - -.btn-large .caret { - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.btn-mini .caret, -.btn-small .caret { - margin-top: 8px; -} - -.dropup .btn-large .caret { - border-bottom-width: 5px; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group-vertical > .btn + .btn { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} - -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.alert, -.alert h4 { - color: #c09853; -} - -.alert h4 { - margin: 0; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-success h4 { - color: #468847; -} - -.alert-danger, -.alert-error { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-danger h4, -.alert-error h4 { - color: #b94a48; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-info h4 { - color: #3a87ad; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 20px; - margin-left: 0; - list-style: none; -} - -.nav > li > a { - display: block; -} - -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > li > a > img { - max-width: none; -} - -.nav > .pull-right { - float: right; -} - -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.nav li + .nav-header { - margin-top: 9px; -} - -.nav-list { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -15px; - margin-left: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover, -.nav-list > .active > a:focus { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} - -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - line-height: 0; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover, -.nav-tabs > li > a:focus { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover, -.nav-tabs > .active > a:focus { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover, -.nav-pills > .active > a:focus { - color: #ffffff; - background-color: #0088cc; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomright: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.nav-tabs.nav-stacked > li > a:hover, -.nav-tabs.nav-stacked > li > a:focus { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.nav .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #0088cc; - border-bottom-color: #0088cc; -} - -.nav .dropdown-toggle:hover .caret, -.nav .dropdown-toggle:focus .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} - -/* move down carets for tabs */ - -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} - -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} - -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.nav > .dropdown.active > a:hover, -.nav > .dropdown.active > a:focus { - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover, -.nav > li.dropdown.open.active > a:focus { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret, -.nav li.dropdown.open a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover, -.tabs-stacked .open > a:focus { - border-color: #999999; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - line-height: 0; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.tabs-below > .nav-tabs > li > a:hover, -.tabs-below > .nav-tabs > li > a:focus { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover, -.tabs-below > .nav-tabs > .active > a:focus { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.tabs-left > .nav-tabs > li > a:hover, -.tabs-left > .nav-tabs > li > a:focus { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover, -.tabs-left > .nav-tabs .active > a:focus { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.tabs-right > .nav-tabs > li > a:hover, -.tabs-right > .nav-tabs > li > a:focus { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover, -.tabs-right > .nav-tabs .active > a:focus { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.nav > .disabled > a { - color: #999999; -} - -.nav > .disabled > a:hover, -.nav > .disabled > a:focus { - text-decoration: none; - cursor: default; - background-color: transparent; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 20px; - overflow: visible; -} - -.navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - *zoom: 1; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -} - -.navbar-inner:before, -.navbar-inner:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-inner:after { - clear: both; -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; - overflow: visible; -} - -.navbar .brand { - display: block; - float: left; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777777; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .brand:hover, -.navbar .brand:focus { - text-decoration: none; -} - -.navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #777777; -} - -.navbar-link { - color: #777777; -} - -.navbar-link:hover, -.navbar-link:focus { - color: #333333; -} - -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-right: 1px solid #ffffff; - border-left: 1px solid #f2f2f2; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} - -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn, -.navbar .input-prepend .btn-group, -.navbar .input-append .btn-group { - margin-top: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 14px; - margin-bottom: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.navbar-static-top { - position: static; - margin-bottom: 0; -} - -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} - -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} - -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} - -.navbar .nav > li { - float: left; -} - -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} - -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - color: #333333; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-right: 5px; - margin-left: 5px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - *background-color: #e5e5e5; - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:focus, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #ffffff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} - -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .nav > li > .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.navbar .nav > li > .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown > a:hover .caret, -.navbar .nav li.dropdown > a:focus .caret { - border-top-color: #333333; - border-bottom-color: #333333; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - color: #555555; - background-color: #e5e5e5; -} - -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777777; - border-bottom-color: #777777; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - right: 100%; - left: auto; - margin-right: -1px; - margin-left: 0; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - border-color: #252525; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); -} - -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover, -.navbar-inverse .brand:focus, -.navbar-inverse .nav > li > a:focus { - color: #ffffff; -} - -.navbar-inverse .brand { - color: #999999; -} - -.navbar-inverse .navbar-text { - color: #999999; -} - -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover, -.navbar-inverse .navbar-link:focus { - color: #ffffff; -} - -.navbar-inverse .divider-vertical { - border-right-color: #222222; - border-left-color: #111111; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .nav li.dropdown > a:hover .caret, -.navbar-inverse .nav li.dropdown > a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-search .search-query { - color: #ffffff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - outline: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -} - -.navbar-inverse .btn-navbar { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - *background-color: #040404; - background-image: -moz-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:focus, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #ffffff; - background-color: #040404; - *background-color: #000000; -} - -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} - -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; - *display: inline; - text-shadow: 0 1px 0 #ffffff; - *zoom: 1; -} - -.breadcrumb > li > .divider { - padding: 0 5px; - color: #ccc; -} - -.breadcrumb > .active { - color: #999999; -} - -.pagination { - margin: 20px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination ul > li { - display: inline; -} - -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 4px 12px; - line-height: 20px; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; - border-left-width: 0; -} - -.pagination ul > li > a:hover, -.pagination ul > li > a:focus, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} - -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999999; - cursor: default; -} - -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover, -.pagination ul > .disabled > a:focus { - color: #999999; - cursor: default; - background-color: transparent; -} - -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 11px 19px; - font-size: 17.5px; -} - -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-bottom-left-radius: 3px; - border-bottom-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-topleft: 3px; -} - -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - border-bottom-right-radius: 3px; - -moz-border-radius-topright: 3px; - -moz-border-radius-bottomright: 3px; -} - -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 2px 10px; - font-size: 11.9px; -} - -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0 6px; - font-size: 10.5px; -} - -.pager { - margin: 20px 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - line-height: 0; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #f5f5f5; -} - -.pager .next > a, -.pager .next > span { - float: right; -} - -.pager .previous > a, -.pager .previous > span { - float: left; -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - cursor: default; - background-color: #fff; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -moz-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; -} - -.modal.fade.in { - top: 10%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-header h3 { - margin: 0; - line-height: 30px; -} - -.modal-body { - position: relative; - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - line-height: 0; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 11px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} - -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} - -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} - -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} - -.popover-title:empty { - display: none; -} - -.popover-content { - padding: 9px 14px; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow { - border-width: 11px; -} - -.popover .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; -} - -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - line-height: 0; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} - -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; - color: #555555; -} - -.media, -.media-body { - overflow: hidden; - *overflow: visible; - zoom: 1; -} - -.media, -.media .media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; -} - -.media > .pull-left { - margin-right: 10px; -} - -.media > .pull-right { - margin-left: 10px; -} - -.media-list { - margin-left: 0; - list-style: none; -} - -.label, -.badge { - display: inline-block; - padding: 2px 4px; - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; -} - -.label { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.badge { - padding-right: 9px; - padding-left: 9px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} - -.label:empty, -.badge:empty { - display: none; -} - -a.label:hover, -a.label:focus, -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #b94a48; -} - -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} - -.label-warning, -.badge-warning { - background-color: #f89406; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} - -.label-success, -.badge-success { - background-color: #468847; -} - -.label-success[href], -.badge-success[href] { - background-color: #356635; -} - -.label-info, -.badge-info { - background-color: #3a87ad; -} - -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} - -.label-inverse, -.badge-inverse { - background-color: #333333; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} - -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} - -.btn-mini .label, -.btn-mini .badge { - top: 0; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress .bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} - -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} - -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.accordion { - margin-bottom: 20px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - line-height: 1; -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover, -.carousel-control:focus { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-indicators { - position: absolute; - top: 15px; - right: 15px; - z-index: 5; - margin: 0; - list-style: none; -} - -.carousel-indicators li { - display: block; - float: left; - width: 10px; - height: 10px; - margin-left: 5px; - text-indent: -999px; - background-color: #ccc; - background-color: rgba(255, 255, 255, 0.25); - border-radius: 5px; -} - -.carousel-indicators .active { - background-color: #fff; -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 15px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - line-height: 20px; - color: #ffffff; -} - -.carousel-caption h4 { - margin: 0 0 5px; -} - -.carousel-caption p { - margin-bottom: 0; -} - -.hero-unit { - padding: 60px; - margin-bottom: 30px; - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; - color: inherit; -} - -.hero-unit li { - line-height: 30px; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} - -.affix { - position: fixed; -} diff --git a/public/vendor/bootstrap/css/bootstrap.min.css b/public/vendor/bootstrap/css/bootstrap.min.css deleted file mode 100644 index c10c7f417f..0000000000 --- a/public/vendor/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v2.3.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-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);-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);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)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/public/vendor/bootstrap/img/glyphicons-halflings-white.png b/public/vendor/bootstrap/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484a29..0000000000 Binary files a/public/vendor/bootstrap/img/glyphicons-halflings-white.png and /dev/null differ diff --git a/public/vendor/bootstrap/img/glyphicons-halflings.png b/public/vendor/bootstrap/img/glyphicons-halflings.png deleted file mode 100644 index a996999320..0000000000 Binary files a/public/vendor/bootstrap/img/glyphicons-halflings.png and /dev/null differ diff --git a/public/vendor/bootstrap/js/bootstrap.js b/public/vendor/bootstrap/js/bootstrap.js deleted file mode 100644 index c298ee42e3..0000000000 --- a/public/vendor/bootstrap/js/bootstrap.js +++ /dev/null @@ -1,2276 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) - * ======================================================= */ - - $(function () { - - $.support.transition = (function () { - - var transitionEnd = (function () { - - var el = document.createElement('bootstrap') - , transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd otransitionend' - , 'transition' : 'transitionend' - } - , name - - for (name in transEndEventNames){ - if (el.style[name] !== undefined) { - return transEndEventNames[name] - } - } - - }()) - - return transitionEnd && { - end: transitionEnd - } - - })() - - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-alert.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.trigger(e = $.Event('close')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT NO CONFLICT - * ================= */ - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - /* ALERT DATA-API - * ============== */ - - $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) - -}(window.jQuery);/* ============================================================ - * bootstrap-button.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON NO CONFLICT - * ================== */ - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - /* BUTTON DATA-API - * =============== */ - - $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-carousel.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.prototype = { - - cycle: function (e) { - if (!e) this.paused = false - if (this.interval) clearInterval(this.interval); - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - return this - } - - , getActiveIndex: function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - return this.$items.index(this.$active) - } - - , to: function (pos) { - var activeIndex = this.getActiveIndex() - , that = this - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activeIndex == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.item.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - e = $.Event('slide', { - relatedTarget: $next[0] - , direction: direction - }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - , action = typeof option == 'string' ? option : options.slide - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL NO CONFLICT - * ==================== */ - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - /* CAROUSEL DATA-API - * ================= */ - - $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = $.extend({}, $target.data(), $this.data()) - , slideIndex - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('carousel').pause().to(slideIndex).cycle() - } - - e.preventDefault() - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-collapse.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning || this.$element.hasClass('in')) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - $.support.transition && this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning || !this.$element.hasClass('in')) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSE PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSE NO CONFLICT - * ==================== */ - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - /* COLLAPSE DATA-API - * ================= */ - - $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - $(target).collapse(option) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-dropdown.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle=dropdown]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , isActive - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - $parent.toggleClass('open') - } - - $this.focus() - - return false - } - - , keydown: function (e) { - var $this - , $items - , $active - , $parent - , isActive - , index - - if (!/(38|40|27)/.test(e.keyCode)) return - - $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - if (!isActive || (isActive && e.keyCode == 27)) { - if (e.which == 27) $parent.find(toggle).focus() - return $this.click() - } - - $items = $('[role=menu] li:not(.divider):visible a', $parent) - - if (!$items.length) return - - index = $items.index($items.filter(':focus')) - - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 - - $items - .eq(index) - .focus() - } - - } - - function clearMenus() { - $(toggle).each(function () { - getParent($(this)).removeClass('open') - }) - } - - function getParent($this) { - var selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = selector && $(selector) - - if (!$parent || !$parent.length) $parent = $this.parent() - - return $parent - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.dropdown - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* DROPDOWN NO CONFLICT - * ==================== */ - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(document) - .on('click.dropdown.data-api', clearMenus) - .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.dropdown-menu', function (e) { e.stopPropagation() }) - .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle) - .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) - -}(window.jQuery); -/* ========================================================= - * bootstrap-modal.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#modals - * ========================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================= */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function (element, options) { - this.options = options - this.$element = $(element) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - this.options.remote && this.$element.find('.modal-body').load(this.options.remote) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - , e = $.Event('show') - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.escape() - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body) //don't move modals dom position - } - - that.$element.show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element - .addClass('in') - .attr('aria-hidden', false) - - that.enforceFocus() - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : - that.$element.focus().trigger('shown') - - }) - } - - , hide: function (e) { - e && e.preventDefault() - - var that = this - - e = $.Event('hide') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.escape() - - $(document).off('focusin.modal') - - this.$element - .removeClass('in') - .attr('aria-hidden', true) - - $.support.transition && this.$element.hasClass('fade') ? - this.hideWithTransition() : - this.hideModal() - } - - , enforceFocus: function () { - var that = this - $(document).on('focusin.modal', function (e) { - if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { - that.$element.focus() - } - }) - } - - , escape: function () { - var that = this - if (this.isShown && this.options.keyboard) { - this.$element.on('keyup.dismiss.modal', function ( e ) { - e.which == 27 && that.hide() - }) - } else if (!this.isShown) { - this.$element.off('keyup.dismiss.modal') - } - } - - , hideWithTransition: function () { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - that.hideModal() - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - that.hideModal() - }) - } - - , hideModal: function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.removeBackdrop() - that.$element.trigger('hidden') - }) - } - - , removeBackdrop: function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - , backdrop: function (callback) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('