From bbd5a499fbbe98c881978abdd05006d8af6157c5 Mon Sep 17 00:00:00 2001 From: Chris Scavello Date: Thu, 17 Sep 2015 18:50:56 -0400 Subject: [PATCH 1/5] Initial commit --- .gitignore | 17 ++ Gemfile | 47 ++++++ Gemfile.lock | 156 ++++++++++++++++++ README.md | 8 +- Rakefile | 6 + app/assets/images/.keep | 0 app/assets/javascripts/application.js | 16 ++ app/assets/stylesheets/application.css | 15 ++ app/controllers/application_controller.rb | 5 + app/controllers/concerns/.keep | 0 app/helpers/application_helper.rb | 2 + app/mailers/.keep | 0 app/models/.keep | 0 app/models/concerns/.keep | 0 app/views/layouts/application.html.erb | 14 ++ bin/bundle | 3 + bin/rails | 8 + bin/rake | 8 + bin/setup | 29 ++++ bin/spring | 15 ++ config.ru | 4 + config/application.rb | 26 +++ config/boot.rb | 3 + config/database.yml | 25 +++ config/environment.rb | 5 + config/environments/development.rb | 41 +++++ config/environments/production.rb | 79 +++++++++ config/environments/test.rb | 42 +++++ config/initializers/assets.rb | 11 ++ config/initializers/backtrace_silencers.rb | 7 + config/initializers/cookies_serializer.rb | 3 + .../initializers/filter_parameter_logging.rb | 4 + config/initializers/inflections.rb | 16 ++ config/initializers/mime_types.rb | 4 + config/initializers/session_store.rb | 3 + config/initializers/wrap_parameters.rb | 14 ++ config/locales/en.yml | 23 +++ config/routes.rb | 56 +++++++ config/secrets.yml | 22 +++ db/seeds.rb | 7 + lib/assets/.keep | 0 lib/tasks/.keep | 0 log/.keep | 0 public/404.html | 67 ++++++++ public/422.html | 67 ++++++++ public/500.html | 66 ++++++++ public/favicon.ico | 0 public/robots.txt | 5 + test/controllers/.keep | 0 test/fixtures/.keep | 0 test/helpers/.keep | 0 test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/test_helper.rb | 10 ++ vendor/assets/javascripts/.keep | 0 vendor/assets/stylesheets/.keep | 0 57 files changed, 956 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Rakefile create mode 100644 app/assets/images/.keep create mode 100644 app/assets/javascripts/application.js create mode 100644 app/assets/stylesheets/application.css create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/concerns/.keep create mode 100644 app/helpers/application_helper.rb create mode 100644 app/mailers/.keep create mode 100644 app/models/.keep create mode 100644 app/models/concerns/.keep create mode 100644 app/views/layouts/application.html.erb create mode 100755 bin/bundle create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/spring create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/assets.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/cookies_serializer.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/session_store.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/routes.rb create mode 100644 config/secrets.yml create mode 100644 db/seeds.rb create mode 100644 lib/assets/.keep create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 public/404.html create mode 100644 public/422.html create mode 100644 public/500.html create mode 100644 public/favicon.ico create mode 100644 public/robots.txt create mode 100644 test/controllers/.keep create mode 100644 test/fixtures/.keep create mode 100644 test/helpers/.keep create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/test_helper.rb create mode 100644 vendor/assets/javascripts/.keep create mode 100644 vendor/assets/stylesheets/.keep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..050c9d9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore the default SQLite database. +/db/*.sqlite3 +/db/*.sqlite3-journal + +# Ignore all logfiles and tempfiles. +/log/* +!/log/.keep +/tmp diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..37bc11c --- /dev/null +++ b/Gemfile @@ -0,0 +1,47 @@ +source 'https://rubygems.org' + + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '4.2.4' +# Use sqlite3 as the database for Active Record +gem 'sqlite3' +# Use SCSS for stylesheets +gem 'sass-rails', '~> 5.0' +# Use Uglifier as compressor for JavaScript assets +gem 'uglifier', '>= 1.3.0' +# Use CoffeeScript for .coffee assets and views +gem 'coffee-rails', '~> 4.1.0' +# See https://github.com/rails/execjs#readme for more supported runtimes +# gem 'therubyracer', platforms: :ruby + +# Use jquery as the JavaScript library +gem 'jquery-rails' +# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks +gem 'turbolinks' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +gem 'jbuilder', '~> 2.0' +# bundle exec rake doc:rails generates the API under doc/api. +gem 'sdoc', '~> 0.4.0', group: :doc + +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use Unicorn as the app server +# gem 'unicorn' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug' +end + +group :development do + # Access an IRB console on exception pages or by using <%= console %> in views + gem 'web-console', '~> 2.0' + + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' +end + diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..9b8a9b6 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,156 @@ +GEM + remote: https://rubygems.org/ + specs: + actionmailer (4.2.4) + actionpack (= 4.2.4) + actionview (= 4.2.4) + activejob (= 4.2.4) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 1.0, >= 1.0.5) + actionpack (4.2.4) + actionview (= 4.2.4) + activesupport (= 4.2.4) + rack (~> 1.6) + rack-test (~> 0.6.2) + rails-dom-testing (~> 1.0, >= 1.0.5) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (4.2.4) + activesupport (= 4.2.4) + builder (~> 3.1) + erubis (~> 2.7.0) + rails-dom-testing (~> 1.0, >= 1.0.5) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + activejob (4.2.4) + activesupport (= 4.2.4) + globalid (>= 0.3.0) + activemodel (4.2.4) + activesupport (= 4.2.4) + builder (~> 3.1) + activerecord (4.2.4) + activemodel (= 4.2.4) + activesupport (= 4.2.4) + arel (~> 6.0) + activesupport (4.2.4) + i18n (~> 0.7) + json (~> 1.7, >= 1.7.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + arel (6.0.3) + binding_of_caller (0.7.2) + debug_inspector (>= 0.0.1) + builder (3.2.2) + byebug (6.0.2) + coffee-rails (4.1.0) + coffee-script (>= 2.2.0) + railties (>= 4.0.0, < 5.0) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.9.1.1) + debug_inspector (0.0.2) + erubis (2.7.0) + execjs (2.6.0) + globalid (0.3.6) + activesupport (>= 4.1.0) + i18n (0.7.0) + jbuilder (2.3.1) + activesupport (>= 3.0.0, < 5) + multi_json (~> 1.2) + jquery-rails (4.0.5) + rails-dom-testing (~> 1.0) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + json (1.8.3) + loofah (2.0.3) + nokogiri (>= 1.5.9) + mail (2.6.3) + mime-types (>= 1.16, < 3) + mime-types (2.6.2) + mini_portile (0.6.2) + minitest (5.8.0) + multi_json (1.11.2) + nokogiri (1.6.6.2) + mini_portile (~> 0.6.0) + rack (1.6.4) + rack-test (0.6.3) + rack (>= 1.0) + rails (4.2.4) + actionmailer (= 4.2.4) + actionpack (= 4.2.4) + actionview (= 4.2.4) + activejob (= 4.2.4) + activemodel (= 4.2.4) + activerecord (= 4.2.4) + activesupport (= 4.2.4) + bundler (>= 1.3.0, < 2.0) + railties (= 4.2.4) + sprockets-rails + rails-deprecated_sanitizer (1.0.3) + activesupport (>= 4.2.0.alpha) + rails-dom-testing (1.0.7) + activesupport (>= 4.2.0.beta, < 5.0) + nokogiri (~> 1.6.0) + rails-deprecated_sanitizer (>= 1.0.1) + rails-html-sanitizer (1.0.2) + loofah (~> 2.0) + railties (4.2.4) + actionpack (= 4.2.4) + activesupport (= 4.2.4) + rake (>= 0.8.7) + thor (>= 0.18.1, < 2.0) + rake (10.4.2) + rdoc (4.2.0) + sass (3.4.18) + sass-rails (5.0.4) + railties (>= 4.0.0, < 5.0) + sass (~> 3.1) + sprockets (>= 2.8, < 4.0) + sprockets-rails (>= 2.0, < 4.0) + tilt (>= 1.1, < 3) + sdoc (0.4.1) + json (~> 1.7, >= 1.7.7) + rdoc (~> 4.0) + spring (1.4.0) + sprockets (3.3.4) + rack (~> 1.0) + sprockets-rails (2.3.3) + actionpack (>= 3.0) + activesupport (>= 3.0) + sprockets (>= 2.8, < 4.0) + sqlite3 (1.3.10) + thor (0.19.1) + thread_safe (0.3.5) + tilt (2.0.1) + turbolinks (2.5.3) + coffee-rails + tzinfo (1.2.2) + thread_safe (~> 0.1) + uglifier (2.7.2) + execjs (>= 0.3.0) + json (>= 1.8.0) + web-console (2.2.1) + activemodel (>= 4.0) + binding_of_caller (>= 0.7.2) + railties (>= 4.0) + sprockets-rails (>= 2.0, < 4.0) + +PLATFORMS + ruby + +DEPENDENCIES + byebug + coffee-rails (~> 4.1.0) + jbuilder (~> 2.0) + jquery-rails + rails (= 4.2.4) + sass-rails (~> 5.0) + sdoc (~> 0.4.0) + spring + sqlite3 + turbolinks + uglifier (>= 1.3.0) + web-console (~> 2.0) + +BUNDLED WITH + 1.10.6 diff --git a/README.md b/README.md index 9a28abe..43dd7ba 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -danebook_goes_live -================== +# Danebook +## by [Bideo Wego](https://github.com/BideoWego) -This is your README! +A Danish social network that resembles (somewhat) another popular social network that will go unnamed to protect the innocent. + +[An assignment from Viking Code School](http://www.vikingcodeschool.com) \ No newline at end of file diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..ba6b733 --- /dev/null +++ b/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require File.expand_path('../config/application', __FILE__) + +Rails.application.load_tasks diff --git a/app/assets/images/.keep b/app/assets/images/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100644 index 0000000..e07c5a8 --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,16 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, +// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. +// +// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details +// about supported directives. +// +//= require jquery +//= require jquery_ujs +//= require turbolinks +//= require_tree . diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css new file mode 100644 index 0000000..f9cd5b3 --- /dev/null +++ b/app/assets/stylesheets/application.css @@ -0,0 +1,15 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, + * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any styles + * defined in the other CSS/SCSS files in this directory. It is generally better to create a new + * file per style scope. + * + *= require_tree . + *= require_self + */ diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000..d83690e --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,5 @@ +class ApplicationController < ActionController::Base + # Prevent CSRF attacks by raising an exception. + # For APIs, you may want to use :null_session instead. + protect_from_forgery with: :exception +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000..de6be79 --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/app/mailers/.keep b/app/mailers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/models/.keep b/app/models/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 0000000..6bf9efa --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,14 @@ + + + + Danebook + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> + <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> + <%= csrf_meta_tags %> + + + +<%= yield %> + + + diff --git a/bin/bundle b/bin/bundle new file mode 100755 index 0000000..66e9889 --- /dev/null +++ b/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000..4d608ed --- /dev/null +++ b/bin/rails @@ -0,0 +1,8 @@ +#!/usr/bin/env ruby +begin + load File.expand_path("../spring", __FILE__) +rescue LoadError +end +APP_PATH = File.expand_path('../../config/application', __FILE__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/bin/rake b/bin/rake new file mode 100755 index 0000000..8017a02 --- /dev/null +++ b/bin/rake @@ -0,0 +1,8 @@ +#!/usr/bin/env ruby +begin + load File.expand_path("../spring", __FILE__) +rescue LoadError +end +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000..acdb2c1 --- /dev/null +++ b/bin/setup @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +require 'pathname' + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +Dir.chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file: + + puts "== Installing dependencies ==" + system "gem install bundler --conservative" + system "bundle check || bundle install" + + # puts "\n== Copying sample files ==" + # unless File.exist?("config/database.yml") + # system "cp config/database.yml.sample config/database.yml" + # end + + puts "\n== Preparing database ==" + system "bin/rake db:setup" + + puts "\n== Removing old logs and tempfiles ==" + system "rm -f log/*" + system "rm -rf tmp/cache" + + puts "\n== Restarting application server ==" + system "touch tmp/restart.txt" +end diff --git a/bin/spring b/bin/spring new file mode 100755 index 0000000..5e7ecc4 --- /dev/null +++ b/bin/spring @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby + +# This file loads spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require "rubygems" + require "bundler" + + if (match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m)) + Gem.paths = { "GEM_PATH" => [Bundler.bundle_path.to_s, *Gem.path].uniq } + gem "spring", match[1] + require "spring/binstub" + end +end diff --git a/config.ru b/config.ru new file mode 100644 index 0000000..bd83b25 --- /dev/null +++ b/config.ru @@ -0,0 +1,4 @@ +# This file is used by Rack-based servers to start the application. + +require ::File.expand_path('../config/environment', __FILE__) +run Rails.application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 0000000..92a355f --- /dev/null +++ b/config/application.rb @@ -0,0 +1,26 @@ +require File.expand_path('../boot', __FILE__) + +require 'rails/all' + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module Danebook + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. + # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. + # config.time_zone = 'Central Time (US & Canada)' + + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + # config.i18n.default_locale = :de + + # Do not swallow errors in after_commit/after_rollback callbacks. + config.active_record.raise_in_transactional_callbacks = true + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000..6b750f0 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,3 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 0000000..1c1a37c --- /dev/null +++ b/config/database.yml @@ -0,0 +1,25 @@ +# SQLite version 3.x +# gem install sqlite3 +# +# Ensure the SQLite 3 gem is defined in your Gemfile +# gem 'sqlite3' +# +default: &default + adapter: sqlite3 + pool: 5 + timeout: 5000 + +development: + <<: *default + database: db/development.sqlite3 + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: db/test.sqlite3 + +production: + <<: *default + database: db/production.sqlite3 diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000..ee8d90d --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require File.expand_path('../application', __FILE__) + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 0000000..b55e214 --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,41 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Asset digests allow you to set far-future HTTP expiration dates on all assets, + # yet still be able to expire them through the digest params. + config.assets.digest = true + + # Adds additional error checking when serving assets at runtime. + # Checks for improperly declared sprockets dependencies. + # Raises helpful error messages. + config.assets.raise_runtime_errors = true + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000..5c1b32e --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,79 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Enable Rack::Cache to put a simple HTTP cache in front of your application + # Add `rack-cache` to your Gemfile before enabling this. + # For large-scale production use, consider using a caching reverse proxy like + # NGINX, varnish or squid. + # config.action_dispatch.rack_cache = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # Asset digests allow you to set far-future HTTP expiration dates on all assets, + # yet still be able to expire them through the digest params. + config.assets.digest = true + + # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + # config.log_tags = [ :subdomain, :uuid ] + + # Use a different logger for distributed setups. + # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 0000000..1c19f08 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,42 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure static file server for tests with Cache-Control for performance. + config.serve_static_files = true + config.static_cache_control = 'public, max-age=3600' + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Randomize the order test cases are executed. + config.active_support.test_order = :random + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb new file mode 100644 index 0000000..01ef3e6 --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,11 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path +# Rails.application.config.assets.paths << Emoji.images_path + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. +# Rails.application.config.assets.precompile += %w( search.js ) diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000..59385cd --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000..7f70458 --- /dev/null +++ b/config/initializers/cookies_serializer.rb @@ -0,0 +1,3 @@ +# Be sure to restart your server when you modify this file. + +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000..4a994e1 --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 0000000..ac033bf --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 0000000..dc18996 --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb new file mode 100644 index 0000000..f7b5ca3 --- /dev/null +++ b/config/initializers/session_store.rb @@ -0,0 +1,3 @@ +# Be sure to restart your server when you modify this file. + +Rails.application.config.session_store :cookie_store, key: '_danebook_session' diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000..33725e9 --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] if respond_to?(:wrap_parameters) +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000..0653957 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,23 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000..3f66539 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,56 @@ +Rails.application.routes.draw do + # The priority is based upon order of creation: first created -> highest priority. + # See how all your routes lay out with "rake routes". + + # You can have the root of your site routed with "root" + # root 'welcome#index' + + # Example of regular route: + # get 'products/:id' => 'catalog#view' + + # Example of named route that can be invoked with purchase_url(id: product.id) + # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase + + # Example resource route (maps HTTP verbs to controller actions automatically): + # resources :products + + # Example resource route with options: + # resources :products do + # member do + # get 'short' + # post 'toggle' + # end + # + # collection do + # get 'sold' + # end + # end + + # Example resource route with sub-resources: + # resources :products do + # resources :comments, :sales + # resource :seller + # end + + # Example resource route with more complex sub-resources: + # resources :products do + # resources :comments + # resources :sales do + # get 'recent', on: :collection + # end + # end + + # Example resource route with concerns: + # concern :toggleable do + # post 'toggle' + # end + # resources :posts, concerns: :toggleable + # resources :photos, concerns: :toggleable + + # Example resource route within a namespace: + # namespace :admin do + # # Directs /admin/products/* to Admin::ProductsController + # # (app/controllers/admin/products_controller.rb) + # resources :products + # end +end diff --git a/config/secrets.yml b/config/secrets.yml new file mode 100644 index 0000000..6192c25 --- /dev/null +++ b/config/secrets.yml @@ -0,0 +1,22 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! + +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +# You can use `rake secret` to generate a secure secret key. + +# Make sure the secrets in this file are kept private +# if you're sharing your code publicly. + +development: + secret_key_base: 8443f7ea12f778eae378c65ea736a0df987fbc5b44f096d0409e970e95cbe428a1902de08090806eae49598eb7dffafd56bd4b85d67de08a6400d9900035054a + +test: + secret_key_base: 4ddfcba4204d228975bd9c949a35c3c8be59149e8a584d51f52d3a9472df97be65bb8dddd52c8557361d59c89337841128049ae3607e66ab735a976d036c00ca + +# Do not keep production secrets in the repository, +# instead read values from the environment. +production: + secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000..4edb1e8 --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,7 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). +# +# Examples: +# +# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) +# Mayor.create(name: 'Emanuel', city: cities.first) diff --git a/lib/assets/.keep b/lib/assets/.keep new file mode 100644 index 0000000..e69de29 diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 0000000..e69de29 diff --git a/log/.keep b/log/.keep new file mode 100644 index 0000000..e69de29 diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..b612547 --- /dev/null +++ b/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 0000000..a21f82b --- /dev/null +++ b/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000..061abc5 --- /dev/null +++ b/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..3c9c7c0 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,5 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file +# +# To ban all spiders from the entire site uncomment the next two lines: +# User-agent: * +# Disallow: / diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/.keep b/test/fixtures/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/helpers/.keep b/test/helpers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..92e39b2 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,10 @@ +ENV['RAILS_ENV'] ||= 'test' +require File.expand_path('../../config/environment', __FILE__) +require 'rails/test_help' + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + + # Add more helper methods to be used by all tests here... +end diff --git a/vendor/assets/javascripts/.keep b/vendor/assets/javascripts/.keep new file mode 100644 index 0000000..e69de29 diff --git a/vendor/assets/stylesheets/.keep b/vendor/assets/stylesheets/.keep new file mode 100644 index 0000000..e69de29 From f596eb270fc070d19227deb38037f22b94771ed0 Mon Sep 17 00:00:00 2001 From: Chris Scavello Date: Thu, 17 Sep 2015 21:02:17 -0400 Subject: [PATCH 2/5] Add static pages --- Gemfile | 2 +- Gemfile.lock | 3 - app/assets/javascripts/application.js | 5 +- app/assets/javascripts/static_pages.js | 11 + app/assets/stylesheets/application.css | 2 +- app/assets/stylesheets/scss/_about.scss | 41 ++ app/assets/stylesheets/scss/_about_edit.scss | 17 + app/assets/stylesheets/scss/_friends.scss | 37 ++ app/assets/stylesheets/scss/_news_feed.scss | 109 ++++ app/assets/stylesheets/scss/_photos.scss | 57 ++ app/assets/stylesheets/scss/_timeline.scss | 93 +++ .../stylesheets/scss/components/_nav.scss | 128 ++++ .../scss/components/_offcanvas.scss | 64 ++ .../scss/components/_post_form.scss | 37 ++ .../scss/components/_posts_comments.scss | 96 +++ .../scss/components/_profile_header.scss | 131 +++++ .../scss/components/_profile_page.scss | 19 + .../stylesheets/scss/config/_colors.scss | 7 + .../stylesheets/scss/config/_images.scss | 3 + app/assets/stylesheets/scss/lib/_mixins.scss | 22 + app/assets/stylesheets/static_pages.scss | 21 + app/controllers/static_pages_controller.rb | 22 + app/helpers/static_pages_helper.rb | 2 + app/views/layouts/application.html.erb | 50 +- app/views/shared/_nav.html.erb | 60 ++ app/views/shared/_profile_header.html.erb | 49 ++ app/views/static_pages/about.html.erb | 97 ++++ app/views/static_pages/about_edit.html.erb | 296 ++++++++++ app/views/static_pages/friends.html.erb | 163 ++++++ app/views/static_pages/index.html.erb | 16 + app/views/static_pages/news_feed.html.erb | 545 ++++++++++++++++++ app/views/static_pages/photos.html.erb | 142 +++++ app/views/static_pages/timeline.html.erb | 473 +++++++++++++++ config/routes.rb | 9 + public/assets/_js/offcanvas.js | 7 + public/assets/_styles/css/about.css | 173 ++++++ public/assets/_styles/css/about.css.map | 7 + public/assets/_styles/css/about_edit.css | 158 +++++ public/assets/_styles/css/about_edit.css.map | 7 + public/assets/_styles/css/friends.css | 169 ++++++ public/assets/_styles/css/friends.css.map | 7 + public/assets/_styles/css/news_feed.css | 355 ++++++++++++ public/assets/_styles/css/news_feed.css.map | 7 + public/assets/_styles/css/photos.css | 190 ++++++ public/assets/_styles/css/photos.css.map | 7 + public/assets/_styles/css/style.css | 149 +++++ public/assets/_styles/css/style.css.map | 7 + public/assets/_styles/css/timeline.css | 355 ++++++++++++ public/assets/_styles/css/timeline.css.map | 7 + public/assets/_styles/scss/about.scss | 43 ++ public/assets/_styles/scss/about_edit.scss | 19 + .../assets/_styles/scss/components/_base.scss | 6 + .../assets/_styles/scss/components/_nav.scss | 130 +++++ .../_styles/scss/components/_offcanvas.scss | 64 ++ .../_styles/scss/components/_post_form.scss | 37 ++ .../scss/components/_posts_comments.scss | 96 +++ .../scss/components/_profile_header.scss | 131 +++++ .../scss/components/_profile_page.scss | 19 + .../assets/_styles/scss/config/_colors.scss | 7 + .../assets/_styles/scss/config/_images.scss | 3 + public/assets/_styles/scss/friends.scss | 39 ++ public/assets/_styles/scss/lib/_mixins.scss | 22 + public/assets/_styles/scss/news_feed.scss | 114 ++++ public/assets/_styles/scss/photos.scss | 59 ++ public/assets/_styles/scss/style.scss | 3 + public/assets/_styles/scss/timeline.scss | 98 ++++ public/assets/images/danish_flag.gif | Bin 0 -> 2268 bytes public/assets/images/harry_potter_small.jpg | Bin 0 -> 12773 bytes public/assets/images/hogwarts_small.jpg | Bin 0 -> 73659 bytes public/assets/images/icon_photo_small.png | Bin 0 -> 7321 bytes .../images/user_silhouette_generic.gif.png | Bin 0 -> 2750 bytes 71 files changed, 5304 insertions(+), 20 deletions(-) create mode 100644 app/assets/javascripts/static_pages.js create mode 100644 app/assets/stylesheets/scss/_about.scss create mode 100644 app/assets/stylesheets/scss/_about_edit.scss create mode 100644 app/assets/stylesheets/scss/_friends.scss create mode 100644 app/assets/stylesheets/scss/_news_feed.scss create mode 100644 app/assets/stylesheets/scss/_photos.scss create mode 100644 app/assets/stylesheets/scss/_timeline.scss create mode 100644 app/assets/stylesheets/scss/components/_nav.scss create mode 100644 app/assets/stylesheets/scss/components/_offcanvas.scss create mode 100644 app/assets/stylesheets/scss/components/_post_form.scss create mode 100644 app/assets/stylesheets/scss/components/_posts_comments.scss create mode 100644 app/assets/stylesheets/scss/components/_profile_header.scss create mode 100644 app/assets/stylesheets/scss/components/_profile_page.scss create mode 100644 app/assets/stylesheets/scss/config/_colors.scss create mode 100644 app/assets/stylesheets/scss/config/_images.scss create mode 100644 app/assets/stylesheets/scss/lib/_mixins.scss create mode 100644 app/assets/stylesheets/static_pages.scss create mode 100644 app/controllers/static_pages_controller.rb create mode 100644 app/helpers/static_pages_helper.rb create mode 100644 app/views/shared/_nav.html.erb create mode 100644 app/views/shared/_profile_header.html.erb create mode 100644 app/views/static_pages/about.html.erb create mode 100644 app/views/static_pages/about_edit.html.erb create mode 100644 app/views/static_pages/friends.html.erb create mode 100644 app/views/static_pages/index.html.erb create mode 100644 app/views/static_pages/news_feed.html.erb create mode 100644 app/views/static_pages/photos.html.erb create mode 100644 app/views/static_pages/timeline.html.erb create mode 100644 public/assets/_js/offcanvas.js create mode 100644 public/assets/_styles/css/about.css create mode 100644 public/assets/_styles/css/about.css.map create mode 100644 public/assets/_styles/css/about_edit.css create mode 100644 public/assets/_styles/css/about_edit.css.map create mode 100644 public/assets/_styles/css/friends.css create mode 100644 public/assets/_styles/css/friends.css.map create mode 100644 public/assets/_styles/css/news_feed.css create mode 100644 public/assets/_styles/css/news_feed.css.map create mode 100644 public/assets/_styles/css/photos.css create mode 100644 public/assets/_styles/css/photos.css.map create mode 100644 public/assets/_styles/css/style.css create mode 100644 public/assets/_styles/css/style.css.map create mode 100644 public/assets/_styles/css/timeline.css create mode 100644 public/assets/_styles/css/timeline.css.map create mode 100644 public/assets/_styles/scss/about.scss create mode 100644 public/assets/_styles/scss/about_edit.scss create mode 100644 public/assets/_styles/scss/components/_base.scss create mode 100644 public/assets/_styles/scss/components/_nav.scss create mode 100644 public/assets/_styles/scss/components/_offcanvas.scss create mode 100644 public/assets/_styles/scss/components/_post_form.scss create mode 100644 public/assets/_styles/scss/components/_posts_comments.scss create mode 100644 public/assets/_styles/scss/components/_profile_header.scss create mode 100644 public/assets/_styles/scss/components/_profile_page.scss create mode 100644 public/assets/_styles/scss/config/_colors.scss create mode 100644 public/assets/_styles/scss/config/_images.scss create mode 100644 public/assets/_styles/scss/friends.scss create mode 100644 public/assets/_styles/scss/lib/_mixins.scss create mode 100644 public/assets/_styles/scss/news_feed.scss create mode 100644 public/assets/_styles/scss/photos.scss create mode 100644 public/assets/_styles/scss/style.scss create mode 100644 public/assets/_styles/scss/timeline.scss create mode 100644 public/assets/images/danish_flag.gif create mode 100644 public/assets/images/harry_potter_small.jpg create mode 100644 public/assets/images/hogwarts_small.jpg create mode 100644 public/assets/images/icon_photo_small.png create mode 100644 public/assets/images/user_silhouette_generic.gif.png diff --git a/Gemfile b/Gemfile index 37bc11c..051936c 100644 --- a/Gemfile +++ b/Gemfile @@ -17,7 +17,7 @@ gem 'coffee-rails', '~> 4.1.0' # Use jquery as the JavaScript library gem 'jquery-rails' # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks -gem 'turbolinks' +# gem 'turbolinks' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.0' # bundle exec rake doc:rails generates the API under doc/api. diff --git a/Gemfile.lock b/Gemfile.lock index 9b8a9b6..983c7fa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -122,8 +122,6 @@ GEM thor (0.19.1) thread_safe (0.3.5) tilt (2.0.1) - turbolinks (2.5.3) - coffee-rails tzinfo (1.2.2) thread_safe (~> 0.1) uglifier (2.7.2) @@ -148,7 +146,6 @@ DEPENDENCIES sdoc (~> 0.4.0) spring sqlite3 - turbolinks uglifier (>= 1.3.0) web-console (~> 2.0) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index e07c5a8..b0b6717 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -10,7 +10,6 @@ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details // about supported directives. // -//= require jquery +//= require jquery2 //= require jquery_ujs -//= require turbolinks -//= require_tree . +//= require static_pages diff --git a/app/assets/javascripts/static_pages.js b/app/assets/javascripts/static_pages.js new file mode 100644 index 0000000..4899c9d --- /dev/null +++ b/app/assets/javascripts/static_pages.js @@ -0,0 +1,11 @@ +// Static Pages JS + +// offcanvas + +(function() { + $(document).ready(function () { + $('[data-toggle="offcanvas"]').click(function () { + $('.row-offcanvas').toggleClass('active') + }); + }); +})($); diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index f9cd5b3..b44f012 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -10,6 +10,6 @@ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new * file per style scope. * - *= require_tree . + *= require static_pages *= require_self */ diff --git a/app/assets/stylesheets/scss/_about.scss b/app/assets/stylesheets/scss/_about.scss new file mode 100644 index 0000000..d5ca033 --- /dev/null +++ b/app/assets/stylesheets/scss/_about.scss @@ -0,0 +1,41 @@ +// about + +#about { + .about-container { + padding-top: 64px; + padding-bottom: 64px; + } + + .about-info-container { + dt { + width: 45%; + clear: both; + } + dt, + dd { + margin-top: 16px; + float: left; + } + + p { + text-indent: 2em; + } + } +} + +@media only screen and (max-width: 767px) { + .about-container h2 { + text-align: center; + } + + .about-info-container { + dt { + width: auto; + margin-right: 5%; + text-align: right; + } + dd { + text-align: left; + } + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/scss/_about_edit.scss b/app/assets/stylesheets/scss/_about_edit.scss new file mode 100644 index 0000000..1c2c9cc --- /dev/null +++ b/app/assets/stylesheets/scss/_about_edit.scss @@ -0,0 +1,17 @@ +// about edit + +#about-edit { + textarea.form-control { + height: 196px; + } + + .submit-container { + margin-top: 32px; + margin-bottom: 64px; + text-align: center; + + .submit { + padding: 16px 32px; + } + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/scss/_friends.scss b/app/assets/stylesheets/scss/_friends.scss new file mode 100644 index 0000000..c19add3 --- /dev/null +++ b/app/assets/stylesheets/scss/_friends.scss @@ -0,0 +1,37 @@ +// friends + +#friends { + .friend-container { + padding-top: 16px; + padding-bottom: 16px; + } + + .friend-info-container { + line-height: (96px / 2); + } + + .unfriend-link-container { + line-height: 96px; + } + + .profile-image-container { + margin: 0 auto; + width: 96px; + height: 96px; + + a { + display: block; + } + + img { + border-radius: 4px; + width: 96px; + } + } + + @media only screen and (max-width: 767px) { + .friend-container { + text-align: center; + } + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/scss/_news_feed.scss b/app/assets/stylesheets/scss/_news_feed.scss new file mode 100644 index 0000000..0d57868 --- /dev/null +++ b/app/assets/stylesheets/scss/_news_feed.scss @@ -0,0 +1,109 @@ +// news feed + +#news-feed { + margin-top: 0; + border: none; + + .news-feed-header, + .news-feed-footer { + border-bottom: 1px solid $border; + background: #ddd; + + h1 { + text-align: center; + } + } + + .news-feed-container { + border-left: 1px solid $border; + } + + .details-container, + .news-feed-container { + padding-top: 32px; + } + + .news-feed-container { + padding-left: 8.333333333333%; + } + + @media only screen and (max-width: 767px) { + #profile-avatar { + margin-top: 56px; + } + + .news-feed-container { + padding-left: 30px; + padding-right: 30px; + } + + .details-container { + margin-left: 15px; + margin-right: 15px; + } + } +} + +#profile-avatar { + .profile-image-container { + width: 128px; + height: 128px; + border-radius: 4px; + border: 1px solid $border; + + a { + display: block; + } + + img { + width: 128px; + } + } + + .profile-avatar-links-container { + a { + display: block; + } + .profile-link { + font-size: 18px; + } + } +} + +#recently-active { + .profile-image-container { + width: 64px; + height: 64px; + + a { + display: block; + } + + img { + width: 64px; + } + } + + .activity-link-container { + margin-bottom: 16px; + } + + .activity-info-container { + a, + time { + display: block; + } + } + + footer { + text-align: center; + } +} + +#profile-avatar, +#recently-active { + .profile-image-container { + overflow: hidden; + } +} + diff --git a/app/assets/stylesheets/scss/_photos.scss b/app/assets/stylesheets/scss/_photos.scss new file mode 100644 index 0000000..edfb9e5 --- /dev/null +++ b/app/assets/stylesheets/scss/_photos.scss @@ -0,0 +1,57 @@ +// photos + +#photos { + .profile-page-header { + position: relative; + } + + .add-photo-link-container { + position: absolute; + top: 50%; + right: 16px; + transform: translateY(-50%); + } + + .photos-container { + margin-left: 0; + margin-right: 0; + padding-left: 15px; + padding-right: 15px; + } + + .photo-container { + position: relative; + overflow: hidden; + margin-top: 8px; + margin-bottom: 8px; + padding-left: 15px; + padding-right: 15px; + + img { + width: 100%; + } + + .pub-date-container { + position: absolute; + text-align: center; + bottom: -50px; + left: 0; + width: 100%; + padding-top: 8px; + padding-bottom: 8px; + background: $dark; + color: $light; + } + + &:focus, + &:hover { + border-radius: 4px; + border: 1px solid $dark; + + .pub-date-container { + bottom: 0; + @include transition(bottom 0.5s linear); + } + } + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/scss/_timeline.scss b/app/assets/stylesheets/scss/_timeline.scss new file mode 100644 index 0000000..0dac378 --- /dev/null +++ b/app/assets/stylesheets/scss/_timeline.scss @@ -0,0 +1,93 @@ +// timeline + +#timeline { + border: none; + + .details-header, + .timeline-header, + .timeline-footer { + border-bottom: 1px solid $border; + background: #ddd; + + h1 { + text-align: center; + } + } + + #about { + .about-container, + dl { + @include clearfix; + } + dt { + width: 45%; + clear: both; + } + dt, + dd { + margin-top: 16px; + float: left; + } + } + + #photos, + #friends { + img { + width: 100%; + } + + footer { + text-align: center; + } + } + + #about, + #photos, + #friends { + border: 1px solid $border; + border-radius: 4px; + margin-bottom: 32px; + padding: 0 0 16px 0; + } + + .details-header { + h1 { + margin-top: 0; + margin-bottom: 0; + } + } + + .about-container, + .photos-container, + .friends-container { + padding: 16px; + } + + .photos-container, + .friends-container { + .row { + div { + padding: 16px; + } + } + } + + .photos-container { + a { + display: block; + } + } + + @media only screen and (max-width: 767px) { + .details-container { + margin-left: 15px; + margin-right: 15px; + } + } +} + +@media only screen and (max-width: 767px) { + #about { + margin-top: 50px; + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/scss/components/_nav.scss b/app/assets/stylesheets/scss/components/_nav.scss new file mode 100644 index 0000000..a8bbf76 --- /dev/null +++ b/app/assets/stylesheets/scss/components/_nav.scss @@ -0,0 +1,128 @@ +// nav + +#navbar { + position: static; + border-radius: 0; + border: none; + margin: 0; + line-height: 64px; + z-index: 100; + background: $primary; + + // -------------------- + // brand + // -------------------- + + .navbar-brand { + display: block; + height: 100%; + line-height: 32px; + + img { + width: 32px; + height: 32px; + } + + span { + font-size: 24px; + padding: 0 8px; + color: $light; + } + } + + // -------------------- + // search + // -------------------- + + #navbar-search { + .form-group, + input { + width: 100%; + } + } + + // -------------------- + // username + // -------------------- + + .navbar-username { + font-size: 18px; + padding-left: 16px; + padding-right: 16px; + text-align: right; + + a { + color: $light; + } + } + + .navbar-username { + width: 100%; + } + + // -------------------- + // toggle + // -------------------- + + .navbar-toggle { + &:hover, + &:focus { + background: lighten($primary, 10%); + } + + .icon-bar { + background: $light; + } + } + + // -------------------- + // shared styles + // -------------------- + + .navbar-brand, + #navbar-search, + .navbar-username { + margin: 0; + display: block; + height: 100%; + } + + #navbar-collapse, + #navbar-search { + border-color: darken($primary, 10%); + } + + // -------------------- + // media queries + // -------------------- + + @media only screen and (max-width: 768px) { + .navbar-username { + text-align: center; + } + + .col-sm-2, + .col-sm-6 { + padding-left: 0; + padding-right: 0; + } + } +} + +// -------------------- +// fixed position +// -------------------- + +@media only screen and (min-width: 768px) { + body { + padding-top: 64px; + } + + #navbar { + position: fixed; + top: 0; + right: 0; + left: 0; + + } +} diff --git a/app/assets/stylesheets/scss/components/_offcanvas.scss b/app/assets/stylesheets/scss/components/_offcanvas.scss new file mode 100644 index 0000000..5485c02 --- /dev/null +++ b/app/assets/stylesheets/scss/components/_offcanvas.scss @@ -0,0 +1,64 @@ +// offcanvas + +/* +* Style tweaks +* -------------------------------------------------- +*/ + +body { + overflow-x: hidden; /* Prevent scroll on narrow devices */ +} + +/* +* Off Canvas +* -------------------------------------------------- +*/ +@media screen and (max-width: 767px) { + .row-offcanvas { + position: relative; + -webkit-transition: all .25s ease-out; + -o-transition: all .25s ease-out; + transition: all .25s ease-out; + } + + .row-offcanvas-right { + right: 0; + } + + .row-offcanvas-left { + left: 0; + } + + .row-offcanvas-right + .sidebar-offcanvas { + right: -50%; /* 6 columns */ + } + + .row-offcanvas-left + .sidebar-offcanvas { + left: -50%; /* 6 columns */ + } + + .row-offcanvas-right.active { + right: 50%; /* 6 columns */ + } + + .row-offcanvas-left.active { + left: 50%; /* 6 columns */ + } + + .sidebar-offcanvas { + position: absolute !important; + top: 0; + width: 50%; /* 6 columns */ + } + + .row-offcanvas-left, + .row-offcanvas-right { + height: 100%; + } + + .offcanvas-toggle-container { + margin-bottom: 16px; + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/scss/components/_post_form.scss b/app/assets/stylesheets/scss/components/_post_form.scss new file mode 100644 index 0000000..f5bac59 --- /dev/null +++ b/app/assets/stylesheets/scss/components/_post_form.scss @@ -0,0 +1,37 @@ +// post form + +@import '../config/colors'; + +.profile-page-container + +#post-form-wrapper { + border: 1px solid $border; + border-radius: 4px; + padding: 0; + + .post-form-header { + h1 { + margin-top: 0; + margin-bottom: 0; + } + } + + .post-form-header, + .post-form-footer { + @extend .profile-page-header; + } + + .form-group { + padding: 16px 32px; + } + textarea.form-control { + max-width: 100%; + height: 128px; + resize:vertical; + } + + .post-form-footer { + text-align: right; + padding: 8px; + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/scss/components/_posts_comments.scss b/app/assets/stylesheets/scss/components/_posts_comments.scss new file mode 100644 index 0000000..51f4443 --- /dev/null +++ b/app/assets/stylesheets/scss/components/_posts_comments.scss @@ -0,0 +1,96 @@ +// posts comments + +@import '../config/colors'; + +.post { + margin-top: 32px; + padding-top: 16px; + border: 1px solid $border; + border-radius: 4px; + + .post-profile-image-container { + margin: 0 auto; + overflow-y: hidden; + width: 64px; + height: 64px; + + a { + display: block; + } + + img { + width: 100%; + } + } + + @media only screen and (max-width: 767px) { + .post-profile-image-container { + width: 48px; + height: 48px; + } + } + + .post-info-container { + a, + time { + display: block; + } + } + + .post-likes { + clear: both; + } + + article { + padding: 8px; + } + + footer { + @include clearfix; + border-top: 1px solid $border; + padding: 8px; + + .post-footer-links a { + // + } + + .post-footer-links, + .post-likes { + padding-top: 8px; + padding-bottom: 8px; + } + + .delete-link-container { + text-align: right; + } + } + + footer, + .post-comments, + .comment, + .comment-form-container { + background: #ddd; + } +} + +.comment, +.comment-form-container, +.post footer { + margin-left: -15px; + margin-right: -15px; +} + +.comment { + padding-top: 16px; + clear: both; +} + +.comment footer, +.comment-form-container footer { + margin-left: 0; + margin-right: 0; +} + +.comment-form-container .form-group { + padding: 8px; +} diff --git a/app/assets/stylesheets/scss/components/_profile_header.scss b/app/assets/stylesheets/scss/components/_profile_header.scss new file mode 100644 index 0000000..0b92e40 --- /dev/null +++ b/app/assets/stylesheets/scss/components/_profile_header.scss @@ -0,0 +1,131 @@ +// profile header + +@import '../config/colors'; +@import '../config/images'; + +#profile-header { + position: relative; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + + .profile-image-container, + .cover-image-container { + border-radius: 4px; + } + + // -------------------- + // cover image + // -------------------- + + .cover-image-container { + background: url($cover-image) no-repeat; + background-position: center; + background-size: cover; + border-top-left-radius: 0; + border-top-right-radius: 0; + height: 384px; + } + + // -------------------- + // profile image + // -------------------- + + .profile-image-container { + position: absolute; + width: 192px; + height: 192px; + overflow: hidden; + left: 56px; + bottom: 16px; + + img { + display: block; + width: 192px; + } + } + + // -------------------- + // profile nav + // -------------------- + + .profile-nav-container { + line-height: 64px; + text-align: center; + + .current { + color: $dark; + } + } + + // -------------------- + // media queries + // -------------------- + + @media only screen and (min-width: 768px) { + .profile-nav-container { + .edit { + text-align: right; + } + } + } + + @media only screen and (min-width: 992px) and (max-width: 1199px) { + .profile-image-container { + left: 32px; + } + } + + @media only screen and (min-width: 768px) and (max-width: 991px) { + .profile-image-container { + width: 128px; + height: 128px; + left: 36px; + + img { + width: 128px; + } + } + + .profile-nav-container { + div { + padding-left: 4px; + padding-right: 4px; + } + } + } + + @media only screen and (max-width: 767px) { + .profile-image-container { + left: 32px; + top: -75%; + } + } + +} + +// -------------------- +// borders +// -------------------- + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-image-container, +#profile-header .profile-nav-container div { + border: 1px solid $border; +} +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-nav-container div { + border-top: none; +} +#profile-header .profile-nav-container div { + border-right: none; + border-bottom: none; +} +@media only screen and (max-width: 767px) { + #profile-header, + #profile-header .cover-image-container, + #profile-header .profile-nav-container div { + border: none; + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/scss/components/_profile_page.scss b/app/assets/stylesheets/scss/components/_profile_page.scss new file mode 100644 index 0000000..1a53c2f --- /dev/null +++ b/app/assets/stylesheets/scss/components/_profile_page.scss @@ -0,0 +1,19 @@ +// profile page + +@import '../config/colors'; + +.profile-page-container { + margin-top: 64px; + margin-bottom: 128px; + border: 1px solid $border; + border-radius: 4px; + + .profile-page-header { + border-bottom: 1px solid $border; + background: #ddd; + + h1 { + text-align: center; + } + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/scss/config/_colors.scss b/app/assets/stylesheets/scss/config/_colors.scss new file mode 100644 index 0000000..e8dbe1a --- /dev/null +++ b/app/assets/stylesheets/scss/config/_colors.scss @@ -0,0 +1,7 @@ +// colors + +$primary: #3E76DA; +$light: #eee; +$dark: #111; + +$border: darken($light, 10%); \ No newline at end of file diff --git a/app/assets/stylesheets/scss/config/_images.scss b/app/assets/stylesheets/scss/config/_images.scss new file mode 100644 index 0000000..a0bab2b --- /dev/null +++ b/app/assets/stylesheets/scss/config/_images.scss @@ -0,0 +1,3 @@ +// images + +$cover-image: '/assets/images/hogwarts_small.jpg'; \ No newline at end of file diff --git a/app/assets/stylesheets/scss/lib/_mixins.scss b/app/assets/stylesheets/scss/lib/_mixins.scss new file mode 100644 index 0000000..ddfda47 --- /dev/null +++ b/app/assets/stylesheets/scss/lib/_mixins.scss @@ -0,0 +1,22 @@ +// mixins + +@mixin clearfix() { + &:after, + &:before { + display: table; + content: ""; + } + &:after { + clear: both; + } +} +.clearfix { + @include clearfix; +} + +@mixin transition($value) { + -webkit-transition: $value; + -moz-transition: $value; + -o-transitiion: $value; + transition: $value; +} \ No newline at end of file diff --git a/app/assets/stylesheets/static_pages.scss b/app/assets/stylesheets/static_pages.scss new file mode 100644 index 0000000..209ca47 --- /dev/null +++ b/app/assets/stylesheets/static_pages.scss @@ -0,0 +1,21 @@ +// Place all the styles related to the StaticPages controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ + +@import 'scss/lib/mixins'; +@import 'scss/config/colors'; +@import 'scss/config/images'; + +@import 'scss/components/nav'; +@import 'scss/components/profile_header'; +@import 'scss/components/profile_page'; +@import 'scss/components/offcanvas'; +@import 'scss/components/post_form'; +@import 'scss/components/posts_comments'; + +@import 'scss/about'; +@import 'scss/about_edit'; +@import 'scss/friends'; +@import 'scss/news_feed'; +@import 'scss/photos'; +@import 'scss/timeline'; diff --git a/app/controllers/static_pages_controller.rb b/app/controllers/static_pages_controller.rb new file mode 100644 index 0000000..541d324 --- /dev/null +++ b/app/controllers/static_pages_controller.rb @@ -0,0 +1,22 @@ +class StaticPagesController < ApplicationController + def index + end + + def about + end + + def about_edit + end + + def friends + end + + def news_feed + end + + def photos + end + + def timeline + end +end diff --git a/app/helpers/static_pages_helper.rb b/app/helpers/static_pages_helper.rb new file mode 100644 index 0000000..2d63e79 --- /dev/null +++ b/app/helpers/static_pages_helper.rb @@ -0,0 +1,2 @@ +module StaticPagesHelper +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 6bf9efa..17ac4e8 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,14 +1,40 @@ - - Danebook - <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> - <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> - <%= csrf_meta_tags %> - - - -<%= yield %> - - - + + Danebook + + + + + + + + + <%= stylesheet_link_tag 'application', media: 'all' %> + <%= javascript_include_tag 'application' %> + <%= csrf_meta_tags %> + + + + + <%= yield(:styles) %> + + + <%= yield(:nav) %> + + +
+ <%= yield %> +
+ + + + + <%= yield(:scripts) %> + + \ No newline at end of file diff --git a/app/views/shared/_nav.html.erb b/app/views/shared/_nav.html.erb new file mode 100644 index 0000000..4d3b39b --- /dev/null +++ b/app/views/shared/_nav.html.erb @@ -0,0 +1,60 @@ +<% content_for(:nav) do %> + + +<% end %> diff --git a/app/views/shared/_profile_header.html.erb b/app/views/shared/_profile_header.html.erb new file mode 100644 index 0000000..85f5f01 --- /dev/null +++ b/app/views/shared/_profile_header.html.erb @@ -0,0 +1,49 @@ + +
+ + +
+
+
+ + + +
\ No newline at end of file diff --git a/app/views/static_pages/about.html.erb b/app/views/static_pages/about.html.erb new file mode 100644 index 0000000..3906004 --- /dev/null +++ b/app/views/static_pages/about.html.erb @@ -0,0 +1,97 @@ +<%= render :partial => 'shared/nav' %> +<%= render :partial => 'shared/profile_header' %> + + +
+ +
+

+ About +

+
+ + +
+ +
+ + +
+ + +
+
+

+ Basic Information +

+
+
+
+
+
Birthday:
July 31st, 1980
+
College:
Magic School
+
Hometown:
Magicville, Earth
+
Currently Lives:
Magicville, Earth
+
+
+
+
+ + +
+
+

+ Contact Information +

+
+
+
+
+
Email:
harry_potter@hogwarts.edu
+
Telephone:
1-800-DO-MAGIC
+
+
+
+
+
+ + +
+ + +
+
+

+ Words to Live By +

+
+
+

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Placeat qui eligendi tempore enim repellendus perspiciatis molestiae explicabo accusamus autem? Architecto quia velit delectus blanditiis labore, pariatur doloribus quibusdam id praesentium? +

+
+
+ + +
+
+

+ About Me +

+
+
+

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequatur iusto quae ipsam asperiores vero minima adipisci labore voluptates modi officia molestiae tempore fuga et illo provident, eligendi, odit quod veniam. +

+

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus optio, aperiam ea quos maxime magnam veniam autem culpa voluptate dolore ratione corporis dolorum, ducimus porro quia, minima repudiandae. Facilis, totam. +

+
+
+
+ +
+ +
+ +
diff --git a/app/views/static_pages/about_edit.html.erb b/app/views/static_pages/about_edit.html.erb new file mode 100644 index 0000000..36156f9 --- /dev/null +++ b/app/views/static_pages/about_edit.html.erb @@ -0,0 +1,296 @@ +<%= render :partial => 'shared/nav' %> +<%= render :partial => 'shared/profile_header' %> + + +
+ +
+

+ About Edit +

+
+ + +
+ + +
+
+ + +
+ + +
+
+

+ Basic Information +

+
+
+
+ +
+ + +
+ Day + +
+
+ Month + +
+
+ Year + +
+ +
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
+
+ + +
+
+

+ Contact Information +

+
+
+
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+
+
+
+ + +
+ + +
+
+

+ Words to Live By +

+
+
+ +
+
+ + +
+
+

+ About Me +

+
+
+ +
+
+
+ +
+ +
+ +
+
+ +
+ +
diff --git a/app/views/static_pages/friends.html.erb b/app/views/static_pages/friends.html.erb new file mode 100644 index 0000000..5d7b041 --- /dev/null +++ b/app/views/static_pages/friends.html.erb @@ -0,0 +1,163 @@ +<%= render :partial => 'shared/nav' %> +<%= render :partial => 'shared/profile_header' %> + + +
+ +
+

+ Friends +

+
+ + +
+ +
+ + +
+
+
+
+ + Image + +
+
+
+ + Friend's Name + + 432 Friends +
+ +
+
+ +
+
+
+
+ + Image + +
+
+
+ + Friend's Name + + 432 Friends +
+ +
+
+ +
+
+
+
+ + Image + +
+
+
+ + Friend's Name + + 432 Friends +
+ +
+
+ +
+
+
+
+ + Image + +
+
+
+ + Friend's Name + + 432 Friends +
+ +
+
+ +
+
+
+
+ + Image + +
+
+
+ + Friend's Name + + 432 Friends +
+ +
+
+ +
+
+
+
+ + Image + +
+
+
+ + Friend's Name + + 432 Friends +
+ +
+
+ +
+ +
+ +
+ + diff --git a/app/views/static_pages/index.html.erb b/app/views/static_pages/index.html.erb new file mode 100644 index 0000000..d203b44 --- /dev/null +++ b/app/views/static_pages/index.html.erb @@ -0,0 +1,16 @@ +<%= render :partial => 'shared/nav' %> + +
+ + + +
diff --git a/app/views/static_pages/news_feed.html.erb b/app/views/static_pages/news_feed.html.erb new file mode 100644 index 0000000..b8239a2 --- /dev/null +++ b/app/views/static_pages/news_feed.html.erb @@ -0,0 +1,545 @@ +<%= render :partial => 'shared/nav' %> + + +
+ + + + + +
+ +
+ +
+ +
+ + +
+
+

+ Post +

+
+
+
+
+ +
+
+ +
+
+
+
+ + +
+
+
+
+
+ + Image + +
+
+ +
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos eos distinctio ut iusto fuga, soluta. In cupiditate excepturi repudiandae consectetur unde optio, doloribus recusandae amet tenetur nobis sequi, corporis quaerat!

+
+ +
+ + +
+
+
+
+
+ + Image + +
+
+ +
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos eos distinctio ut iusto fuga, soluta. In cupiditate excepturi repudiandae consectetur unde optio, doloribus recusandae amet tenetur nobis sequi, corporis quaerat!

+
+ +
+ + +
+
+
+
+
+ + Image + +
+
+ +
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos eos distinctio ut iusto fuga, soluta. In cupiditate excepturi repudiandae consectetur unde optio, doloribus recusandae amet tenetur nobis sequi, corporis quaerat!

+
+ + + +
+ + +
+
+
+
+
+ + Image + +
+
+
+ + Somebody Else + + +
+
+
+
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos eos distinctio ut iusto fuga, soluta. In cupiditate excepturi repudiandae consectetur unde optio, doloribus recusandae amet tenetur nobis sequi, corporis quaerat!

+
+
+
+ +
+ +
+
+
+
+
+ + Image + +
+
+
+ + Harry Potter + + +
+
+
+
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos eos distinctio ut iusto fuga, soluta. In cupiditate excepturi repudiandae consectetur unde optio, doloribus recusandae amet tenetur nobis sequi, corporis quaerat!

+
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
diff --git a/app/views/static_pages/photos.html.erb b/app/views/static_pages/photos.html.erb new file mode 100644 index 0000000..8030d6a --- /dev/null +++ b/app/views/static_pages/photos.html.erb @@ -0,0 +1,142 @@ +<%= render :partial => 'shared/nav' %> +<%= render :partial => 'shared/profile_header' %> + + +
+ +
+

+ Photos +

+ +
+ + +
+
+ + +
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ Image +
+ Published on July 1, 2015 +
+
+ +
+ +
+
+ +
diff --git a/app/views/static_pages/timeline.html.erb b/app/views/static_pages/timeline.html.erb new file mode 100644 index 0000000..a01b046 --- /dev/null +++ b/app/views/static_pages/timeline.html.erb @@ -0,0 +1,473 @@ +<%= render :partial => 'shared/nav' %> +<%= render :partial => 'shared/profile_header' %> + + +
+ + + + + +
+ +
+ +
+ +
+ + +
+
+

+ Post +

+
+
+
+
+ +
+
+ +
+
+
+
+ + +
+
+
+
+
+ + Image + +
+
+ +
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos eos distinctio ut iusto fuga, soluta. In cupiditate excepturi repudiandae consectetur unde optio, doloribus recusandae amet tenetur nobis sequi, corporis quaerat!

+
+ +
+ + +
+
+
+
+
+ + Image + +
+
+ +
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos eos distinctio ut iusto fuga, soluta. In cupiditate excepturi repudiandae consectetur unde optio, doloribus recusandae amet tenetur nobis sequi, corporis quaerat!

+
+ +
+ + +
+
+
+
+
+ + Image + +
+
+ +
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos eos distinctio ut iusto fuga, soluta. In cupiditate excepturi repudiandae consectetur unde optio, doloribus recusandae amet tenetur nobis sequi, corporis quaerat!

+
+ + + +
+ + +
+
+
+
+
+ + Image + +
+
+
+ + Somebody Else + + +
+
+
+
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos eos distinctio ut iusto fuga, soluta. In cupiditate excepturi repudiandae consectetur unde optio, doloribus recusandae amet tenetur nobis sequi, corporis quaerat!

+
+
+
+ +
+ +
+
+
+
+
+ + Image + +
+
+
+ + Harry Potter + + +
+
+
+
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos eos distinctio ut iusto fuga, soluta. In cupiditate excepturi repudiandae consectetur unde optio, doloribus recusandae amet tenetur nobis sequi, corporis quaerat!

+
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+ + + + diff --git a/config/routes.rb b/config/routes.rb index 3f66539..de843aa 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,13 @@ Rails.application.routes.draw do + get '/home', :to => 'static_pages#index' + get '/about', :to => 'static_pages#about' + get '/about_edit', :to => 'static_pages#about_edit' + get '/friends', :to => 'static_pages#friends' + get '/news_feed', :to => 'static_pages#news_feed' + get '/photos', :to => 'static_pages#photos' + get '/timeline', :to => 'static_pages#timeline' + root :to => 'static_pages#index' + # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". diff --git a/public/assets/_js/offcanvas.js b/public/assets/_js/offcanvas.js new file mode 100644 index 0000000..020b9c9 --- /dev/null +++ b/public/assets/_js/offcanvas.js @@ -0,0 +1,7 @@ +// offcanvas + +$(document).ready(function () { + $('[data-toggle="offcanvas"]').click(function () { + $('.row-offcanvas').toggleClass('active') + }); +}); \ No newline at end of file diff --git a/public/assets/_styles/css/about.css b/public/assets/_styles/css/about.css new file mode 100644 index 0000000..642ccf6 --- /dev/null +++ b/public/assets/_styles/css/about.css @@ -0,0 +1,173 @@ +.clearfix:after, .clearfix:before { + display: table; + content: ""; } +.clearfix:after { + clear: both; } + +#navbar { + position: static; + border-radius: 0; + border: none; + margin: 0; + line-height: 64px; + z-index: 100; + background: #3E76DA; } + #navbar .navbar-brand { + display: block; + height: 100%; + line-height: 32px; } + #navbar .navbar-brand img { + width: 32px; + height: 32px; } + #navbar .navbar-brand span { + font-size: 24px; + padding: 0 8px; + color: #eee; } + #navbar #navbar-search .form-group, + #navbar #navbar-search input { + width: 100%; } + #navbar .navbar-username { + font-size: 18px; + padding-left: 16px; + padding-right: 16px; + text-align: right; } + #navbar .navbar-username a { + color: #eee; } + #navbar .navbar-username { + width: 100%; } + #navbar .navbar-toggle:hover, #navbar .navbar-toggle:focus { + background: #6994e2; } + #navbar .navbar-toggle .icon-bar { + background: #eee; } + #navbar .navbar-brand, + #navbar #navbar-search, + #navbar .navbar-username { + margin: 0; + display: block; + height: 100%; } + #navbar #navbar-collapse, + #navbar #navbar-search { + border-color: #255dc0; } + @media only screen and (max-width: 768px) { + #navbar .navbar-username { + text-align: center; } + #navbar .col-sm-2, + #navbar .col-sm-6 { + padding-left: 0; + padding-right: 0; } } + +@media only screen and (min-width: 768px) { + body { + padding-top: 64px; } + + #navbar { + position: fixed; + top: 0; + right: 0; + left: 0; } } +#profile-header { + position: relative; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; } + #profile-header .profile-image-container, + #profile-header .cover-image-container { + border-radius: 4px; } + #profile-header .cover-image-container { + background: url("../../images/hogwarts_small.jpg") no-repeat; + background-position: center; + background-size: cover; + border-top-left-radius: 0; + border-top-right-radius: 0; + height: 384px; } + #profile-header .profile-image-container { + position: absolute; + width: 192px; + height: 192px; + overflow: hidden; + left: 56px; + bottom: 16px; } + #profile-header .profile-image-container img { + display: block; + width: 192px; } + #profile-header .profile-nav-container { + line-height: 64px; + text-align: center; } + #profile-header .profile-nav-container .current { + color: #111; } + @media only screen and (min-width: 768px) { + #profile-header .profile-nav-container .edit { + text-align: right; } } + @media only screen and (min-width: 992px) and (max-width: 1199px) { + #profile-header .profile-image-container { + left: 32px; } } + @media only screen and (min-width: 768px) and (max-width: 991px) { + #profile-header .profile-image-container { + width: 128px; + height: 128px; + left: 36px; } + #profile-header .profile-image-container img { + width: 128px; } + #profile-header .profile-nav-container div { + padding-left: 4px; + padding-right: 4px; } } + @media only screen and (max-width: 767px) { + #profile-header .profile-image-container { + left: 32px; + top: -75%; } } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-image-container, +#profile-header .profile-nav-container div { + border: 1px solid #d5d5d5; } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-nav-container div { + border-top: none; } + +#profile-header .profile-nav-container div { + border-right: none; + border-bottom: none; } + +@media only screen and (max-width: 767px) { + #profile-header, + #profile-header .cover-image-container, + #profile-header .profile-nav-container div { + border: none; } } +.profile-page-container { + margin-top: 64px; + margin-bottom: 128px; + border: 1px solid #d5d5d5; + border-radius: 4px; } + .profile-page-container .profile-page-header { + border-bottom: 1px solid #d5d5d5; + background: #ddd; } + .profile-page-container .profile-page-header h1 { + text-align: center; } + +#about .about-container { + padding-top: 64px; + padding-bottom: 64px; } +#about .about-info-container dt { + width: 45%; + clear: both; } +#about .about-info-container dt, +#about .about-info-container dd { + margin-top: 16px; + float: left; } +#about .about-info-container p { + text-indent: 2em; } + +@media only screen and (max-width: 767px) { + .about-container h2 { + text-align: center; } + + .about-info-container dt { + width: auto; + margin-right: 5%; + text-align: right; } + .about-info-container dd { + text-align: left; } } + +/*# sourceMappingURL=about.css.map */ diff --git a/public/assets/_styles/css/about.css.map b/public/assets/_styles/css/about.css.map new file mode 100644 index 0000000..11c5608 --- /dev/null +++ b/public/assets/_styles/css/about.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAGC,iCACS;EACR,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;AAEZ,eAAQ;EACP,KAAK,EAAE,IAAI;;ACLb,OAAQ;EACP,QAAQ,EAAE,MAAM;EAChB,aAAa,EAAE,CAAC;EAChB,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,CAAC;EACT,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,GAAG;EACZ,UAAU,ECTD,OAAO;EDehB,qBAAc;IACb,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,IAAI;IAEjB,yBAAI;MACH,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,IAAI;IAGb,0BAAK;MACJ,SAAS,EAAE,IAAI;MACf,OAAO,EAAE,KAAK;MACd,KAAK,EC3BA,IAAI;EDoCV;8BACM;IACL,KAAK,EAAE,IAAI;EAQb,wBAAiB;IAChB,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,KAAK;IAEjB,0BAAE;MACD,KAAK,ECrDA,IAAI;EDyDX,wBAAiB;IAChB,KAAK,EAAE,IAAI;EAQX,0DACQ;IACP,UAAU,EAAE,OAAsB;EAGnC,gCAAU;IACT,UAAU,ECxEL,IAAI;EDgFX;;0BAEiB;IAChB,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,IAAI;EAGb;wBACe;IACd,YAAY,EAAE,OAAqB;EAOpC,yCAA0C;IACzC,wBAAiB;MAChB,UAAU,EAAE,MAAM;IAGnB;qBACU;MACT,YAAY,EAAE,CAAC;MACf,aAAa,EAAE,CAAC;;AASnB,yCAA0C;EACzC,IAAK;IACJ,WAAW,EAAE,IAAI;;EAGlB,OAAQ;IACP,QAAQ,EAAE,KAAK;IACf,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;AEzHT,eAAgB;EACf,QAAQ,EAAE,QAAQ;EAClB,yBAAyB,EAAE,GAAG;EAC9B,0BAA0B,EAAE,GAAG;EAE/B;wCACuB;IACtB,aAAa,EAAE,GAAG;EAOnB,sCAAuB;IACtB,UAAU,EAAE,gDAA2B;IACvC,mBAAmB,EAAE,MAAM;IAC3B,eAAe,EAAE,KAAK;IACtB,sBAAsB,EAAE,CAAC;IACzB,uBAAuB,EAAE,CAAC;IAC1B,MAAM,EAAE,KAAK;EAOd,wCAAyB;IACxB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,KAAK;IACb,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;IAEZ,4CAAI;MACH,OAAO,EAAE,KAAK;MACd,KAAK,EAAE,KAAK;EAQd,sCAAuB;IACtB,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,MAAM;IAElB,+CAAS;MACR,KAAK,EDnDD,IAAI;EC2DV,yCAA0C;IAExC,4CAAM;MACL,UAAU,EAAE,KAAK;EAKpB,iEAAkE;IACjE,wCAAyB;MACxB,IAAI,EAAE,IAAI;EAIZ,gEAAiE;IAChE,wCAAyB;MACxB,KAAK,EAAE,KAAK;MACZ,MAAM,EAAE,KAAK;MACb,IAAI,EAAE,IAAI;MAEV,4CAAI;QACH,KAAK,EAAE,KAAK;IAKb,0CAAI;MACH,YAAY,EAAE,GAAG;MACjB,aAAa,EAAE,GAAG;EAKrB,yCAA0C;IACzC,wCAAyB;MACxB,IAAI,EAAE,IAAI;MACV,GAAG,EAAE,IAAI;;AAUZ;;;0CAG2C;EAC1C,MAAM,EAAE,iBAAiB;;AAE1B;;0CAE2C;EAC1C,UAAU,EAAE,IAAI;;AAEjB,0CAA2C;EAC1C,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;;AAEpB,yCAA0C;EACzC;;4CAE2C;IAC1C,MAAM,EAAE,IAAI;AC5Hd,uBAAwB;EACvB,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,KAAK;EACpB,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,GAAG;EAElB,4CAAqB;IACpB,aAAa,EAAE,iBAAiB;IAChC,UAAU,EAAE,IAAI;IAEhB,+CAAG;MACF,UAAU,EAAE,MAAM;;ACVpB,uBAAiB;EAChB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,IAAI;AAIpB,+BAAG;EACF,KAAK,EAAE,GAAG;EACV,KAAK,EAAE,IAAI;AAEZ;+BACG;EACF,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;AAGZ,8BAAE;EACD,WAAW,EAAE,GAAG;;AAKnB,yCAA0C;EACzC,mBAAoB;IACnB,UAAU,EAAE,MAAM;;EAIlB,wBAAG;IACF,KAAK,EAAE,IAAI;IACX,YAAY,EAAE,EAAE;IAChB,UAAU,EAAE,KAAK;EAElB,wBAAG;IACF,UAAU,EAAE,IAAI", +"sources": ["../scss/lib/_mixins.scss","../scss/components/_nav.scss","../scss/config/_colors.scss","../scss/components/_profile_header.scss","../scss/components/_profile_page.scss","../scss/about.scss"], +"names": [], +"file": "about.css" +} \ No newline at end of file diff --git a/public/assets/_styles/css/about_edit.css b/public/assets/_styles/css/about_edit.css new file mode 100644 index 0000000..09ef19d --- /dev/null +++ b/public/assets/_styles/css/about_edit.css @@ -0,0 +1,158 @@ +.clearfix:after, .clearfix:before { + display: table; + content: ""; } +.clearfix:after { + clear: both; } + +#navbar { + position: static; + border-radius: 0; + border: none; + margin: 0; + line-height: 64px; + z-index: 100; + background: #3E76DA; } + #navbar .navbar-brand { + display: block; + height: 100%; + line-height: 32px; } + #navbar .navbar-brand img { + width: 32px; + height: 32px; } + #navbar .navbar-brand span { + font-size: 24px; + padding: 0 8px; + color: #eee; } + #navbar #navbar-search .form-group, + #navbar #navbar-search input { + width: 100%; } + #navbar .navbar-username { + font-size: 18px; + padding-left: 16px; + padding-right: 16px; + text-align: right; } + #navbar .navbar-username a { + color: #eee; } + #navbar .navbar-username { + width: 100%; } + #navbar .navbar-toggle:hover, #navbar .navbar-toggle:focus { + background: #6994e2; } + #navbar .navbar-toggle .icon-bar { + background: #eee; } + #navbar .navbar-brand, + #navbar #navbar-search, + #navbar .navbar-username { + margin: 0; + display: block; + height: 100%; } + #navbar #navbar-collapse, + #navbar #navbar-search { + border-color: #255dc0; } + @media only screen and (max-width: 768px) { + #navbar .navbar-username { + text-align: center; } + #navbar .col-sm-2, + #navbar .col-sm-6 { + padding-left: 0; + padding-right: 0; } } + +@media only screen and (min-width: 768px) { + body { + padding-top: 64px; } + + #navbar { + position: fixed; + top: 0; + right: 0; + left: 0; } } +#profile-header { + position: relative; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; } + #profile-header .profile-image-container, + #profile-header .cover-image-container { + border-radius: 4px; } + #profile-header .cover-image-container { + background: url("../../images/hogwarts_small.jpg") no-repeat; + background-position: center; + background-size: cover; + border-top-left-radius: 0; + border-top-right-radius: 0; + height: 384px; } + #profile-header .profile-image-container { + position: absolute; + width: 192px; + height: 192px; + overflow: hidden; + left: 56px; + bottom: 16px; } + #profile-header .profile-image-container img { + display: block; + width: 192px; } + #profile-header .profile-nav-container { + line-height: 64px; + text-align: center; } + #profile-header .profile-nav-container .current { + color: #111; } + @media only screen and (min-width: 768px) { + #profile-header .profile-nav-container .edit { + text-align: right; } } + @media only screen and (min-width: 992px) and (max-width: 1199px) { + #profile-header .profile-image-container { + left: 32px; } } + @media only screen and (min-width: 768px) and (max-width: 991px) { + #profile-header .profile-image-container { + width: 128px; + height: 128px; + left: 36px; } + #profile-header .profile-image-container img { + width: 128px; } + #profile-header .profile-nav-container div { + padding-left: 4px; + padding-right: 4px; } } + @media only screen and (max-width: 767px) { + #profile-header .profile-image-container { + left: 32px; + top: -75%; } } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-image-container, +#profile-header .profile-nav-container div { + border: 1px solid #d5d5d5; } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-nav-container div { + border-top: none; } + +#profile-header .profile-nav-container div { + border-right: none; + border-bottom: none; } + +@media only screen and (max-width: 767px) { + #profile-header, + #profile-header .cover-image-container, + #profile-header .profile-nav-container div { + border: none; } } +.profile-page-container { + margin-top: 64px; + margin-bottom: 128px; + border: 1px solid #d5d5d5; + border-radius: 4px; } + .profile-page-container .profile-page-header { + border-bottom: 1px solid #d5d5d5; + background: #ddd; } + .profile-page-container .profile-page-header h1 { + text-align: center; } + +#about-edit textarea.form-control { + height: 196px; } +#about-edit .submit-container { + margin-top: 32px; + margin-bottom: 64px; + text-align: center; } + #about-edit .submit-container .submit { + padding: 16px 32px; } + +/*# sourceMappingURL=about_edit.css.map */ diff --git a/public/assets/_styles/css/about_edit.css.map b/public/assets/_styles/css/about_edit.css.map new file mode 100644 index 0000000..5f8d1e0 --- /dev/null +++ b/public/assets/_styles/css/about_edit.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAGC,iCACS;EACR,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;AAEZ,eAAQ;EACP,KAAK,EAAE,IAAI;;ACLb,OAAQ;EACP,QAAQ,EAAE,MAAM;EAChB,aAAa,EAAE,CAAC;EAChB,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,CAAC;EACT,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,GAAG;EACZ,UAAU,ECTD,OAAO;EDehB,qBAAc;IACb,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,IAAI;IAEjB,yBAAI;MACH,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,IAAI;IAGb,0BAAK;MACJ,SAAS,EAAE,IAAI;MACf,OAAO,EAAE,KAAK;MACd,KAAK,EC3BA,IAAI;EDoCV;8BACM;IACL,KAAK,EAAE,IAAI;EAQb,wBAAiB;IAChB,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,KAAK;IAEjB,0BAAE;MACD,KAAK,ECrDA,IAAI;EDyDX,wBAAiB;IAChB,KAAK,EAAE,IAAI;EAQX,0DACQ;IACP,UAAU,EAAE,OAAsB;EAGnC,gCAAU;IACT,UAAU,ECxEL,IAAI;EDgFX;;0BAEiB;IAChB,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,IAAI;EAGb;wBACe;IACd,YAAY,EAAE,OAAqB;EAOpC,yCAA0C;IACzC,wBAAiB;MAChB,UAAU,EAAE,MAAM;IAGnB;qBACU;MACT,YAAY,EAAE,CAAC;MACf,aAAa,EAAE,CAAC;;AASnB,yCAA0C;EACzC,IAAK;IACJ,WAAW,EAAE,IAAI;;EAGlB,OAAQ;IACP,QAAQ,EAAE,KAAK;IACf,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;AEzHT,eAAgB;EACf,QAAQ,EAAE,QAAQ;EAClB,yBAAyB,EAAE,GAAG;EAC9B,0BAA0B,EAAE,GAAG;EAE/B;wCACuB;IACtB,aAAa,EAAE,GAAG;EAOnB,sCAAuB;IACtB,UAAU,EAAE,gDAA2B;IACvC,mBAAmB,EAAE,MAAM;IAC3B,eAAe,EAAE,KAAK;IACtB,sBAAsB,EAAE,CAAC;IACzB,uBAAuB,EAAE,CAAC;IAC1B,MAAM,EAAE,KAAK;EAOd,wCAAyB;IACxB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,KAAK;IACb,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;IAEZ,4CAAI;MACH,OAAO,EAAE,KAAK;MACd,KAAK,EAAE,KAAK;EAQd,sCAAuB;IACtB,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,MAAM;IAElB,+CAAS;MACR,KAAK,EDnDD,IAAI;EC2DV,yCAA0C;IAExC,4CAAM;MACL,UAAU,EAAE,KAAK;EAKpB,iEAAkE;IACjE,wCAAyB;MACxB,IAAI,EAAE,IAAI;EAIZ,gEAAiE;IAChE,wCAAyB;MACxB,KAAK,EAAE,KAAK;MACZ,MAAM,EAAE,KAAK;MACb,IAAI,EAAE,IAAI;MAEV,4CAAI;QACH,KAAK,EAAE,KAAK;IAKb,0CAAI;MACH,YAAY,EAAE,GAAG;MACjB,aAAa,EAAE,GAAG;EAKrB,yCAA0C;IACzC,wCAAyB;MACxB,IAAI,EAAE,IAAI;MACV,GAAG,EAAE,IAAI;;AAUZ;;;0CAG2C;EAC1C,MAAM,EAAE,iBAAiB;;AAE1B;;0CAE2C;EAC1C,UAAU,EAAE,IAAI;;AAEjB,0CAA2C;EAC1C,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;;AAEpB,yCAA0C;EACzC;;4CAE2C;IAC1C,MAAM,EAAE,IAAI;AC5Hd,uBAAwB;EACvB,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,KAAK;EACpB,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,GAAG;EAElB,4CAAqB;IACpB,aAAa,EAAE,iBAAiB;IAChC,UAAU,EAAE,IAAI;IAEhB,+CAAG;MACF,UAAU,EAAE,MAAM;;ACVpB,iCAAsB;EACrB,MAAM,EAAE,KAAK;AAGd,6BAAkB;EACjB,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI;EACnB,UAAU,EAAE,MAAM;EAElB,qCAAQ;IACP,OAAO,EAAE,SAAS", +"sources": ["../scss/lib/_mixins.scss","../scss/components/_nav.scss","../scss/config/_colors.scss","../scss/components/_profile_header.scss","../scss/components/_profile_page.scss","../scss/about_edit.scss"], +"names": [], +"file": "about_edit.css" +} \ No newline at end of file diff --git a/public/assets/_styles/css/friends.css b/public/assets/_styles/css/friends.css new file mode 100644 index 0000000..a40950b --- /dev/null +++ b/public/assets/_styles/css/friends.css @@ -0,0 +1,169 @@ +.clearfix:after, .clearfix:before { + display: table; + content: ""; } +.clearfix:after { + clear: both; } + +#navbar { + position: static; + border-radius: 0; + border: none; + margin: 0; + line-height: 64px; + z-index: 100; + background: #3E76DA; } + #navbar .navbar-brand { + display: block; + height: 100%; + line-height: 32px; } + #navbar .navbar-brand img { + width: 32px; + height: 32px; } + #navbar .navbar-brand span { + font-size: 24px; + padding: 0 8px; + color: #eee; } + #navbar #navbar-search .form-group, + #navbar #navbar-search input { + width: 100%; } + #navbar .navbar-username { + font-size: 18px; + padding-left: 16px; + padding-right: 16px; + text-align: right; } + #navbar .navbar-username a { + color: #eee; } + #navbar .navbar-username { + width: 100%; } + #navbar .navbar-toggle:hover, #navbar .navbar-toggle:focus { + background: #6994e2; } + #navbar .navbar-toggle .icon-bar { + background: #eee; } + #navbar .navbar-brand, + #navbar #navbar-search, + #navbar .navbar-username { + margin: 0; + display: block; + height: 100%; } + #navbar #navbar-collapse, + #navbar #navbar-search { + border-color: #255dc0; } + @media only screen and (max-width: 768px) { + #navbar .navbar-username { + text-align: center; } + #navbar .col-sm-2, + #navbar .col-sm-6 { + padding-left: 0; + padding-right: 0; } } + +@media only screen and (min-width: 768px) { + body { + padding-top: 64px; } + + #navbar { + position: fixed; + top: 0; + right: 0; + left: 0; } } +#profile-header { + position: relative; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; } + #profile-header .profile-image-container, + #profile-header .cover-image-container { + border-radius: 4px; } + #profile-header .cover-image-container { + background: url("../../images/hogwarts_small.jpg") no-repeat; + background-position: center; + background-size: cover; + border-top-left-radius: 0; + border-top-right-radius: 0; + height: 384px; } + #profile-header .profile-image-container { + position: absolute; + width: 192px; + height: 192px; + overflow: hidden; + left: 56px; + bottom: 16px; } + #profile-header .profile-image-container img { + display: block; + width: 192px; } + #profile-header .profile-nav-container { + line-height: 64px; + text-align: center; } + #profile-header .profile-nav-container .current { + color: #111; } + @media only screen and (min-width: 768px) { + #profile-header .profile-nav-container .edit { + text-align: right; } } + @media only screen and (min-width: 992px) and (max-width: 1199px) { + #profile-header .profile-image-container { + left: 32px; } } + @media only screen and (min-width: 768px) and (max-width: 991px) { + #profile-header .profile-image-container { + width: 128px; + height: 128px; + left: 36px; } + #profile-header .profile-image-container img { + width: 128px; } + #profile-header .profile-nav-container div { + padding-left: 4px; + padding-right: 4px; } } + @media only screen and (max-width: 767px) { + #profile-header .profile-image-container { + left: 32px; + top: -75%; } } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-image-container, +#profile-header .profile-nav-container div { + border: 1px solid #d5d5d5; } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-nav-container div { + border-top: none; } + +#profile-header .profile-nav-container div { + border-right: none; + border-bottom: none; } + +@media only screen and (max-width: 767px) { + #profile-header, + #profile-header .cover-image-container, + #profile-header .profile-nav-container div { + border: none; } } +.profile-page-container { + margin-top: 64px; + margin-bottom: 128px; + border: 1px solid #d5d5d5; + border-radius: 4px; } + .profile-page-container .profile-page-header { + border-bottom: 1px solid #d5d5d5; + background: #ddd; } + .profile-page-container .profile-page-header h1 { + text-align: center; } + +#friends .friend-container { + padding-top: 16px; + padding-bottom: 16px; } +#friends .friend-info-container { + line-height: 48px; } +#friends .unfriend-link-container { + line-height: 96px; } +#friends .profile-image-container { + margin: 0 auto; + width: 96px; + height: 96px; } + #friends .profile-image-container a { + display: block; } + #friends .profile-image-container img { + border-radius: 4px; + width: 96px; } +@media only screen and (max-width: 767px) { + #friends .friend-container { + text-align: center; } } + +/*# sourceMappingURL=friends.css.map */ diff --git a/public/assets/_styles/css/friends.css.map b/public/assets/_styles/css/friends.css.map new file mode 100644 index 0000000..2fb3a47 --- /dev/null +++ b/public/assets/_styles/css/friends.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAGC,iCACS;EACR,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;AAEZ,eAAQ;EACP,KAAK,EAAE,IAAI;;ACLb,OAAQ;EACP,QAAQ,EAAE,MAAM;EAChB,aAAa,EAAE,CAAC;EAChB,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,CAAC;EACT,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,GAAG;EACZ,UAAU,ECTD,OAAO;EDehB,qBAAc;IACb,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,IAAI;IAEjB,yBAAI;MACH,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,IAAI;IAGb,0BAAK;MACJ,SAAS,EAAE,IAAI;MACf,OAAO,EAAE,KAAK;MACd,KAAK,EC3BA,IAAI;EDoCV;8BACM;IACL,KAAK,EAAE,IAAI;EAQb,wBAAiB;IAChB,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,KAAK;IAEjB,0BAAE;MACD,KAAK,ECrDA,IAAI;EDyDX,wBAAiB;IAChB,KAAK,EAAE,IAAI;EAQX,0DACQ;IACP,UAAU,EAAE,OAAsB;EAGnC,gCAAU;IACT,UAAU,ECxEL,IAAI;EDgFX;;0BAEiB;IAChB,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,IAAI;EAGb;wBACe;IACd,YAAY,EAAE,OAAqB;EAOpC,yCAA0C;IACzC,wBAAiB;MAChB,UAAU,EAAE,MAAM;IAGnB;qBACU;MACT,YAAY,EAAE,CAAC;MACf,aAAa,EAAE,CAAC;;AASnB,yCAA0C;EACzC,IAAK;IACJ,WAAW,EAAE,IAAI;;EAGlB,OAAQ;IACP,QAAQ,EAAE,KAAK;IACf,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;AEzHT,eAAgB;EACf,QAAQ,EAAE,QAAQ;EAClB,yBAAyB,EAAE,GAAG;EAC9B,0BAA0B,EAAE,GAAG;EAE/B;wCACuB;IACtB,aAAa,EAAE,GAAG;EAOnB,sCAAuB;IACtB,UAAU,EAAE,gDAA2B;IACvC,mBAAmB,EAAE,MAAM;IAC3B,eAAe,EAAE,KAAK;IACtB,sBAAsB,EAAE,CAAC;IACzB,uBAAuB,EAAE,CAAC;IAC1B,MAAM,EAAE,KAAK;EAOd,wCAAyB;IACxB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,KAAK;IACb,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;IAEZ,4CAAI;MACH,OAAO,EAAE,KAAK;MACd,KAAK,EAAE,KAAK;EAQd,sCAAuB;IACtB,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,MAAM;IAElB,+CAAS;MACR,KAAK,EDnDD,IAAI;EC2DV,yCAA0C;IAExC,4CAAM;MACL,UAAU,EAAE,KAAK;EAKpB,iEAAkE;IACjE,wCAAyB;MACxB,IAAI,EAAE,IAAI;EAIZ,gEAAiE;IAChE,wCAAyB;MACxB,KAAK,EAAE,KAAK;MACZ,MAAM,EAAE,KAAK;MACb,IAAI,EAAE,IAAI;MAEV,4CAAI;QACH,KAAK,EAAE,KAAK;IAKb,0CAAI;MACH,YAAY,EAAE,GAAG;MACjB,aAAa,EAAE,GAAG;EAKrB,yCAA0C;IACzC,wCAAyB;MACxB,IAAI,EAAE,IAAI;MACV,GAAG,EAAE,IAAI;;AAUZ;;;0CAG2C;EAC1C,MAAM,EAAE,iBAAiB;;AAE1B;;0CAE2C;EAC1C,UAAU,EAAE,IAAI;;AAEjB,0CAA2C;EAC1C,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;;AAEpB,yCAA0C;EACzC;;4CAE2C;IAC1C,MAAM,EAAE,IAAI;AC5Hd,uBAAwB;EACvB,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,KAAK;EACpB,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,GAAG;EAElB,4CAAqB;IACpB,aAAa,EAAE,iBAAiB;IAChC,UAAU,EAAE,IAAI;IAEhB,+CAAG;MACF,UAAU,EAAE,MAAM;;ACVpB,0BAAkB;EACjB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,IAAI;AAGrB,+BAAuB;EACtB,WAAW,EAAE,IAAU;AAGxB,iCAAyB;EACxB,WAAW,EAAE,IAAI;AAGlB,iCAAyB;EACxB,MAAM,EAAE,MAAM;EACd,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EAEZ,mCAAE;IACD,OAAO,EAAE,KAAK;EAGf,qCAAI;IACH,aAAa,EAAE,GAAG;IAClB,KAAK,EAAE,IAAI;AAIb,yCAA0C;EACzC,0BAAkB;IACjB,UAAU,EAAE,MAAM", +"sources": ["../scss/lib/_mixins.scss","../scss/components/_nav.scss","../scss/config/_colors.scss","../scss/components/_profile_header.scss","../scss/components/_profile_page.scss","../scss/friends.scss"], +"names": [], +"file": "friends.css" +} \ No newline at end of file diff --git a/public/assets/_styles/css/news_feed.css b/public/assets/_styles/css/news_feed.css new file mode 100644 index 0000000..50e10f4 --- /dev/null +++ b/public/assets/_styles/css/news_feed.css @@ -0,0 +1,355 @@ +.clearfix:after, .clearfix:before { + display: table; + content: ""; } +.clearfix:after { + clear: both; } + +#navbar { + position: static; + border-radius: 0; + border: none; + margin: 0; + line-height: 64px; + z-index: 100; + background: #3E76DA; } + #navbar .navbar-brand { + display: block; + height: 100%; + line-height: 32px; } + #navbar .navbar-brand img { + width: 32px; + height: 32px; } + #navbar .navbar-brand span { + font-size: 24px; + padding: 0 8px; + color: #eee; } + #navbar #navbar-search .form-group, + #navbar #navbar-search input { + width: 100%; } + #navbar .navbar-username { + font-size: 18px; + padding-left: 16px; + padding-right: 16px; + text-align: right; } + #navbar .navbar-username a { + color: #eee; } + #navbar .navbar-username { + width: 100%; } + #navbar .navbar-toggle:hover, #navbar .navbar-toggle:focus { + background: #6994e2; } + #navbar .navbar-toggle .icon-bar { + background: #eee; } + #navbar .navbar-brand, + #navbar #navbar-search, + #navbar .navbar-username { + margin: 0; + display: block; + height: 100%; } + #navbar #navbar-collapse, + #navbar #navbar-search { + border-color: #255dc0; } + @media only screen and (max-width: 768px) { + #navbar .navbar-username { + text-align: center; } + #navbar .col-sm-2, + #navbar .col-sm-6 { + padding-left: 0; + padding-right: 0; } } + +@media only screen and (min-width: 768px) { + body { + padding-top: 64px; } + + #navbar { + position: fixed; + top: 0; + right: 0; + left: 0; } } +#profile-header { + position: relative; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; } + #profile-header .profile-image-container, + #profile-header .cover-image-container { + border-radius: 4px; } + #profile-header .cover-image-container { + background: url("../../images/hogwarts_small.jpg") no-repeat; + background-position: center; + background-size: cover; + border-top-left-radius: 0; + border-top-right-radius: 0; + height: 384px; } + #profile-header .profile-image-container { + position: absolute; + width: 192px; + height: 192px; + overflow: hidden; + left: 56px; + bottom: 16px; } + #profile-header .profile-image-container img { + display: block; + width: 192px; } + #profile-header .profile-nav-container { + line-height: 64px; + text-align: center; } + #profile-header .profile-nav-container .current { + color: #111; } + @media only screen and (min-width: 768px) { + #profile-header .profile-nav-container .edit { + text-align: right; } } + @media only screen and (min-width: 992px) and (max-width: 1199px) { + #profile-header .profile-image-container { + left: 32px; } } + @media only screen and (min-width: 768px) and (max-width: 991px) { + #profile-header .profile-image-container { + width: 128px; + height: 128px; + left: 36px; } + #profile-header .profile-image-container img { + width: 128px; } + #profile-header .profile-nav-container div { + padding-left: 4px; + padding-right: 4px; } } + @media only screen and (max-width: 767px) { + #profile-header .profile-image-container { + left: 32px; + top: -75%; } } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-image-container, +#profile-header .profile-nav-container div { + border: 1px solid #d5d5d5; } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-nav-container div { + border-top: none; } + +#profile-header .profile-nav-container div { + border-right: none; + border-bottom: none; } + +@media only screen and (max-width: 767px) { + #profile-header, + #profile-header .cover-image-container, + #profile-header .profile-nav-container div { + border: none; } } +.profile-page-container { + margin-top: 64px; + margin-bottom: 128px; + border: 1px solid #d5d5d5; + border-radius: 4px; } + .profile-page-container .profile-page-header, .profile-page-container + #post-form-wrapper .post-form-header, + .profile-page-container + #post-form-wrapper .post-form-footer { + border-bottom: 1px solid #d5d5d5; + background: #ddd; } + .profile-page-container .profile-page-header h1, .profile-page-container + #post-form-wrapper .post-form-header h1, + .profile-page-container + #post-form-wrapper .post-form-footer h1 { + text-align: center; } + +/* +* Style tweaks +* -------------------------------------------------- +*/ +body { + overflow-x: hidden; + /* Prevent scroll on narrow devices */ } + +/* +* Off Canvas +* -------------------------------------------------- +*/ +@media screen and (max-width: 767px) { + .row-offcanvas { + position: relative; + -webkit-transition: all .25s ease-out; + -o-transition: all .25s ease-out; + transition: all .25s ease-out; } + + .row-offcanvas-right { + right: 0; } + + .row-offcanvas-left { + left: 0; } + + .row-offcanvas-right + .sidebar-offcanvas { + right: -50%; + /* 6 columns */ } + + .row-offcanvas-left + .sidebar-offcanvas { + left: -50%; + /* 6 columns */ } + + .row-offcanvas-right.active { + right: 50%; + /* 6 columns */ } + + .row-offcanvas-left.active { + left: 50%; + /* 6 columns */ } + + .sidebar-offcanvas { + position: absolute; + top: 0; + width: 50%; + /* 6 columns */ } + + .row-offcanvas-left, + .row-offcanvas-right { + height: 100%; } + + .offcanvas-toggle-container { + margin-bottom: 16px; } } +.profile-page-container +#post-form-wrapper { + border: 1px solid #d5d5d5; + border-radius: 4px; + padding: 0; } + .profile-page-container + #post-form-wrapper .post-form-header h1 { + margin-top: 0; + margin-bottom: 0; } + .profile-page-container + #post-form-wrapper .form-group { + padding: 16px 32px; } + .profile-page-container + #post-form-wrapper textarea.form-control { + max-width: 100%; + height: 128px; + resize: vertical; } + .profile-page-container + #post-form-wrapper .post-form-footer { + text-align: right; + padding: 8px; } + +.post { + margin-top: 32px; + padding-top: 16px; + border: 1px solid #d5d5d5; + border-radius: 4px; } + .post .post-profile-image-container { + margin: 0 auto; + overflow-y: hidden; + width: 64px; + height: 64px; } + .post .post-profile-image-container a { + display: block; } + .post .post-profile-image-container img { + width: 100%; } + @media only screen and (max-width: 767px) { + .post .post-profile-image-container { + width: 48px; + height: 48px; } } + .post .post-info-container a, + .post .post-info-container time { + display: block; } + .post .post-likes { + clear: both; } + .post article { + padding: 8px; } + .post footer { + border-top: 1px solid #d5d5d5; + padding: 8px; } + .post footer:after, .post footer:before { + display: table; + content: ""; } + .post footer:after { + clear: both; } + .post footer .post-footer-links, + .post footer .post-likes { + padding-top: 8px; + padding-bottom: 8px; } + .post footer .delete-link-container { + text-align: right; } + .post footer, + .post .post-comments, + .post .comment, + .post .comment-form-container { + background: #ddd; } + +.comment, +.comment-form-container, +.post footer { + margin-left: -15px; + margin-right: -15px; } + +.comment { + padding-top: 16px; + clear: both; } + +.comment footer, +.comment-form-container footer { + margin-left: 0; + margin-right: 0; } + +.comment-form-container .form-group { + padding: 8px; } + +#news-feed { + margin-top: 0; + border: none; } + #news-feed .news-feed-header, + #news-feed .news-feed-footer { + border-bottom: 1px solid #d5d5d5; + background: #ddd; } + #news-feed .news-feed-header h1, + #news-feed .news-feed-footer h1 { + text-align: center; } + #news-feed .news-feed-container { + border-left: 1px solid #d5d5d5; } + #news-feed .details-container, + #news-feed .news-feed-container { + padding-top: 32px; } + #news-feed .news-feed-container { + padding-left: 8.333333333333%; } + @media only screen and (max-width: 767px) { + #news-feed #profile-avatar { + margin-top: 56px; } + #news-feed .news-feed-container { + padding-left: 30px; + padding-right: 30px; } + #news-feed .details-container { + margin-left: 15px; + margin-right: 15px; } } + +#profile-avatar .profile-image-container { + width: 128px; + height: 128px; + border-radius: 4px; + border: 1px solid #d5d5d5; } + #profile-avatar .profile-image-container a { + display: block; } + #profile-avatar .profile-image-container img { + width: 128px; } +#profile-avatar .profile-avatar-links-container a { + display: block; } +#profile-avatar .profile-avatar-links-container .profile-link { + font-size: 18px; } + +#recently-active .profile-image-container { + width: 64px; + height: 64px; } + #recently-active .profile-image-container a { + display: block; } + #recently-active .profile-image-container img { + width: 64px; } +#recently-active .activity-link-container { + margin-bottom: 16px; } +#recently-active .activity-info-container a, +#recently-active .activity-info-container time { + display: block; } +#recently-active footer { + text-align: center; } + +#profile-avatar .profile-image-container, +#recently-active .profile-image-container { + overflow: hidden; } + +/*# sourceMappingURL=news_feed.css.map */ diff --git a/public/assets/_styles/css/news_feed.css.map b/public/assets/_styles/css/news_feed.css.map new file mode 100644 index 0000000..e2d3aab --- /dev/null +++ b/public/assets/_styles/css/news_feed.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../scss/lib/_mixins.scss","../scss/components/_nav.scss","../scss/config/_colors.scss","../scss/components/_profile_header.scss","../scss/components/_profile_page.scss","../scss/components/_offcanvas.scss","../scss/components/_post_form.scss","../scss/components/_posts_comments.scss","../scss/news_feed.scss"], +"names": [], +"file": "news_feed.css" +} \ No newline at end of file diff --git a/public/assets/_styles/css/photos.css b/public/assets/_styles/css/photos.css new file mode 100644 index 0000000..d817a4a --- /dev/null +++ b/public/assets/_styles/css/photos.css @@ -0,0 +1,190 @@ +.clearfix:after, .clearfix:before { + display: table; + content: ""; } +.clearfix:after { + clear: both; } + +#navbar { + position: static; + border-radius: 0; + border: none; + margin: 0; + line-height: 64px; + z-index: 100; + background: #3E76DA; } + #navbar .navbar-brand { + display: block; + height: 100%; + line-height: 32px; } + #navbar .navbar-brand img { + width: 32px; + height: 32px; } + #navbar .navbar-brand span { + font-size: 24px; + padding: 0 8px; + color: #eee; } + #navbar #navbar-search .form-group, + #navbar #navbar-search input { + width: 100%; } + #navbar .navbar-username { + font-size: 18px; + padding-left: 16px; + padding-right: 16px; + text-align: right; } + #navbar .navbar-username a { + color: #eee; } + #navbar .navbar-username { + width: 100%; } + #navbar .navbar-toggle:hover, #navbar .navbar-toggle:focus { + background: #6994e2; } + #navbar .navbar-toggle .icon-bar { + background: #eee; } + #navbar .navbar-brand, + #navbar #navbar-search, + #navbar .navbar-username { + margin: 0; + display: block; + height: 100%; } + #navbar #navbar-collapse, + #navbar #navbar-search { + border-color: #255dc0; } + @media only screen and (max-width: 768px) { + #navbar .navbar-username { + text-align: center; } + #navbar .col-sm-2, + #navbar .col-sm-6 { + padding-left: 0; + padding-right: 0; } } + +@media only screen and (min-width: 768px) { + body { + padding-top: 64px; } + + #navbar { + position: fixed; + top: 0; + right: 0; + left: 0; } } +#profile-header { + position: relative; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; } + #profile-header .profile-image-container, + #profile-header .cover-image-container { + border-radius: 4px; } + #profile-header .cover-image-container { + background: url("../../images/hogwarts_small.jpg") no-repeat; + background-position: center; + background-size: cover; + border-top-left-radius: 0; + border-top-right-radius: 0; + height: 384px; } + #profile-header .profile-image-container { + position: absolute; + width: 192px; + height: 192px; + overflow: hidden; + left: 56px; + bottom: 16px; } + #profile-header .profile-image-container img { + display: block; + width: 192px; } + #profile-header .profile-nav-container { + line-height: 64px; + text-align: center; } + #profile-header .profile-nav-container .current { + color: #111; } + @media only screen and (min-width: 768px) { + #profile-header .profile-nav-container .edit { + text-align: right; } } + @media only screen and (min-width: 992px) and (max-width: 1199px) { + #profile-header .profile-image-container { + left: 32px; } } + @media only screen and (min-width: 768px) and (max-width: 991px) { + #profile-header .profile-image-container { + width: 128px; + height: 128px; + left: 36px; } + #profile-header .profile-image-container img { + width: 128px; } + #profile-header .profile-nav-container div { + padding-left: 4px; + padding-right: 4px; } } + @media only screen and (max-width: 767px) { + #profile-header .profile-image-container { + left: 32px; + top: -75%; } } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-image-container, +#profile-header .profile-nav-container div { + border: 1px solid #d5d5d5; } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-nav-container div { + border-top: none; } + +#profile-header .profile-nav-container div { + border-right: none; + border-bottom: none; } + +@media only screen and (max-width: 767px) { + #profile-header, + #profile-header .cover-image-container, + #profile-header .profile-nav-container div { + border: none; } } +.profile-page-container { + margin-top: 64px; + margin-bottom: 128px; + border: 1px solid #d5d5d5; + border-radius: 4px; } + .profile-page-container .profile-page-header { + border-bottom: 1px solid #d5d5d5; + background: #ddd; } + .profile-page-container .profile-page-header h1 { + text-align: center; } + +#photos .profile-page-header { + position: relative; } +#photos .add-photo-link-container { + position: absolute; + top: 50%; + right: 16px; + transform: translateY(-50%); } +#photos .photos-container { + margin-left: 0; + margin-right: 0; + padding-left: 15px; + padding-right: 15px; } +#photos .photo-container { + position: relative; + overflow: hidden; + margin-top: 8px; + margin-bottom: 8px; + padding-left: 15px; + padding-right: 15px; } + #photos .photo-container img { + width: 100%; } + #photos .photo-container .pub-date-container { + position: absolute; + text-align: center; + bottom: -50px; + left: 0; + width: 100%; + padding-top: 8px; + padding-bottom: 8px; + background: #111; + color: #eee; } + #photos .photo-container:focus, #photos .photo-container:hover { + border-radius: 4px; + border: 1px solid #111; } + #photos .photo-container:focus .pub-date-container, #photos .photo-container:hover .pub-date-container { + bottom: 0; + -webkit-transition: bottom 0.5s linear; + -moz-transition: bottom 0.5s linear; + -o-transitiion: bottom 0.5s linear; + transition: bottom 0.5s linear; } + +/*# sourceMappingURL=photos.css.map */ diff --git a/public/assets/_styles/css/photos.css.map b/public/assets/_styles/css/photos.css.map new file mode 100644 index 0000000..83ef44c --- /dev/null +++ b/public/assets/_styles/css/photos.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../scss/lib/_mixins.scss","../scss/components/_nav.scss","../scss/config/_colors.scss","../scss/components/_profile_header.scss","../scss/components/_profile_page.scss","../scss/photos.scss"], +"names": [], +"file": "photos.css" +} \ No newline at end of file diff --git a/public/assets/_styles/css/style.css b/public/assets/_styles/css/style.css new file mode 100644 index 0000000..7b0e1a9 --- /dev/null +++ b/public/assets/_styles/css/style.css @@ -0,0 +1,149 @@ +.clearfix:after, .clearfix:before { + display: table; + content: ""; } +.clearfix:after { + clear: both; } + +#navbar { + position: static; + border-radius: 0; + border: none; + margin: 0; + line-height: 64px; + z-index: 100; + background: #3E76DA; } + #navbar .navbar-brand { + display: block; + height: 100%; + line-height: 32px; } + #navbar .navbar-brand img { + width: 32px; + height: 32px; } + #navbar .navbar-brand span { + font-size: 24px; + padding: 0 8px; + color: #eee; } + #navbar #navbar-search .form-group, + #navbar #navbar-search input { + width: 100%; } + #navbar .navbar-username { + font-size: 18px; + padding-left: 16px; + padding-right: 16px; + text-align: right; } + #navbar .navbar-username a { + color: #eee; } + #navbar .navbar-username { + width: 100%; } + #navbar .navbar-toggle:hover, #navbar .navbar-toggle:focus { + background: #6994e2; } + #navbar .navbar-toggle .icon-bar { + background: #eee; } + #navbar .navbar-brand, + #navbar #navbar-search, + #navbar .navbar-username { + margin: 0; + display: block; + height: 100%; } + #navbar #navbar-collapse, + #navbar #navbar-search { + border-color: #255dc0; } + @media only screen and (max-width: 768px) { + #navbar .navbar-username { + text-align: center; } + #navbar .col-sm-2, + #navbar .col-sm-6 { + padding-left: 0; + padding-right: 0; } } + +@media only screen and (min-width: 768px) { + body { + padding-top: 64px; } + + #navbar { + position: fixed; + top: 0; + right: 0; + left: 0; } } +#profile-header { + position: relative; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; } + #profile-header .profile-image-container, + #profile-header .cover-image-container { + border-radius: 4px; } + #profile-header .cover-image-container { + background: url("../../images/hogwarts_small.jpg") no-repeat; + background-position: center; + background-size: cover; + border-top-left-radius: 0; + border-top-right-radius: 0; + height: 384px; } + #profile-header .profile-image-container { + position: absolute; + width: 192px; + height: 192px; + overflow: hidden; + left: 56px; + bottom: 16px; } + #profile-header .profile-image-container img { + display: block; + width: 192px; } + #profile-header .profile-nav-container { + line-height: 64px; + text-align: center; } + #profile-header .profile-nav-container .current { + color: #111; } + @media only screen and (min-width: 768px) { + #profile-header .profile-nav-container .edit { + text-align: right; } } + @media only screen and (min-width: 992px) and (max-width: 1199px) { + #profile-header .profile-image-container { + left: 32px; } } + @media only screen and (min-width: 768px) and (max-width: 991px) { + #profile-header .profile-image-container { + width: 128px; + height: 128px; + left: 36px; } + #profile-header .profile-image-container img { + width: 128px; } + #profile-header .profile-nav-container div { + padding-left: 4px; + padding-right: 4px; } } + @media only screen and (max-width: 767px) { + #profile-header .profile-image-container { + left: 32px; + top: -75%; } } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-image-container, +#profile-header .profile-nav-container div { + border: 1px solid #d5d5d5; } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-nav-container div { + border-top: none; } + +#profile-header .profile-nav-container div { + border-right: none; + border-bottom: none; } + +@media only screen and (max-width: 767px) { + #profile-header, + #profile-header .cover-image-container, + #profile-header .profile-nav-container div { + border: none; } } +.profile-page-container { + margin-top: 64px; + margin-bottom: 128px; + border: 1px solid #d5d5d5; + border-radius: 4px; } + .profile-page-container .profile-page-header { + border-bottom: 1px solid #d5d5d5; + background: #ddd; } + .profile-page-container .profile-page-header h1 { + text-align: center; } + +/*# sourceMappingURL=style.css.map */ diff --git a/public/assets/_styles/css/style.css.map b/public/assets/_styles/css/style.css.map new file mode 100644 index 0000000..ed26e6b --- /dev/null +++ b/public/assets/_styles/css/style.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../scss/lib/_mixins.scss","../scss/components/_nav.scss","../scss/config/_colors.scss","../scss/components/_profile_header.scss","../scss/components/_profile_page.scss"], +"names": [], +"file": "style.css" +} \ No newline at end of file diff --git a/public/assets/_styles/css/timeline.css b/public/assets/_styles/css/timeline.css new file mode 100644 index 0000000..eacc7a5 --- /dev/null +++ b/public/assets/_styles/css/timeline.css @@ -0,0 +1,355 @@ +.clearfix:after, .clearfix:before { + display: table; + content: ""; } +.clearfix:after { + clear: both; } + +#navbar { + position: static; + border-radius: 0; + border: none; + margin: 0; + line-height: 64px; + z-index: 100; + background: #3E76DA; } + #navbar .navbar-brand { + display: block; + height: 100%; + line-height: 32px; } + #navbar .navbar-brand img { + width: 32px; + height: 32px; } + #navbar .navbar-brand span { + font-size: 24px; + padding: 0 8px; + color: #eee; } + #navbar #navbar-search .form-group, + #navbar #navbar-search input { + width: 100%; } + #navbar .navbar-username { + font-size: 18px; + padding-left: 16px; + padding-right: 16px; + text-align: right; } + #navbar .navbar-username a { + color: #eee; } + #navbar .navbar-username { + width: 100%; } + #navbar .navbar-toggle:hover, #navbar .navbar-toggle:focus { + background: #6994e2; } + #navbar .navbar-toggle .icon-bar { + background: #eee; } + #navbar .navbar-brand, + #navbar #navbar-search, + #navbar .navbar-username { + margin: 0; + display: block; + height: 100%; } + #navbar #navbar-collapse, + #navbar #navbar-search { + border-color: #255dc0; } + @media only screen and (max-width: 768px) { + #navbar .navbar-username { + text-align: center; } + #navbar .col-sm-2, + #navbar .col-sm-6 { + padding-left: 0; + padding-right: 0; } } + +@media only screen and (min-width: 768px) { + body { + padding-top: 64px; } + + #navbar { + position: fixed; + top: 0; + right: 0; + left: 0; } } +#profile-header { + position: relative; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; } + #profile-header .profile-image-container, + #profile-header .cover-image-container { + border-radius: 4px; } + #profile-header .cover-image-container { + background: url("../../images/hogwarts_small.jpg") no-repeat; + background-position: center; + background-size: cover; + border-top-left-radius: 0; + border-top-right-radius: 0; + height: 384px; } + #profile-header .profile-image-container { + position: absolute; + width: 192px; + height: 192px; + overflow: hidden; + left: 56px; + bottom: 16px; } + #profile-header .profile-image-container img { + display: block; + width: 192px; } + #profile-header .profile-nav-container { + line-height: 64px; + text-align: center; } + #profile-header .profile-nav-container .current { + color: #111; } + @media only screen and (min-width: 768px) { + #profile-header .profile-nav-container .edit { + text-align: right; } } + @media only screen and (min-width: 992px) and (max-width: 1199px) { + #profile-header .profile-image-container { + left: 32px; } } + @media only screen and (min-width: 768px) and (max-width: 991px) { + #profile-header .profile-image-container { + width: 128px; + height: 128px; + left: 36px; } + #profile-header .profile-image-container img { + width: 128px; } + #profile-header .profile-nav-container div { + padding-left: 4px; + padding-right: 4px; } } + @media only screen and (max-width: 767px) { + #profile-header .profile-image-container { + left: 32px; + top: -75%; } } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-image-container, +#profile-header .profile-nav-container div { + border: 1px solid #d5d5d5; } + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-nav-container div { + border-top: none; } + +#profile-header .profile-nav-container div { + border-right: none; + border-bottom: none; } + +@media only screen and (max-width: 767px) { + #profile-header, + #profile-header .cover-image-container, + #profile-header .profile-nav-container div { + border: none; } } +.profile-page-container { + margin-top: 64px; + margin-bottom: 128px; + border: 1px solid #d5d5d5; + border-radius: 4px; } + .profile-page-container .profile-page-header, .profile-page-container + #post-form-wrapper .post-form-header, + .profile-page-container + #post-form-wrapper .post-form-footer { + border-bottom: 1px solid #d5d5d5; + background: #ddd; } + .profile-page-container .profile-page-header h1, .profile-page-container + #post-form-wrapper .post-form-header h1, + .profile-page-container + #post-form-wrapper .post-form-footer h1 { + text-align: center; } + +/* +* Style tweaks +* -------------------------------------------------- +*/ +body { + overflow-x: hidden; + /* Prevent scroll on narrow devices */ } + +/* +* Off Canvas +* -------------------------------------------------- +*/ +@media screen and (max-width: 767px) { + .row-offcanvas { + position: relative; + -webkit-transition: all .25s ease-out; + -o-transition: all .25s ease-out; + transition: all .25s ease-out; } + + .row-offcanvas-right { + right: 0; } + + .row-offcanvas-left { + left: 0; } + + .row-offcanvas-right + .sidebar-offcanvas { + right: -50%; + /* 6 columns */ } + + .row-offcanvas-left + .sidebar-offcanvas { + left: -50%; + /* 6 columns */ } + + .row-offcanvas-right.active { + right: 50%; + /* 6 columns */ } + + .row-offcanvas-left.active { + left: 50%; + /* 6 columns */ } + + .sidebar-offcanvas { + position: absolute; + top: 0; + width: 50%; + /* 6 columns */ } + + .row-offcanvas-left, + .row-offcanvas-right { + height: 100%; } + + .offcanvas-toggle-container { + margin-bottom: 16px; } } +.profile-page-container +#post-form-wrapper { + border: 1px solid #d5d5d5; + border-radius: 4px; + padding: 0; } + .profile-page-container + #post-form-wrapper .post-form-header h1 { + margin-top: 0; + margin-bottom: 0; } + .profile-page-container + #post-form-wrapper .form-group { + padding: 16px 32px; } + .profile-page-container + #post-form-wrapper textarea.form-control { + max-width: 100%; + height: 128px; + resize: vertical; } + .profile-page-container + #post-form-wrapper .post-form-footer { + text-align: right; + padding: 8px; } + +.post { + margin-top: 32px; + padding-top: 16px; + border: 1px solid #d5d5d5; + border-radius: 4px; } + .post .post-profile-image-container { + margin: 0 auto; + overflow-y: hidden; + width: 64px; + height: 64px; } + .post .post-profile-image-container a { + display: block; } + .post .post-profile-image-container img { + width: 100%; } + @media only screen and (max-width: 767px) { + .post .post-profile-image-container { + width: 48px; + height: 48px; } } + .post .post-info-container a, + .post .post-info-container time { + display: block; } + .post .post-likes { + clear: both; } + .post article { + padding: 8px; } + .post footer { + border-top: 1px solid #d5d5d5; + padding: 8px; } + .post footer:after, .post footer:before { + display: table; + content: ""; } + .post footer:after { + clear: both; } + .post footer .post-footer-links, + .post footer .post-likes { + padding-top: 8px; + padding-bottom: 8px; } + .post footer .delete-link-container { + text-align: right; } + .post footer, + .post .post-comments, + .post .comment, + .post .comment-form-container { + background: #ddd; } + +.comment, +.comment-form-container, +.post footer { + margin-left: -15px; + margin-right: -15px; } + +.comment { + padding-top: 16px; + clear: both; } + +.comment footer, +.comment-form-container footer { + margin-left: 0; + margin-right: 0; } + +.comment-form-container .form-group { + padding: 8px; } + +#timeline { + border: none; } + #timeline .details-header, + #timeline .timeline-header, + #timeline .timeline-footer { + border-bottom: 1px solid #d5d5d5; + background: #ddd; } + #timeline .details-header h1, + #timeline .timeline-header h1, + #timeline .timeline-footer h1 { + text-align: center; } + #timeline #about .about-container:after, #timeline #about .about-container:before, + #timeline #about dl:after, + #timeline #about dl:before { + display: table; + content: ""; } + #timeline #about .about-container:after, + #timeline #about dl:after { + clear: both; } + #timeline #about dt { + width: 45%; + clear: both; } + #timeline #about dt, + #timeline #about dd { + margin-top: 16px; + float: left; } + #timeline #photos img, + #timeline #friends img { + width: 100%; } + #timeline #photos footer, + #timeline #friends footer { + text-align: center; } + #timeline #about, + #timeline #photos, + #timeline #friends { + border: 1px solid #d5d5d5; + border-radius: 4px; + margin-bottom: 32px; + padding: 0 0 16px 0; } + #timeline .details-header h1 { + margin-top: 0; + margin-bottom: 0; } + #timeline .about-container, + #timeline .photos-container, + #timeline .friends-container { + padding: 16px; } + #timeline .photos-container .row div, + #timeline .friends-container .row div { + padding: 16px; } + #timeline .photos-container a { + display: block; } + @media only screen and (max-width: 767px) { + #timeline .details-container { + margin-left: 15px; + margin-right: 15px; } } + +@media only screen and (max-width: 767px) { + #about { + margin-top: 50px; } } + +/*# sourceMappingURL=timeline.css.map */ diff --git a/public/assets/_styles/css/timeline.css.map b/public/assets/_styles/css/timeline.css.map new file mode 100644 index 0000000..b93638e --- /dev/null +++ b/public/assets/_styles/css/timeline.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../scss/lib/_mixins.scss","../scss/components/_nav.scss","../scss/config/_colors.scss","../scss/components/_profile_header.scss","../scss/components/_profile_page.scss","../scss/components/_offcanvas.scss","../scss/components/_post_form.scss","../scss/components/_posts_comments.scss","../scss/timeline.scss"], +"names": [], +"file": "timeline.css" +} \ No newline at end of file diff --git a/public/assets/_styles/scss/about.scss b/public/assets/_styles/scss/about.scss new file mode 100644 index 0000000..7451a2c --- /dev/null +++ b/public/assets/_styles/scss/about.scss @@ -0,0 +1,43 @@ +// about + +@import 'components/base'; + +#about { + .about-container { + padding-top: 64px; + padding-bottom: 64px; + } + + .about-info-container { + dt { + width: 45%; + clear: both; + } + dt, + dd { + margin-top: 16px; + float: left; + } + + p { + text-indent: 2em; + } + } +} + +@media only screen and (max-width: 767px) { + .about-container h2 { + text-align: center; + } + + .about-info-container { + dt { + width: auto; + margin-right: 5%; + text-align: right; + } + dd { + text-align: left; + } + } +} \ No newline at end of file diff --git a/public/assets/_styles/scss/about_edit.scss b/public/assets/_styles/scss/about_edit.scss new file mode 100644 index 0000000..684ebd4 --- /dev/null +++ b/public/assets/_styles/scss/about_edit.scss @@ -0,0 +1,19 @@ +// about edit + +@import 'components/base'; + +#about-edit { + textarea.form-control { + height: 196px; + } + + .submit-container { + margin-top: 32px; + margin-bottom: 64px; + text-align: center; + + .submit { + padding: 16px 32px; + } + } +} \ No newline at end of file diff --git a/public/assets/_styles/scss/components/_base.scss b/public/assets/_styles/scss/components/_base.scss new file mode 100644 index 0000000..0f37cab --- /dev/null +++ b/public/assets/_styles/scss/components/_base.scss @@ -0,0 +1,6 @@ +// base + +@import '../lib/mixins'; +@import 'nav'; +@import 'profile_header'; +@import 'profile_page'; \ No newline at end of file diff --git a/public/assets/_styles/scss/components/_nav.scss b/public/assets/_styles/scss/components/_nav.scss new file mode 100644 index 0000000..010b1ea --- /dev/null +++ b/public/assets/_styles/scss/components/_nav.scss @@ -0,0 +1,130 @@ +// nav + +@import '../config/colors'; + +#navbar { + position: static; + border-radius: 0; + border: none; + margin: 0; + line-height: 64px; + z-index: 100; + background: $primary; + + // -------------------- + // brand + // -------------------- + + .navbar-brand { + display: block; + height: 100%; + line-height: 32px; + + img { + width: 32px; + height: 32px; + } + + span { + font-size: 24px; + padding: 0 8px; + color: $light; + } + } + + // -------------------- + // search + // -------------------- + + #navbar-search { + .form-group, + input { + width: 100%; + } + } + + // -------------------- + // username + // -------------------- + + .navbar-username { + font-size: 18px; + padding-left: 16px; + padding-right: 16px; + text-align: right; + + a { + color: $light; + } + } + + .navbar-username { + width: 100%; + } + + // -------------------- + // toggle + // -------------------- + + .navbar-toggle { + &:hover, + &:focus { + background: lighten($primary, 10%); + } + + .icon-bar { + background: $light; + } + } + + // -------------------- + // shared styles + // -------------------- + + .navbar-brand, + #navbar-search, + .navbar-username { + margin: 0; + display: block; + height: 100%; + } + + #navbar-collapse, + #navbar-search { + border-color: darken($primary, 10%); + } + + // -------------------- + // media queries + // -------------------- + + @media only screen and (max-width: 768px) { + .navbar-username { + text-align: center; + } + + .col-sm-2, + .col-sm-6 { + padding-left: 0; + padding-right: 0; + } + } +} + +// -------------------- +// fixed position +// -------------------- + +@media only screen and (min-width: 768px) { + body { + padding-top: 64px; + } + + #navbar { + position: fixed; + top: 0; + right: 0; + left: 0; + + } +} diff --git a/public/assets/_styles/scss/components/_offcanvas.scss b/public/assets/_styles/scss/components/_offcanvas.scss new file mode 100644 index 0000000..9f56b1d --- /dev/null +++ b/public/assets/_styles/scss/components/_offcanvas.scss @@ -0,0 +1,64 @@ +// offcanvas + +/* +* Style tweaks +* -------------------------------------------------- +*/ + +body { + overflow-x: hidden; /* Prevent scroll on narrow devices */ +} + +/* +* Off Canvas +* -------------------------------------------------- +*/ +@media screen and (max-width: 767px) { + .row-offcanvas { + position: relative; + -webkit-transition: all .25s ease-out; + -o-transition: all .25s ease-out; + transition: all .25s ease-out; + } + + .row-offcanvas-right { + right: 0; + } + + .row-offcanvas-left { + left: 0; + } + + .row-offcanvas-right + .sidebar-offcanvas { + right: -50%; /* 6 columns */ + } + + .row-offcanvas-left + .sidebar-offcanvas { + left: -50%; /* 6 columns */ + } + + .row-offcanvas-right.active { + right: 50%; /* 6 columns */ + } + + .row-offcanvas-left.active { + left: 50%; /* 6 columns */ + } + + .sidebar-offcanvas { + position: absolute; + top: 0; + width: 50%; /* 6 columns */ + } + + .row-offcanvas-left, + .row-offcanvas-right { + height: 100%; + } + + .offcanvas-toggle-container { + margin-bottom: 16px; + } +} \ No newline at end of file diff --git a/public/assets/_styles/scss/components/_post_form.scss b/public/assets/_styles/scss/components/_post_form.scss new file mode 100644 index 0000000..f5bac59 --- /dev/null +++ b/public/assets/_styles/scss/components/_post_form.scss @@ -0,0 +1,37 @@ +// post form + +@import '../config/colors'; + +.profile-page-container + +#post-form-wrapper { + border: 1px solid $border; + border-radius: 4px; + padding: 0; + + .post-form-header { + h1 { + margin-top: 0; + margin-bottom: 0; + } + } + + .post-form-header, + .post-form-footer { + @extend .profile-page-header; + } + + .form-group { + padding: 16px 32px; + } + textarea.form-control { + max-width: 100%; + height: 128px; + resize:vertical; + } + + .post-form-footer { + text-align: right; + padding: 8px; + } +} \ No newline at end of file diff --git a/public/assets/_styles/scss/components/_posts_comments.scss b/public/assets/_styles/scss/components/_posts_comments.scss new file mode 100644 index 0000000..51f4443 --- /dev/null +++ b/public/assets/_styles/scss/components/_posts_comments.scss @@ -0,0 +1,96 @@ +// posts comments + +@import '../config/colors'; + +.post { + margin-top: 32px; + padding-top: 16px; + border: 1px solid $border; + border-radius: 4px; + + .post-profile-image-container { + margin: 0 auto; + overflow-y: hidden; + width: 64px; + height: 64px; + + a { + display: block; + } + + img { + width: 100%; + } + } + + @media only screen and (max-width: 767px) { + .post-profile-image-container { + width: 48px; + height: 48px; + } + } + + .post-info-container { + a, + time { + display: block; + } + } + + .post-likes { + clear: both; + } + + article { + padding: 8px; + } + + footer { + @include clearfix; + border-top: 1px solid $border; + padding: 8px; + + .post-footer-links a { + // + } + + .post-footer-links, + .post-likes { + padding-top: 8px; + padding-bottom: 8px; + } + + .delete-link-container { + text-align: right; + } + } + + footer, + .post-comments, + .comment, + .comment-form-container { + background: #ddd; + } +} + +.comment, +.comment-form-container, +.post footer { + margin-left: -15px; + margin-right: -15px; +} + +.comment { + padding-top: 16px; + clear: both; +} + +.comment footer, +.comment-form-container footer { + margin-left: 0; + margin-right: 0; +} + +.comment-form-container .form-group { + padding: 8px; +} diff --git a/public/assets/_styles/scss/components/_profile_header.scss b/public/assets/_styles/scss/components/_profile_header.scss new file mode 100644 index 0000000..0b92e40 --- /dev/null +++ b/public/assets/_styles/scss/components/_profile_header.scss @@ -0,0 +1,131 @@ +// profile header + +@import '../config/colors'; +@import '../config/images'; + +#profile-header { + position: relative; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + + .profile-image-container, + .cover-image-container { + border-radius: 4px; + } + + // -------------------- + // cover image + // -------------------- + + .cover-image-container { + background: url($cover-image) no-repeat; + background-position: center; + background-size: cover; + border-top-left-radius: 0; + border-top-right-radius: 0; + height: 384px; + } + + // -------------------- + // profile image + // -------------------- + + .profile-image-container { + position: absolute; + width: 192px; + height: 192px; + overflow: hidden; + left: 56px; + bottom: 16px; + + img { + display: block; + width: 192px; + } + } + + // -------------------- + // profile nav + // -------------------- + + .profile-nav-container { + line-height: 64px; + text-align: center; + + .current { + color: $dark; + } + } + + // -------------------- + // media queries + // -------------------- + + @media only screen and (min-width: 768px) { + .profile-nav-container { + .edit { + text-align: right; + } + } + } + + @media only screen and (min-width: 992px) and (max-width: 1199px) { + .profile-image-container { + left: 32px; + } + } + + @media only screen and (min-width: 768px) and (max-width: 991px) { + .profile-image-container { + width: 128px; + height: 128px; + left: 36px; + + img { + width: 128px; + } + } + + .profile-nav-container { + div { + padding-left: 4px; + padding-right: 4px; + } + } + } + + @media only screen and (max-width: 767px) { + .profile-image-container { + left: 32px; + top: -75%; + } + } + +} + +// -------------------- +// borders +// -------------------- + +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-image-container, +#profile-header .profile-nav-container div { + border: 1px solid $border; +} +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-nav-container div { + border-top: none; +} +#profile-header .profile-nav-container div { + border-right: none; + border-bottom: none; +} +@media only screen and (max-width: 767px) { + #profile-header, + #profile-header .cover-image-container, + #profile-header .profile-nav-container div { + border: none; + } +} \ No newline at end of file diff --git a/public/assets/_styles/scss/components/_profile_page.scss b/public/assets/_styles/scss/components/_profile_page.scss new file mode 100644 index 0000000..1a53c2f --- /dev/null +++ b/public/assets/_styles/scss/components/_profile_page.scss @@ -0,0 +1,19 @@ +// profile page + +@import '../config/colors'; + +.profile-page-container { + margin-top: 64px; + margin-bottom: 128px; + border: 1px solid $border; + border-radius: 4px; + + .profile-page-header { + border-bottom: 1px solid $border; + background: #ddd; + + h1 { + text-align: center; + } + } +} \ No newline at end of file diff --git a/public/assets/_styles/scss/config/_colors.scss b/public/assets/_styles/scss/config/_colors.scss new file mode 100644 index 0000000..e8dbe1a --- /dev/null +++ b/public/assets/_styles/scss/config/_colors.scss @@ -0,0 +1,7 @@ +// colors + +$primary: #3E76DA; +$light: #eee; +$dark: #111; + +$border: darken($light, 10%); \ No newline at end of file diff --git a/public/assets/_styles/scss/config/_images.scss b/public/assets/_styles/scss/config/_images.scss new file mode 100644 index 0000000..503b83b --- /dev/null +++ b/public/assets/_styles/scss/config/_images.scss @@ -0,0 +1,3 @@ +// images + +$cover-image: '../../images/hogwarts_small.jpg'; \ No newline at end of file diff --git a/public/assets/_styles/scss/friends.scss b/public/assets/_styles/scss/friends.scss new file mode 100644 index 0000000..0389ae6 --- /dev/null +++ b/public/assets/_styles/scss/friends.scss @@ -0,0 +1,39 @@ +// friends + +@import 'components/base'; + +#friends { + .friend-container { + padding-top: 16px; + padding-bottom: 16px; + } + + .friend-info-container { + line-height: (96px / 2); + } + + .unfriend-link-container { + line-height: 96px; + } + + .profile-image-container { + margin: 0 auto; + width: 96px; + height: 96px; + + a { + display: block; + } + + img { + border-radius: 4px; + width: 96px; + } + } + + @media only screen and (max-width: 767px) { + .friend-container { + text-align: center; + } + } +} \ No newline at end of file diff --git a/public/assets/_styles/scss/lib/_mixins.scss b/public/assets/_styles/scss/lib/_mixins.scss new file mode 100644 index 0000000..ddfda47 --- /dev/null +++ b/public/assets/_styles/scss/lib/_mixins.scss @@ -0,0 +1,22 @@ +// mixins + +@mixin clearfix() { + &:after, + &:before { + display: table; + content: ""; + } + &:after { + clear: both; + } +} +.clearfix { + @include clearfix; +} + +@mixin transition($value) { + -webkit-transition: $value; + -moz-transition: $value; + -o-transitiion: $value; + transition: $value; +} \ No newline at end of file diff --git a/public/assets/_styles/scss/news_feed.scss b/public/assets/_styles/scss/news_feed.scss new file mode 100644 index 0000000..45b2366 --- /dev/null +++ b/public/assets/_styles/scss/news_feed.scss @@ -0,0 +1,114 @@ +// news feed + +@import 'components/base'; +@import 'components/offcanvas'; +@import 'components/post_form'; +@import 'components/posts_comments'; + +#news-feed { + margin-top: 0; + border: none; + + .news-feed-header, + .news-feed-footer { + border-bottom: 1px solid $border; + background: #ddd; + + h1 { + text-align: center; + } + } + + .news-feed-container { + border-left: 1px solid $border; + } + + .details-container, + .news-feed-container { + padding-top: 32px; + } + + .news-feed-container { + padding-left: 8.333333333333%; + } + + @media only screen and (max-width: 767px) { + #profile-avatar { + margin-top: 56px; + } + + .news-feed-container { + padding-left: 30px; + padding-right: 30px; + } + + .details-container { + margin-left: 15px; + margin-right: 15px; + } + } +} + +#profile-avatar { + .profile-image-container { + width: 128px; + height: 128px; + border-radius: 4px; + border: 1px solid $border; + + a { + display: block; + } + + img { + width: 128px; + } + } + + .profile-avatar-links-container { + a { + display: block; + } + .profile-link { + font-size: 18px; + } + } +} + +#recently-active { + .profile-image-container { + width: 64px; + height: 64px; + + a { + display: block; + } + + img { + width: 64px; + } + } + + .activity-link-container { + margin-bottom: 16px; + } + + .activity-info-container { + a, + time { + display: block; + } + } + + footer { + text-align: center; + } +} + +#profile-avatar, +#recently-active { + .profile-image-container { + overflow: hidden; + } +} + diff --git a/public/assets/_styles/scss/photos.scss b/public/assets/_styles/scss/photos.scss new file mode 100644 index 0000000..eda8e94 --- /dev/null +++ b/public/assets/_styles/scss/photos.scss @@ -0,0 +1,59 @@ +// photos + +@import 'components/base'; + +#photos { + .profile-page-header { + position: relative; + } + + .add-photo-link-container { + position: absolute; + top: 50%; + right: 16px; + transform: translateY(-50%); + } + + .photos-container { + margin-left: 0; + margin-right: 0; + padding-left: 15px; + padding-right: 15px; + } + + .photo-container { + position: relative; + overflow: hidden; + margin-top: 8px; + margin-bottom: 8px; + padding-left: 15px; + padding-right: 15px; + + img { + width: 100%; + } + + .pub-date-container { + position: absolute; + text-align: center; + bottom: -50px; + left: 0; + width: 100%; + padding-top: 8px; + padding-bottom: 8px; + background: $dark; + color: $light; + } + + &:focus, + &:hover { + border-radius: 4px; + border: 1px solid $dark; + + .pub-date-container { + bottom: 0; + @include transition(bottom 0.5s linear); + } + } + } +} \ No newline at end of file diff --git a/public/assets/_styles/scss/style.scss b/public/assets/_styles/scss/style.scss new file mode 100644 index 0000000..4b42c84 --- /dev/null +++ b/public/assets/_styles/scss/style.scss @@ -0,0 +1,3 @@ +// style + +@import 'components/base'; \ No newline at end of file diff --git a/public/assets/_styles/scss/timeline.scss b/public/assets/_styles/scss/timeline.scss new file mode 100644 index 0000000..dbba1ff --- /dev/null +++ b/public/assets/_styles/scss/timeline.scss @@ -0,0 +1,98 @@ +// timeline + +@import 'components/base'; +@import 'components/offcanvas'; +@import 'components/post_form'; +@import 'components/posts_comments'; + +#timeline { + border: none; + + .details-header, + .timeline-header, + .timeline-footer { + border-bottom: 1px solid $border; + background: #ddd; + + h1 { + text-align: center; + } + } + + #about { + .about-container, + dl { + @include clearfix; + } + dt { + width: 45%; + clear: both; + } + dt, + dd { + margin-top: 16px; + float: left; + } + } + + #photos, + #friends { + img { + width: 100%; + } + + footer { + text-align: center; + } + } + + #about, + #photos, + #friends { + border: 1px solid $border; + border-radius: 4px; + margin-bottom: 32px; + padding: 0 0 16px 0; + } + + .details-header { + h1 { + margin-top: 0; + margin-bottom: 0; + } + } + + .about-container, + .photos-container, + .friends-container { + padding: 16px; + } + + .photos-container, + .friends-container { + .row { + div { + padding: 16px; + } + } + } + + .photos-container { + a { + display: block; + } + } + + @media only screen and (max-width: 767px) { + .details-container { + margin-left: 15px; + margin-right: 15px; + } + } +} + +@media only screen and (max-width: 767px) { + #about { + margin-top: 50px; + } +} \ No newline at end of file diff --git a/public/assets/images/danish_flag.gif b/public/assets/images/danish_flag.gif new file mode 100644 index 0000000000000000000000000000000000000000..132d8cff8a645f566b9d1c8c25adc571f653d830 GIT binary patch literal 2268 zcmV<22qX7LNk%w1VXpxo0mJ|RN*pBc#LUu9W|5DOavCYf$jDh&SCEg7RY*%tD={n{ zAvPT%^V8URH$&v)Qp>z@TtQEEG-_9{XP5te`$MzgoTEOhjvYfjE#JNkda}6j+K^|m~@JnoSA)+pl6hwq@|{po2ROS zpP{Z|qpPyBv}>ugxNNPjud%tmz_ho)#8tbzp}xh-%#Op&%*V)*%Fx!=ns?aC($kRD z+u`C{&*Qb--ht-p>{sROs_5yW@b&fY_N4OjW#IY$%LS{X7{emyj=Gp>+9Dg;H-jq5iX4KFxJGq7?X8O6|$?vl0j0A zYB^bEuA8BD28H>v#n4MfQ!|YfHB!})O0#b0`Y7y?v&C-BUDj+r-b-r>y$wh<@PER8 z62E%fXL6s*{TOe4Z#VGhXQ|`0&Kvtz?asO9_Wm3E&F4DFqcMM8{A~3H+5dIV8a^!f zG11?&9}#~`{WkFj#&rH|17J)7YE)qVWAvGpAb|^7bD&EPMo7|xEmde?M;M}{;fAL* z_}PabO4MOVB$lYqi6o_{;y^5d9SiI~}pG};qmM>ysP&yF1R=p#EoS|sF<<`g;6 zkw}W8q(n?MX`qdgMJeSqPc~%bmC$6V(3V^VL?vTjhFOf436*JPFlY{>=9<5>3DBEx z;v(libk-@%n1$u3r!05oZnJ2`X%Y4m_XXjrI=cx zDLb5Y>P)3~g(@l|pRQx-sfmyZ*Q%@*lBzkd#tM|HY1L}09#lh8D$cLK;)E+( zzLi(3oyX3V?0U;GyGV1yM*D{Uu;El|Z5!BbqwTh~G^^LM@qr7dxPg&-pSi1ai_N#} zl7lW{>h>3}qVqmh?|}E3ly7DGD%fu+?p_1$z*ZD&&A|v$p)fQIH!Q`&%|t9Q6ck4j zFoYL(kuf(Lcbw_JoP{j1rzDGJ^2wu4dz{50e_RaA9m`A%%@^Ao49*hk3=Gc=`}_;g z2n(GH(E}Te3)1~6ea^}(qndJRP)FUW%hy$HwX9RWruEjhV%^=>VDs9wZDf}n?AgPm zt+ugZkLUK=aoB-C0C?xE_uhQ>?f2h+2QK*Fgcojj-V6l%z~PKH?)c-7M=tr~lvkcN z0tFZl@aCL%?)m4Shc0^mBnD(Y`st{ruKMb%i(b0st;a6=?6lWz`|GynuKVu1_nr~% zz6US-@Wk&9eDTO9ul(}+9?$&q&_^%5B+gH7{q@)@Uw!u6cklh|+kY?q_~dgQe);I9 zuf9R&ukZf*@cYqz{Pfqq{`~gmuYdRW@9+Qr&+8um2S~u+39x_&Od$A7r@#g}@OBJ* zpadtFx&u=1f*ACQ1vALO4tisQ9t@!fApyb>n(%~SC?N`07(x}Y@P!z3Aq;2uKpE2T zh6uDF4tMxJ9rEyp_VXbShxk4r67h)WGa?d~_&p^u@rl@TA{3_>Jt0w{1coFZNx%t6;Vb^G*%Tw z#6?+^(ThC)^qCzs#70jQ(n5?>R3#Vc+{vS}W0>L{J2 z;DIIv4D51`QsDv`A9FY1arOE`TwR9>Rn5rkKzJaQBvZ@=f3MZ|0MO`p8rB`(U zRalO74P0H*S=EqMGp%(fWsNC2Jrq~5&J{&<4dq+8(AF^Rbqjsv(qFX@*eeZ|DS74O zVX;tHDJ}L2jcw9ntq@rxO|~j8eWx2PONGh~iL+DitdBq|1<~e+v{5iEjZg~()xLss6T q*0|2Ku6NDrUi0RTI^bbqA) literal 0 HcmV?d00001 diff --git a/public/assets/images/harry_potter_small.jpg b/public/assets/images/harry_potter_small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d660d77d5774558ed2514cb52ef4972e34aab36 GIT binary patch literal 12773 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 OQPqUisc7r<=l=yD>bA82 literal 0 HcmV?d00001 diff --git a/public/assets/images/hogwarts_small.jpg b/public/assets/images/hogwarts_small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94a8abeff8c8b2c336d837008f00ad9e1c580f13 GIT binary patch literal 73659 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 literal 0 HcmV?d00001 diff --git a/public/assets/images/icon_photo_small.png b/public/assets/images/icon_photo_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0a900d16fb0ee5b0eeb92447a8b48871a29a5c08 GIT binary patch literal 7321 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 jdP{w Date: Thu, 17 Sep 2015 22:40:17 -0400 Subject: [PATCH 3/5] Create signup and test production ENV --- .gitignore | 2 + Gemfile | 14 +- Gemfile.lock | 2 + app/assets/stylesheets/scss/_signup.scss | 42 + .../stylesheets/scss/components/_nav.scss | 19 + app/assets/stylesheets/static_pages.scss | 1 + app/controllers/static_pages_controller.rb | 11 + app/views/shared/_login_form.html.erb | 14 + app/views/shared/_nav.html.erb | 37 +- app/views/shared/_search_form.html.erb | 30 + app/views/static_pages/index.html.erb | 1 + app/views/static_pages/signup.html.erb | 263 + config/database.yml | 8 +- config/initializers/assets.rb | 8 +- config/routes.rb | 1 + config/secrets.yml | 1 + db/schema.rb | 16 + ...fest-a14e8dfbd08c49bf101215d116bb64f4.json | 1 + ...f071d3daeb79b0858738012f7f1478f5d0acd3.css | 855 ++ ...e2303d6915ac47318647a41fe983b9c5e0e8349.js | 9747 +++++++++++++++++ 20 files changed, 11035 insertions(+), 38 deletions(-) create mode 100644 app/assets/stylesheets/scss/_signup.scss create mode 100644 app/views/shared/_login_form.html.erb create mode 100644 app/views/shared/_search_form.html.erb create mode 100644 app/views/static_pages/signup.html.erb create mode 100644 db/schema.rb create mode 100644 public/assets/.sprockets-manifest-a14e8dfbd08c49bf101215d116bb64f4.json create mode 100644 public/assets/application-23096f91c2aeaf5965d7ba6d00f071d3daeb79b0858738012f7f1478f5d0acd3.css create mode 100644 public/assets/application-d8d65358776d2d8dd7ed26204e2303d6915ac47318647a41fe983b9c5e0e8349.js diff --git a/.gitignore b/.gitignore index 050c9d9..181098c 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ /log/* !/log/.keep /tmp + +__SERVER__.sh diff --git a/Gemfile b/Gemfile index 051936c..3484c81 100644 --- a/Gemfile +++ b/Gemfile @@ -1,10 +1,20 @@ source 'https://rubygems.org' + # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.4' -# Use sqlite3 as the database for Active Record -gem 'sqlite3' + +group :development do + # Use sqlite3 as the database for Active Record + gem 'sqlite3' +end + +group :production do + # PostgreSQL for Heroku + gem 'pg' +end + # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets diff --git a/Gemfile.lock b/Gemfile.lock index 983c7fa..1e99083 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -72,6 +72,7 @@ GEM multi_json (1.11.2) nokogiri (1.6.6.2) mini_portile (~> 0.6.0) + pg (0.18.3) rack (1.6.4) rack-test (0.6.3) rack (>= 1.0) @@ -141,6 +142,7 @@ DEPENDENCIES coffee-rails (~> 4.1.0) jbuilder (~> 2.0) jquery-rails + pg rails (= 4.2.4) sass-rails (~> 5.0) sdoc (~> 0.4.0) diff --git a/app/assets/stylesheets/scss/_signup.scss b/app/assets/stylesheets/scss/_signup.scss new file mode 100644 index 0000000..b8700c8 --- /dev/null +++ b/app/assets/stylesheets/scss/_signup.scss @@ -0,0 +1,42 @@ +// signup + +#signup { + margin-bottom: 128px; + + .info { + + .info-list-container { + margin-top: 32px; + } + + .info-list { + li { + font-size: 18px; + margin-top: 32px; + color: #666; + } + } + } + + #signup { + .btn-default { + background: #009E0F; + border: none; + color: #eee; + line-height: 32px; + font-size: 24px; + width: 100%; + + &:hover, + &:focus { + background: darken(#009E0F, 10%); + } + } + } + + @media only screen and (min-width: 768px) { + .info { + margin-top: 64px; + } + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/scss/components/_nav.scss b/app/assets/stylesheets/scss/components/_nav.scss index a8bbf76..48b834a 100644 --- a/app/assets/stylesheets/scss/components/_nav.scss +++ b/app/assets/stylesheets/scss/components/_nav.scss @@ -1,5 +1,7 @@ // nav +// nav + #navbar { position: static; border-radius: 0; @@ -30,6 +32,22 @@ } } + // -------------------- + // login + // -------------------- + + #navbar-signin { + .btn-default { + color: $light; + background: $primary; + + &:hover { + background: $light; + color: $primary; + } + } + } + // -------------------- // search // -------------------- @@ -87,6 +105,7 @@ height: 100%; } + #navbar-signin, #navbar-collapse, #navbar-search { border-color: darken($primary, 10%); diff --git a/app/assets/stylesheets/static_pages.scss b/app/assets/stylesheets/static_pages.scss index 209ca47..39bf643 100644 --- a/app/assets/stylesheets/static_pages.scss +++ b/app/assets/stylesheets/static_pages.scss @@ -18,4 +18,5 @@ @import 'scss/friends'; @import 'scss/news_feed'; @import 'scss/photos'; +@import 'scss/signup'; @import 'scss/timeline'; diff --git a/app/controllers/static_pages_controller.rb b/app/controllers/static_pages_controller.rb index 541d324..2c63ae8 100644 --- a/app/controllers/static_pages_controller.rb +++ b/app/controllers/static_pages_controller.rb @@ -1,4 +1,6 @@ class StaticPagesController < ApplicationController + before_action :simulate_logged_in, :except => [:signup] + def index end @@ -17,6 +19,15 @@ def news_feed def photos end + def signup + session[:logged_in] = false + end + def timeline end + + private + def simulate_logged_in + session[:logged_in] = true + end end diff --git a/app/views/shared/_login_form.html.erb b/app/views/shared/_login_form.html.erb new file mode 100644 index 0000000..d94e1d1 --- /dev/null +++ b/app/views/shared/_login_form.html.erb @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/app/views/shared/_nav.html.erb b/app/views/shared/_nav.html.erb index 4d3b39b..c36580d 100644 --- a/app/views/shared/_nav.html.erb +++ b/app/views/shared/_nav.html.erb @@ -14,7 +14,7 @@ - + Danish Flag Danebook @@ -23,38 +23,9 @@ - - - + + <% partial = session[:logged_in] ? 'search_form' : 'login_form' %> + <%= render :partial => "shared/#{partial}" %> - <% end %> diff --git a/app/views/shared/_search_form.html.erb b/app/views/shared/_search_form.html.erb new file mode 100644 index 0000000..59f70bf --- /dev/null +++ b/app/views/shared/_search_form.html.erb @@ -0,0 +1,30 @@ + + diff --git a/app/views/static_pages/index.html.erb b/app/views/static_pages/index.html.erb index d203b44..7c165fc 100644 --- a/app/views/static_pages/index.html.erb +++ b/app/views/static_pages/index.html.erb @@ -9,6 +9,7 @@
  • Friends
  • News Feed
  • Photos
  • +
  • Signup
  • Timeline
  • diff --git a/app/views/static_pages/signup.html.erb b/app/views/static_pages/signup.html.erb new file mode 100644 index 0000000..e895db1 --- /dev/null +++ b/app/views/static_pages/signup.html.erb @@ -0,0 +1,263 @@ +<%= render :partial => 'shared/nav' %> + +
    + + +
    + +
    + +
    +

    Connect with all your friends!

    +
    + +
    + +
      +
    • See photos and updates in your news feed.
    • +
    • Post your status for the world to see form your profile.
    • +
    • Get in touch with your friends by "friending" them. Hooray!
    • +
    • Like things because you're a positive person.
    • +
    + +
    + +
    +
    + + +
    + +

    Sign Up

    +
    + +
    + + +
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    +

    Birthday

    + +
    + +
    +
    + Day + +
    +
    +
    +
    + Month + +
    +
    +
    +
    + Year + +
    +
    + +
    + +
    + + +
    +
    + Female +
    +
    +
    +
    + Male +
    +
    + +
    + + + +
    + +
    + +
    diff --git a/config/database.yml b/config/database.yml index 1c1a37c..7293862 100644 --- a/config/database.yml +++ b/config/database.yml @@ -21,5 +21,9 @@ test: database: db/test.sqlite3 production: - <<: *default - database: db/production.sqlite3 + adapter: postgresql + encoding: unicode + pool: 5 + database: <%= ENV["DB_NAME"] %> + username: <%= ENV["DB_USERNAME"] %> + host: <%= ENV["DB_HOST"] %> diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 01ef3e6..c73d727 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -1,7 +1,7 @@ # Be sure to restart your server when you modify this file. # Version of your assets, change this if you want to expire all your assets. -Rails.application.config.assets.version = '1.0' +Rails.application.config.assets.version = '1.1' # Add additional assets to the asset load path # Rails.application.config.assets.paths << Emoji.images_path @@ -9,3 +9,9 @@ # Precompile additional assets. # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. # Rails.application.config.assets.precompile += %w( search.js ) + +Rails.application.config.serve_static_assets = true +Rails.application.config.action_dispatch.x_sendfile_header = nil + +Rails.application.config.assets.precompile += %w(static_pages.css) +Rails.application.config.assets.precompile += %w(static_pages.js) \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index de843aa..f01df76 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,6 +5,7 @@ get '/friends', :to => 'static_pages#friends' get '/news_feed', :to => 'static_pages#news_feed' get '/photos', :to => 'static_pages#photos' + get '/signup', :to => 'static_pages#signup' get '/timeline', :to => 'static_pages#timeline' root :to => 'static_pages#index' diff --git a/config/secrets.yml b/config/secrets.yml index 6192c25..c4f56cd 100644 --- a/config/secrets.yml +++ b/config/secrets.yml @@ -19,4 +19,5 @@ test: # Do not keep production secrets in the repository, # instead read values from the environment. production: + secret_token: <%= ENV["SECRET_TOKEN"] %> secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000..4dfbb16 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,16 @@ +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 0) do + +end diff --git a/public/assets/.sprockets-manifest-a14e8dfbd08c49bf101215d116bb64f4.json b/public/assets/.sprockets-manifest-a14e8dfbd08c49bf101215d116bb64f4.json new file mode 100644 index 0000000..254d00e --- /dev/null +++ b/public/assets/.sprockets-manifest-a14e8dfbd08c49bf101215d116bb64f4.json @@ -0,0 +1 @@ +{"files":{"application-d8d65358776d2d8dd7ed26204e2303d6915ac47318647a41fe983b9c5e0e8349.js":{"logical_path":"application.js","mtime":"2015-09-17T20:58:45-04:00","size":267917,"digest":"d8d65358776d2d8dd7ed26204e2303d6915ac47318647a41fe983b9c5e0e8349","integrity":"sha256-2NZTWHdtLY3X7SYgTiMD1pFaxHMYZHpB/pg7nF4Og0k="},"application-23096f91c2aeaf5965d7ba6d00f071d3daeb79b0858738012f7f1478f5d0acd3.css":{"logical_path":"application.css","mtime":"2015-09-17T21:42:16-04:00","size":28949,"digest":"23096f91c2aeaf5965d7ba6d00f071d3daeb79b0858738012f7f1478f5d0acd3","integrity":"sha256-IwlvkcKur1ll17ptAPBx09rrebCFhzgBL38UePXQrNM="}},"assets":{"application.js":"application-d8d65358776d2d8dd7ed26204e2303d6915ac47318647a41fe983b9c5e0e8349.js","application.css":"application-23096f91c2aeaf5965d7ba6d00f071d3daeb79b0858738012f7f1478f5d0acd3.css"}} \ No newline at end of file diff --git a/public/assets/application-23096f91c2aeaf5965d7ba6d00f071d3daeb79b0858738012f7f1478f5d0acd3.css b/public/assets/application-23096f91c2aeaf5965d7ba6d00f071d3daeb79b0858738012f7f1478f5d0acd3.css new file mode 100644 index 0000000..653e19b --- /dev/null +++ b/public/assets/application-23096f91c2aeaf5965d7ba6d00f071d3daeb79b0858738012f7f1478f5d0acd3.css @@ -0,0 +1,855 @@ +/* line 4, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/lib/_mixins.scss */ +.clearfix:after, .clearfix:before { + display: table; + content: ""; +} +/* line 9, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/lib/_mixins.scss */ +.clearfix:after { + clear: both; +} + +/* line 5, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar { + position: static; + border-radius: 0; + border: none; + margin: 0; + line-height: 64px; + z-index: 100; + background: #3E76DA; +} +/* line 18, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar .navbar-brand { + display: block; + height: 100%; + line-height: 32px; +} +/* line 23, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar .navbar-brand img { + width: 32px; + height: 32px; +} +/* line 28, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar .navbar-brand span { + font-size: 24px; + padding: 0 8px; + color: #eee; +} +/* line 40, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar #navbar-signin .btn-default { + color: #eee; + background: #3E76DA; +} +/* line 44, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar #navbar-signin .btn-default:hover { + background: #eee; + color: #3E76DA; +} +/* line 56, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar #navbar-search .form-group, +#navbar #navbar-search input { + width: 100%; +} +/* line 66, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar .navbar-username { + font-size: 18px; + padding-left: 16px; + padding-right: 16px; + text-align: right; +} +/* line 72, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar .navbar-username a { + color: #eee; +} +/* line 77, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar .navbar-username { + width: 100%; +} +/* line 86, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar .navbar-toggle:hover, #navbar .navbar-toggle:focus { + background: #6994e2; +} +/* line 91, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar .navbar-toggle .icon-bar { + background: #eee; +} +/* line 100, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar .navbar-brand, +#navbar #navbar-search, +#navbar .navbar-username { + margin: 0; + display: block; + height: 100%; +} +/* line 108, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ +#navbar #navbar-signin, +#navbar #navbar-collapse, +#navbar #navbar-search { + border-color: #255dc0; +} +@media only screen and (max-width: 768px) { + /* line 119, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ + #navbar .navbar-username { + text-align: center; + } + /* line 123, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ + #navbar .col-sm-2, + #navbar .col-sm-6 { + padding-left: 0; + padding-right: 0; + } +} + +@media only screen and (min-width: 768px) { + /* line 136, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ + body { + padding-top: 64px; + } + + /* line 140, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_nav.scss */ + #navbar { + position: fixed; + top: 0; + right: 0; + left: 0; + } +} +/* line 6, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ +#profile-header { + position: relative; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} +/* line 11, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ +#profile-header .profile-image-container, +#profile-header .cover-image-container { + border-radius: 4px; +} +/* line 20, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ +#profile-header .cover-image-container { + background: url("/assets/images/hogwarts_small.jpg") no-repeat; + background-position: center; + background-size: cover; + border-top-left-radius: 0; + border-top-right-radius: 0; + height: 384px; +} +/* line 33, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ +#profile-header .profile-image-container { + position: absolute; + width: 192px; + height: 192px; + overflow: hidden; + left: 56px; + bottom: 16px; +} +/* line 41, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ +#profile-header .profile-image-container img { + display: block; + width: 192px; +} +/* line 51, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ +#profile-header .profile-nav-container { + line-height: 64px; + text-align: center; +} +/* line 55, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ +#profile-header .profile-nav-container .current { + color: #111; +} +@media only screen and (min-width: 768px) { + /* line 66, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ + #profile-header .profile-nav-container .edit { + text-align: right; + } +} +@media only screen and (min-width: 992px) and (max-width: 1199px) { + /* line 73, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ + #profile-header .profile-image-container { + left: 32px; + } +} +@media only screen and (min-width: 768px) and (max-width: 991px) { + /* line 79, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ + #profile-header .profile-image-container { + width: 128px; + height: 128px; + left: 36px; + } + /* line 84, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ + #profile-header .profile-image-container img { + width: 128px; + } + /* line 90, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ + #profile-header .profile-nav-container div { + padding-left: 4px; + padding-right: 4px; + } +} +@media only screen and (max-width: 767px) { + /* line 98, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ + #profile-header .profile-image-container { + left: 32px; + top: -75%; + } +} + +/* line 110, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-image-container, +#profile-header .profile-nav-container div { + border: 1px solid #d5d5d5; +} + +/* line 116, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ +#profile-header, +#profile-header .cover-image-container, +#profile-header .profile-nav-container div { + border-top: none; +} + +/* line 121, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ +#profile-header .profile-nav-container div { + border-right: none; + border-bottom: none; +} + +@media only screen and (max-width: 767px) { + /* line 126, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_header.scss */ + #profile-header, + #profile-header .cover-image-container, + #profile-header .profile-nav-container div { + border: none; + } +} +/* line 5, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_page.scss */ +.profile-page-container { + margin-top: 64px; + margin-bottom: 128px; + border: 1px solid #d5d5d5; + border-radius: 4px; +} +/* line 11, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_page.scss */ +.profile-page-container .profile-page-header, .profile-page-container +#post-form-wrapper .post-form-header, +.profile-page-container +#post-form-wrapper .post-form-footer { + border-bottom: 1px solid #d5d5d5; + background: #ddd; +} +/* line 15, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_profile_page.scss */ +.profile-page-container .profile-page-header h1, .profile-page-container +#post-form-wrapper .post-form-header h1, +.profile-page-container +#post-form-wrapper .post-form-footer h1 { + text-align: center; +} + +/* +* Style tweaks +* -------------------------------------------------- +*/ +/* line 8, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_offcanvas.scss */ +body { + overflow-x: hidden; + /* Prevent scroll on narrow devices */ +} + +/* +* Off Canvas +* -------------------------------------------------- +*/ +@media screen and (max-width: 767px) { + /* line 17, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_offcanvas.scss */ + .row-offcanvas { + position: relative; + -webkit-transition: all .25s ease-out; + -o-transition: all .25s ease-out; + transition: all .25s ease-out; + } + + /* line 24, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_offcanvas.scss */ + .row-offcanvas-right { + right: 0; + } + + /* line 28, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_offcanvas.scss */ + .row-offcanvas-left { + left: 0; + } + + /* line 32, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_offcanvas.scss */ + .row-offcanvas-right + .sidebar-offcanvas { + right: -50%; + /* 6 columns */ + } + + /* line 37, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_offcanvas.scss */ + .row-offcanvas-left + .sidebar-offcanvas { + left: -50%; + /* 6 columns */ + } + + /* line 42, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_offcanvas.scss */ + .row-offcanvas-right.active { + right: 50%; + /* 6 columns */ + } + + /* line 46, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_offcanvas.scss */ + .row-offcanvas-left.active { + left: 50%; + /* 6 columns */ + } + + /* line 50, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_offcanvas.scss */ + .sidebar-offcanvas { + position: absolute !important; + top: 0; + width: 50%; + /* 6 columns */ + } + + /* line 56, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_offcanvas.scss */ + .row-offcanvas-left, + .row-offcanvas-right { + height: 100%; + } + + /* line 61, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_offcanvas.scss */ + .offcanvas-toggle-container { + margin-bottom: 16px; + } +} +/* line 5, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_post_form.scss */ +.profile-page-container +#post-form-wrapper { + border: 1px solid #d5d5d5; + border-radius: 4px; + padding: 0; +} +/* line 13, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_post_form.scss */ +.profile-page-container +#post-form-wrapper .post-form-header h1 { + margin-top: 0; + margin-bottom: 0; +} +/* line 24, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_post_form.scss */ +.profile-page-container +#post-form-wrapper .form-group { + padding: 16px 32px; +} +/* line 27, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_post_form.scss */ +.profile-page-container +#post-form-wrapper textarea.form-control { + max-width: 100%; + height: 128px; + resize: vertical; +} +/* line 33, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_post_form.scss */ +.profile-page-container +#post-form-wrapper .post-form-footer { + text-align: right; + padding: 8px; +} + +/* line 5, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.post { + margin-top: 32px; + padding-top: 16px; + border: 1px solid #d5d5d5; + border-radius: 4px; +} +/* line 11, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.post .post-profile-image-container { + margin: 0 auto; + overflow-y: hidden; + width: 64px; + height: 64px; +} +/* line 17, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.post .post-profile-image-container a { + display: block; +} +/* line 21, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.post .post-profile-image-container img { + width: 100%; +} +@media only screen and (max-width: 767px) { + /* line 27, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ + .post .post-profile-image-container { + width: 48px; + height: 48px; + } +} +/* line 34, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.post .post-info-container a, +.post .post-info-container time { + display: block; +} +/* line 40, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.post .post-likes { + clear: both; +} +/* line 44, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.post article { + padding: 8px; +} +/* line 48, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.post footer { + border-top: 1px solid #d5d5d5; + padding: 8px; +} +/* line 4, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/lib/_mixins.scss */ +.post footer:after, .post footer:before { + display: table; + content: ""; +} +/* line 9, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/lib/_mixins.scss */ +.post footer:after { + clear: both; +} +/* line 57, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.post footer .post-footer-links, +.post footer .post-likes { + padding-top: 8px; + padding-bottom: 8px; +} +/* line 63, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.post footer .delete-link-container { + text-align: right; +} +/* line 68, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.post footer, +.post .post-comments, +.post .comment, +.post .comment-form-container { + background: #ddd; +} + +/* line 76, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.comment, +.comment-form-container, +.post footer { + margin-left: -15px; + margin-right: -15px; +} + +/* line 83, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.comment { + padding-top: 16px; + clear: both; +} + +/* line 88, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.comment footer, +.comment-form-container footer { + margin-left: 0; + margin-right: 0; +} + +/* line 94, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/components/_posts_comments.scss */ +.comment-form-container .form-group { + padding: 8px; +} + +/* line 4, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_about.scss */ +#about .about-container { + padding-top: 64px; + padding-bottom: 64px; +} +/* line 10, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_about.scss */ +#about .about-info-container dt { + width: 45%; + clear: both; +} +/* line 14, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_about.scss */ +#about .about-info-container dt, +#about .about-info-container dd { + margin-top: 16px; + float: left; +} +/* line 20, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_about.scss */ +#about .about-info-container p { + text-indent: 2em; +} + +@media only screen and (max-width: 767px) { + /* line 27, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_about.scss */ + .about-container h2 { + text-align: center; + } + + /* line 32, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_about.scss */ + .about-info-container dt { + width: auto; + margin-right: 5%; + text-align: right; + } + /* line 37, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_about.scss */ + .about-info-container dd { + text-align: left; + } +} +/* line 4, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_about_edit.scss */ +#about-edit textarea.form-control { + height: 196px; +} +/* line 8, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_about_edit.scss */ +#about-edit .submit-container { + margin-top: 32px; + margin-bottom: 64px; + text-align: center; +} +/* line 13, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_about_edit.scss */ +#about-edit .submit-container .submit { + padding: 16px 32px; +} + +/* line 4, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_friends.scss */ +#friends .friend-container { + padding-top: 16px; + padding-bottom: 16px; +} +/* line 9, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_friends.scss */ +#friends .friend-info-container { + line-height: 48px; +} +/* line 13, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_friends.scss */ +#friends .unfriend-link-container { + line-height: 96px; +} +/* line 17, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_friends.scss */ +#friends .profile-image-container { + margin: 0 auto; + width: 96px; + height: 96px; +} +/* line 22, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_friends.scss */ +#friends .profile-image-container a { + display: block; +} +/* line 26, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_friends.scss */ +#friends .profile-image-container img { + border-radius: 4px; + width: 96px; +} +@media only screen and (max-width: 767px) { + /* line 33, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_friends.scss */ + #friends .friend-container { + text-align: center; + } +} + +/* line 3, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#news-feed { + margin-top: 0; + border: none; +} +/* line 7, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#news-feed .news-feed-header, +#news-feed .news-feed-footer { + border-bottom: 1px solid #d5d5d5; + background: #ddd; +} +/* line 12, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#news-feed .news-feed-header h1, +#news-feed .news-feed-footer h1 { + text-align: center; +} +/* line 17, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#news-feed .news-feed-container { + border-left: 1px solid #d5d5d5; +} +/* line 21, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#news-feed .details-container, +#news-feed .news-feed-container { + padding-top: 32px; +} +/* line 26, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#news-feed .news-feed-container { + padding-left: 8.333333333333%; +} +@media only screen and (max-width: 767px) { + /* line 31, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ + #news-feed #profile-avatar { + margin-top: 56px; + } + /* line 35, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ + #news-feed .news-feed-container { + padding-left: 30px; + padding-right: 30px; + } + /* line 40, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ + #news-feed .details-container { + margin-left: 15px; + margin-right: 15px; + } +} + +/* line 48, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#profile-avatar .profile-image-container { + width: 128px; + height: 128px; + border-radius: 4px; + border: 1px solid #d5d5d5; +} +/* line 54, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#profile-avatar .profile-image-container a { + display: block; +} +/* line 58, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#profile-avatar .profile-image-container img { + width: 128px; +} +/* line 64, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#profile-avatar .profile-avatar-links-container a { + display: block; +} +/* line 67, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#profile-avatar .profile-avatar-links-container .profile-link { + font-size: 18px; +} + +/* line 74, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#recently-active .profile-image-container { + width: 64px; + height: 64px; +} +/* line 78, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#recently-active .profile-image-container a { + display: block; +} +/* line 82, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#recently-active .profile-image-container img { + width: 64px; +} +/* line 87, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#recently-active .activity-link-container { + margin-bottom: 16px; +} +/* line 92, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#recently-active .activity-info-container a, +#recently-active .activity-info-container time { + display: block; +} +/* line 98, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#recently-active footer { + text-align: center; +} + +/* line 105, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_news_feed.scss */ +#profile-avatar .profile-image-container, +#recently-active .profile-image-container { + overflow: hidden; +} + +/* line 4, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_photos.scss */ +#photos .profile-page-header, #photos .profile-page-container +#post-form-wrapper .post-form-header, .profile-page-container +#post-form-wrapper #photos .post-form-header, +#photos .profile-page-container +#post-form-wrapper .post-form-footer, +.profile-page-container +#post-form-wrapper #photos .post-form-footer { + position: relative; +} +/* line 8, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_photos.scss */ +#photos .add-photo-link-container { + position: absolute; + top: 50%; + right: 16px; + transform: translateY(-50%); +} +/* line 15, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_photos.scss */ +#photos .photos-container { + margin-left: 0; + margin-right: 0; + padding-left: 15px; + padding-right: 15px; +} +/* line 22, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_photos.scss */ +#photos .photo-container { + position: relative; + overflow: hidden; + margin-top: 8px; + margin-bottom: 8px; + padding-left: 15px; + padding-right: 15px; +} +/* line 30, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_photos.scss */ +#photos .photo-container img { + width: 100%; +} +/* line 34, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_photos.scss */ +#photos .photo-container .pub-date-container { + position: absolute; + text-align: center; + bottom: -50px; + left: 0; + width: 100%; + padding-top: 8px; + padding-bottom: 8px; + background: #111; + color: #eee; +} +/* line 46, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_photos.scss */ +#photos .photo-container:focus, #photos .photo-container:hover { + border-radius: 4px; + border: 1px solid #111; +} +/* line 51, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_photos.scss */ +#photos .photo-container:focus .pub-date-container, #photos .photo-container:hover .pub-date-container { + bottom: 0; + -webkit-transition: bottom 0.5s linear; + -moz-transition: bottom 0.5s linear; + -o-transitiion: bottom 0.5s linear; + transition: bottom 0.5s linear; +} + +/* line 3, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_signup.scss */ +#signup { + margin-bottom: 128px; +} +/* line 8, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_signup.scss */ +#signup .info .info-list-container { + margin-top: 32px; +} +/* line 13, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_signup.scss */ +#signup .info .info-list li { + font-size: 18px; + margin-top: 32px; + color: #666; +} +/* line 22, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_signup.scss */ +#signup #signup .btn-default { + background: #009E0F; + border: none; + color: #eee; + line-height: 32px; + font-size: 24px; + width: 100%; +} +/* line 30, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_signup.scss */ +#signup #signup .btn-default:hover, #signup #signup .btn-default:focus { + background: #006b0a; +} +@media only screen and (min-width: 768px) { + /* line 38, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_signup.scss */ + #signup .info { + margin-top: 64px; + } +} + +/* line 3, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ +#timeline { + border: none; +} +/* line 6, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ +#timeline .details-header, +#timeline .timeline-header, +#timeline .timeline-footer { + border-bottom: 1px solid #d5d5d5; + background: #ddd; +} +/* line 12, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ +#timeline .details-header h1, +#timeline .timeline-header h1, +#timeline .timeline-footer h1 { + text-align: center; +} +/* line 4, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/lib/_mixins.scss */ +#timeline #about .about-container:after, #timeline #about .about-container:before, +#timeline #about dl:after, +#timeline #about dl:before { + display: table; + content: ""; +} +/* line 9, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/lib/_mixins.scss */ +#timeline #about .about-container:after, +#timeline #about dl:after { + clear: both; +} +/* line 22, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ +#timeline #about dt { + width: 45%; + clear: both; +} +/* line 26, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ +#timeline #about dt, +#timeline #about dd { + margin-top: 16px; + float: left; +} +/* line 35, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ +#timeline #photos img, +#timeline #friends img { + width: 100%; +} +/* line 39, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ +#timeline #photos footer, +#timeline #friends footer { + text-align: center; +} +/* line 44, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ +#timeline #about, +#timeline #photos, +#timeline #friends { + border: 1px solid #d5d5d5; + border-radius: 4px; + margin-bottom: 32px; + padding: 0 0 16px 0; +} +/* line 54, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ +#timeline .details-header h1 { + margin-top: 0; + margin-bottom: 0; +} +/* line 60, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ +#timeline .about-container, +#timeline .photos-container, +#timeline .friends-container { + padding: 16px; +} +/* line 69, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ +#timeline .photos-container .row div, +#timeline .friends-container .row div { + padding: 16px; +} +/* line 76, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ +#timeline .photos-container a { + display: block; +} +@media only screen and (max-width: 767px) { + /* line 82, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ + #timeline .details-container { + margin-left: 15px; + margin-right: 15px; + } +} + +@media only screen and (max-width: 767px) { + /* line 90, /Users/ChrisScavello/Desktop/danebook/app/assets/stylesheets/scss/_timeline.scss */ + #about { + margin-top: 50px; + } +} +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, + * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any styles + * defined in the other CSS/SCSS files in this directory. It is generally better to create a new + * file per style scope. + * + + + */ + diff --git a/public/assets/application-d8d65358776d2d8dd7ed26204e2303d6915ac47318647a41fe983b9c5e0e8349.js b/public/assets/application-d8d65358776d2d8dd7ed26204e2303d6915ac47318647a41fe983b9c5e0e8349.js new file mode 100644 index 0000000..e2eb670 --- /dev/null +++ b/public/assets/application-d8d65358776d2d8dd7ed26204e2303d6915ac47318647a41fe983b9c5e0e8349.js @@ -0,0 +1,9747 @@ +/*! + * jQuery JavaScript Library v2.1.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-04-28T16:01Z + */ + + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// + +var arr = []; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + version = "2.1.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; + }, + + isPlainObject: function( obj ) { + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.constructor && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + + // If the function hasn't returned already, we're confident that + // |obj| is a plain object, created by {} or constructed with new Object + return true; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + // Support: Android<4.0, iOS<6 (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + var script, + indirect = eval; + + code = jQuery.trim( code ); + + if ( code ) { + // If the code includes a valid, prologue position + // strict mode pragma, execute code by injecting a + // script tag into the document. + if ( code.indexOf("use strict") === 1 ) { + script = document.createElement("script"); + script.text = code; + document.head.appendChild( script ).parentNode.removeChild( script ); + } else { + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + indirect( code ); + } + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE9-11+ + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + nodeType = context.nodeType; + + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + if ( !seed && documentIsHTML ) { + + // Try to shortcut find operations when possible (e.g., not under DocumentFragment) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType !== 1 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + parent = doc.defaultView; + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Support tests + ---------------------------------------------------------------------- */ + documentIsHTML = !isXML( doc ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; + }); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + len = this.length, + ret = [], + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +}); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Support: Blackberry 4.6 + // gEBID returns nodes no longer in the document (#6963) + if ( elem && elem.parentNode ) { + // Inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof rootjQuery.ready !== "undefined" ? + rootjQuery.ready( selector ) : + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.extend({ + dir: function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; + }, + + sibling: function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; + } +}); + +jQuery.fn.extend({ + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter(function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.unique( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return elem.contentDocument || jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.unique( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +}); +var rnotwhite = (/\S+/g); + + + +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // Add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // If we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +}); + +/** + * The ready event handler and self cleanup method + */ +function completed() { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + jQuery.ready(); +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // We once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + } else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + len ? fn( elems[0], key ) : emptyGet; +}; + + +/** + * Determines whether an object can have data + */ +jQuery.acceptData = function( owner ) { + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + /* jshint -W018 */ + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + +function Data() { + // Support: Android<4, + // Old WebKit does not have Object.preventExtensions/freeze method, + // return new empty object instead with no [[set]] accessor + Object.defineProperty( this.cache = {}, 0, { + get: function() { + return {}; + } + }); + + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; +Data.accepts = jQuery.acceptData; + +Data.prototype = { + key: function( owner ) { + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return the key for a frozen object. + if ( !Data.accepts( owner ) ) { + return 0; + } + + var descriptor = {}, + // Check if the owner object already has a cache key + unlock = owner[ this.expando ]; + + // If not, create one + if ( !unlock ) { + unlock = Data.uid++; + + // Secure it in a non-enumerable, non-writable property + try { + descriptor[ this.expando ] = { value: unlock }; + Object.defineProperties( owner, descriptor ); + + // Support: Android<4 + // Fallback to a less secure definition + } catch ( e ) { + descriptor[ this.expando ] = unlock; + jQuery.extend( owner, descriptor ); + } + } + + // Ensure the cache object + if ( !this.cache[ unlock ] ) { + this.cache[ unlock ] = {}; + } + + return unlock; + }, + set: function( owner, data, value ) { + var prop, + // There may be an unlock assigned to this node, + // if there is no entry for this "owner", create one inline + // and set the unlock as though an owner entry had always existed + unlock = this.key( owner ), + cache = this.cache[ unlock ]; + + // Handle: [ owner, key, value ] args + if ( typeof data === "string" ) { + cache[ data ] = value; + + // Handle: [ owner, { properties } ] args + } else { + // Fresh assignments by object are shallow copied + if ( jQuery.isEmptyObject( cache ) ) { + jQuery.extend( this.cache[ unlock ], data ); + // Otherwise, copy the properties one-by-one to the cache object + } else { + for ( prop in data ) { + cache[ prop ] = data[ prop ]; + } + } + } + return cache; + }, + get: function( owner, key ) { + // Either a valid cache is found, or will be created. + // New caches will be created and the unlock returned, + // allowing direct access to the newly created + // empty data object. A valid owner object must be provided. + var cache = this.cache[ this.key( owner ) ]; + + return key === undefined ? + cache : cache[ key ]; + }, + access: function( owner, key, value ) { + var stored; + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ((key && typeof key === "string") && value === undefined) ) { + + stored = this.get( owner, key ); + + return stored !== undefined ? + stored : this.get( owner, jQuery.camelCase(key) ); + } + + // [*]When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, name, camel, + unlock = this.key( owner ), + cache = this.cache[ unlock ]; + + if ( key === undefined ) { + this.cache[ unlock ] = {}; + + } else { + // Support array or space separated string of keys + if ( jQuery.isArray( key ) ) { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = key.concat( key.map( jQuery.camelCase ) ); + } else { + camel = jQuery.camelCase( key ); + // Try the string as a key before any manipulation + if ( key in cache ) { + name = [ key, camel ]; + } else { + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + name = camel; + name = name in cache ? + [ name ] : ( name.match( rnotwhite ) || [] ); + } + } + + i = name.length; + while ( i-- ) { + delete cache[ name[ i ] ]; + } + } + }, + hasData: function( owner ) { + return !jQuery.isEmptyObject( + this.cache[ owner[ this.expando ] ] || {} + ); + }, + discard: function( owner ) { + if ( owner[ this.expando ] ) { + delete this.cache[ owner[ this.expando ] ]; + } + } +}; +var data_priv = new Data(); + +var data_user = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + data_user.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend({ + hasData: function( elem ) { + return data_user.hasData( elem ) || data_priv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return data_user.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + data_user.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to data_priv methods, these can be deprecated. + _data: function( elem, name, data ) { + return data_priv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + data_priv.remove( elem, name ); + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = data_user.get( elem ); + + if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + data_priv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + data_user.set( this, key ); + }); + } + + return access( this, function( value ) { + var data, + camelKey = jQuery.camelCase( key ); + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + // Attempt to get data from the cache + // with the key as-is + data = data_user.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to get data from the cache + // with the key camelized + data = data_user.get( elem, camelKey ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, camelKey, undefined ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each(function() { + // First, attempt to store a copy or reference of any + // data that might've been store with a camelCased key. + var data = data_user.get( this, camelKey ); + + // For HTML5 data-* attribute interop, we have to + // store property names with dashes in a camelCase form. + // This might not apply to all properties...* + data_user.set( this, camelKey, value ); + + // *... In the case of properties that might _actually_ + // have dashes, we need to also store a copy of that + // unchanged property. + if ( key.indexOf("-") !== -1 && data !== undefined ) { + data_user.set( this, key, value ); + } + }); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each(function() { + data_user.remove( this, key ); + }); + } +}); + + +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = data_priv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = data_priv.access( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return data_priv.get( elem, key ) || data_priv.access( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + data_priv.remove( elem, [ type + "queue", key ] ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = data_priv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + }; + +var rcheckableType = (/^(?:checkbox|radio)$/i); + + + +(function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Safari<=5.1 + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari<=5.1, Android<4.2 + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<=11+ + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +})(); +var strundefined = typeof undefined; + + + +support.focusinBubbles = "onfocusin" in window; + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.hasData( elem ) && data_priv.get( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + data_priv.remove( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.disabled !== true || event.type !== "click" ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: Cordova 2.5 (WebKit) (#13255) + // All events should have a target; Cordova deviceready doesn't + if ( !event.target ) { + event.target = document; + } + + // Support: Safari 6.0+, Chrome<28 + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } +}; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: Android<4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && e.preventDefault ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && e.stopPropagation ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// Support: Chrome 15+ +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// Support: Firefox, Chrome, Safari +// Create "bubbling" focus and blur events +if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = data_priv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = data_priv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + data_priv.remove( doc, fix ); + + } else { + data_priv.access( doc, fix, attaches ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); + + +var + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rhtml = /<|&#?\w+;/, + rnoInnerhtml = /<(?:script|style|link)/i, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /^$|\/(?:java|ecma)script/i, + rscriptTypeMasked = /^true\/(.*)/, + rcleanScript = /^\s*\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + + // Support: IE9 + option: [ 1, "" ], + + thead: [ 1, "", "
    " ], + col: [ 2, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + _default: [ 0, "", "" ] + }; + +// Support: IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: 1.x compatibility +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute("type"); + } + + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + data_priv.set( + elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) + ); + } +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( data_priv.hasData( src ) ) { + pdataOld = data_priv.access( src ); + pdataCur = data_priv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( data_user.hasData( src ) ) { + udataOld = data_user.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + data_user.set( dest, udataCur ); + } +} + +function getAll( context, tag ) { + var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : + context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + // Support: QtWebKit, PhantomJS + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: QtWebKit, PhantomJS + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; + }, + + cleanData: function( elems ) { + var data, elem, type, key, + special = jQuery.event.special, + i = 0; + + for ( ; (elem = elems[ i ]) !== undefined; i++ ) { + if ( jQuery.acceptData( elem ) ) { + key = elem[ data_priv.expando ]; + + if ( key && (data = data_priv.cache[ key ]) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + if ( data_priv.cache[ key ] ) { + // Discard any remaining `private` data + delete data_priv.cache[ key ]; + } + } + } + // Discard any remaining `user` data + delete data_user.cache[ elem[ data_user.expando ] ]; + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each(function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + }); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + } + } + } + } + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optimization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "