diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000..d8d80e1e93
Binary files /dev/null and b/.DS_Store differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000..616df6d332
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# 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 all logfiles and tempfiles.
+/log/*
+/tmp/*
+!/log/.keep
+!/tmp/.keep
+
+/node_modules
+/yarn-error.log
+
+.byebug_history
+
+.env
+
+/coverage.data
+/coverage/
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000000..b4d8003eab
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,73 @@
+source 'https://rubygems.org'
+
+git_source(:github) do |repo_name|
+ repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
+ "https://github.com/#{repo_name}.git"
+end
+
+
+# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
+gem 'rails', '~> 5.1.4'
+# Use postgresql as the database for Active Record
+gem 'pg', '~> 0.18'
+# Use Puma as the app server
+gem 'puma', '~> 3.7'
+# Use SCSS for stylesheets
+gem 'sass-rails', '~> 5.0'
+# Use Uglifier as compressor for JavaScript assets
+gem 'uglifier', '>= 1.3.0'
+# See https://github.com/rails/execjs#readme for more supported runtimes
+# gem 'therubyracer', platforms: :ruby
+
+# Use CoffeeScript for .coffee assets and views
+# gem 'coffee-rails', '~> 4.2'
+# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
+gem 'turbolinks', '~> 5'
+# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
+gem 'jbuilder', '~> 2.5'
+# Use Redis adapter to run Action Cable in production
+# gem 'redis', '~> 3.0'
+# Use ActiveModel has_secure_password
+# gem 'bcrypt', '~> 3.1.7'
+
+# Use Capistrano for deployment
+# gem 'capistrano-rails', group: :development
+gem "omniauth"
+gem "omniauth-github"
+gem 'foundation-rails', '6.4.1.2'
+
+group :development, :test do
+ # Call 'byebug' anywhere in the code to stop execution and get a debugger console
+ gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
+ # Adds support for Capybara system testing and selenium driver
+ gem 'capybara', '~> 2.13'
+ gem 'selenium-webdriver'
+ gem 'pry-rails'
+
+end
+
+group :development do
+ # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
+ gem 'web-console', '>= 3.3.0'
+ gem 'listen', '>= 3.0.5', '< 3.2'
+ # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
+ gem 'spring'
+ gem 'spring-watcher-listen', '~> 2.0.0'
+ gem 'dotenv-rails'
+end
+
+# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
+gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
+
+gem 'jquery-turbolinks'
+group :development do
+ gem 'better_errors'
+ gem 'pry-rails'
+ gem 'binding_of_caller'
+end
+
+group :test do
+ gem 'minitest-rails'
+ gem 'minitest-reporters'
+ gem 'simplecov'
+end
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000000..0a3526384f
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,268 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ actioncable (5.1.4)
+ actionpack (= 5.1.4)
+ nio4r (~> 2.0)
+ websocket-driver (~> 0.6.1)
+ actionmailer (5.1.4)
+ actionpack (= 5.1.4)
+ actionview (= 5.1.4)
+ activejob (= 5.1.4)
+ mail (~> 2.5, >= 2.5.4)
+ rails-dom-testing (~> 2.0)
+ actionpack (5.1.4)
+ actionview (= 5.1.4)
+ activesupport (= 5.1.4)
+ rack (~> 2.0)
+ rack-test (>= 0.6.3)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
+ actionview (5.1.4)
+ activesupport (= 5.1.4)
+ builder (~> 3.1)
+ erubi (~> 1.4)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
+ activejob (5.1.4)
+ activesupport (= 5.1.4)
+ globalid (>= 0.3.6)
+ activemodel (5.1.4)
+ activesupport (= 5.1.4)
+ activerecord (5.1.4)
+ activemodel (= 5.1.4)
+ activesupport (= 5.1.4)
+ arel (~> 8.0)
+ activesupport (5.1.4)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (~> 0.7)
+ minitest (~> 5.1)
+ tzinfo (~> 1.1)
+ addressable (2.5.2)
+ public_suffix (>= 2.0.2, < 4.0)
+ ansi (1.5.0)
+ arel (8.0.0)
+ babel-source (5.8.35)
+ babel-transpiler (0.7.0)
+ babel-source (>= 4.0, < 6)
+ execjs (~> 2.0)
+ better_errors (2.4.0)
+ coderay (>= 1.0.0)
+ erubi (>= 1.0.0)
+ rack (>= 0.9.0)
+ bindex (0.5.0)
+ binding_of_caller (0.7.2)
+ debug_inspector (>= 0.0.1)
+ builder (3.2.3)
+ byebug (9.1.0)
+ capybara (2.15.4)
+ addressable
+ mini_mime (>= 0.1.3)
+ nokogiri (>= 1.3.3)
+ rack (>= 1.0.0)
+ rack-test (>= 0.5.4)
+ xpath (~> 2.0)
+ childprocess (0.8.0)
+ ffi (~> 1.0, >= 1.0.11)
+ coderay (1.1.2)
+ concurrent-ruby (1.0.5)
+ crass (1.0.2)
+ debug_inspector (0.0.3)
+ docile (1.1.5)
+ dotenv (2.2.1)
+ dotenv-rails (2.2.1)
+ dotenv (= 2.2.1)
+ railties (>= 3.2, < 5.2)
+ erubi (1.7.0)
+ execjs (2.7.0)
+ faraday (0.12.2)
+ multipart-post (>= 1.2, < 3)
+ ffi (1.9.18)
+ foundation-rails (6.4.1.2)
+ railties (>= 3.1.0)
+ sass (>= 3.3.0, < 3.5)
+ sprockets-es6 (>= 0.9.0)
+ globalid (0.4.0)
+ activesupport (>= 4.2.0)
+ hashie (3.5.6)
+ i18n (0.9.0)
+ concurrent-ruby (~> 1.0)
+ jbuilder (2.7.0)
+ activesupport (>= 4.2.0)
+ multi_json (>= 1.2)
+ jquery-turbolinks (2.1.0)
+ railties (>= 3.1.0)
+ turbolinks
+ json (2.1.0)
+ jwt (1.5.6)
+ listen (3.1.5)
+ rb-fsevent (~> 0.9, >= 0.9.4)
+ rb-inotify (~> 0.9, >= 0.9.7)
+ ruby_dep (~> 1.2)
+ loofah (2.1.1)
+ crass (~> 1.0.2)
+ nokogiri (>= 1.5.9)
+ mail (2.6.6)
+ mime-types (>= 1.16, < 4)
+ method_source (0.9.0)
+ mime-types (3.1)
+ mime-types-data (~> 3.2015)
+ mime-types-data (3.2016.0521)
+ mini_mime (0.1.4)
+ mini_portile2 (2.3.0)
+ minitest (5.10.3)
+ minitest-rails (3.0.0)
+ minitest (~> 5.8)
+ railties (~> 5.0)
+ minitest-reporters (1.1.18)
+ ansi
+ builder
+ minitest (>= 5.0)
+ ruby-progressbar
+ multi_json (1.12.2)
+ multi_xml (0.6.0)
+ multipart-post (2.0.0)
+ nio4r (2.1.0)
+ nokogiri (1.8.1)
+ mini_portile2 (~> 2.3.0)
+ oauth2 (1.4.0)
+ faraday (>= 0.8, < 0.13)
+ jwt (~> 1.0)
+ multi_json (~> 1.3)
+ multi_xml (~> 0.5)
+ rack (>= 1.2, < 3)
+ omniauth (1.7.1)
+ hashie (>= 3.4.6, < 3.6.0)
+ rack (>= 1.6.2, < 3)
+ omniauth-github (1.3.0)
+ omniauth (~> 1.5)
+ omniauth-oauth2 (>= 1.4.0, < 2.0)
+ omniauth-oauth2 (1.4.0)
+ oauth2 (~> 1.0)
+ omniauth (~> 1.2)
+ pg (0.21.0)
+ pry (0.11.2)
+ coderay (~> 1.1.0)
+ method_source (~> 0.9.0)
+ pry-rails (0.3.6)
+ pry (>= 0.10.4)
+ public_suffix (3.0.0)
+ puma (3.10.0)
+ rack (2.0.3)
+ rack-test (0.7.0)
+ rack (>= 1.0, < 3)
+ rails (5.1.4)
+ actioncable (= 5.1.4)
+ actionmailer (= 5.1.4)
+ actionpack (= 5.1.4)
+ actionview (= 5.1.4)
+ activejob (= 5.1.4)
+ activemodel (= 5.1.4)
+ activerecord (= 5.1.4)
+ activesupport (= 5.1.4)
+ bundler (>= 1.3.0)
+ railties (= 5.1.4)
+ sprockets-rails (>= 2.0.0)
+ rails-dom-testing (2.0.3)
+ activesupport (>= 4.2.0)
+ nokogiri (>= 1.6)
+ rails-html-sanitizer (1.0.3)
+ loofah (~> 2.0)
+ railties (5.1.4)
+ actionpack (= 5.1.4)
+ activesupport (= 5.1.4)
+ method_source
+ rake (>= 0.8.7)
+ thor (>= 0.18.1, < 2.0)
+ rake (12.1.0)
+ rb-fsevent (0.10.2)
+ rb-inotify (0.9.10)
+ ffi (>= 0.5.0, < 2)
+ ruby-progressbar (1.9.0)
+ ruby_dep (1.5.0)
+ rubyzip (1.2.1)
+ sass (3.4.25)
+ sass-rails (5.0.6)
+ railties (>= 4.0.0, < 6)
+ sass (~> 3.1)
+ sprockets (>= 2.8, < 4.0)
+ sprockets-rails (>= 2.0, < 4.0)
+ tilt (>= 1.1, < 3)
+ selenium-webdriver (3.6.0)
+ childprocess (~> 0.5)
+ rubyzip (~> 1.0)
+ simplecov (0.15.1)
+ docile (~> 1.1.0)
+ json (>= 1.8, < 3)
+ simplecov-html (~> 0.10.0)
+ simplecov-html (0.10.2)
+ spring (2.0.2)
+ activesupport (>= 4.2)
+ spring-watcher-listen (2.0.1)
+ listen (>= 2.7, < 4.0)
+ spring (>= 1.2, < 3.0)
+ sprockets (3.7.1)
+ concurrent-ruby (~> 1.0)
+ rack (> 1, < 3)
+ sprockets-es6 (0.9.2)
+ babel-source (>= 5.8.11)
+ babel-transpiler
+ sprockets (>= 3.0.0)
+ sprockets-rails (3.2.1)
+ actionpack (>= 4.0)
+ activesupport (>= 4.0)
+ sprockets (>= 3.0.0)
+ thor (0.20.0)
+ thread_safe (0.3.6)
+ tilt (2.0.8)
+ turbolinks (5.0.1)
+ turbolinks-source (~> 5)
+ turbolinks-source (5.0.3)
+ tzinfo (1.2.3)
+ thread_safe (~> 0.1)
+ uglifier (3.2.0)
+ execjs (>= 0.3.0, < 3)
+ web-console (3.5.1)
+ actionview (>= 5.0)
+ activemodel (>= 5.0)
+ bindex (>= 0.4.0)
+ railties (>= 5.0)
+ websocket-driver (0.6.5)
+ websocket-extensions (>= 0.1.0)
+ websocket-extensions (0.1.2)
+ xpath (2.1.0)
+ nokogiri (~> 1.3)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ better_errors
+ binding_of_caller
+ byebug
+ capybara (~> 2.13)
+ dotenv-rails
+ foundation-rails (= 6.4.1.2)
+ jbuilder (~> 2.5)
+ jquery-turbolinks
+ listen (>= 3.0.5, < 3.2)
+ minitest-rails
+ minitest-reporters
+ omniauth
+ omniauth-github
+ pg (~> 0.18)
+ pry-rails
+ puma (~> 3.7)
+ rails (~> 5.1.4)
+ sass-rails (~> 5.0)
+ selenium-webdriver
+ simplecov
+ spring
+ spring-watcher-listen (~> 2.0.0)
+ turbolinks (~> 5)
+ tzinfo-data
+ uglifier (>= 1.3.0)
+ web-console (>= 3.3.0)
+
+BUNDLED WITH
+ 1.16.0.pre.3
diff --git a/Rakefile b/Rakefile
new file mode 100644
index 0000000000..e85f913914
--- /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_relative 'config/application'
+
+Rails.application.load_tasks
diff --git a/app/.DS_Store b/app/.DS_Store
new file mode 100644
index 0000000000..d74d729f43
Binary files /dev/null and b/app/.DS_Store differ
diff --git a/app/assets/.DS_Store b/app/assets/.DS_Store
new file mode 100644
index 0000000000..10f526f8e4
Binary files /dev/null and b/app/assets/.DS_Store differ
diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js
new file mode 100644
index 0000000000..b16e53d6d5
--- /dev/null
+++ b/app/assets/config/manifest.js
@@ -0,0 +1,3 @@
+//= link_tree ../images
+//= link_directory ../javascripts .js
+//= link_directory ../stylesheets .css
diff --git a/app/assets/font/BungeeInline-Regular.eot b/app/assets/font/BungeeInline-Regular.eot
new file mode 100755
index 0000000000..65187a8e57
Binary files /dev/null and b/app/assets/font/BungeeInline-Regular.eot differ
diff --git a/app/assets/font/BungeeInline-Regular.otf b/app/assets/font/BungeeInline-Regular.otf
new file mode 100755
index 0000000000..404beaeea4
Binary files /dev/null and b/app/assets/font/BungeeInline-Regular.otf differ
diff --git a/app/assets/font/BungeeInline-Regular.svg b/app/assets/font/BungeeInline-Regular.svg
new file mode 100755
index 0000000000..2d8c9a6306
--- /dev/null
+++ b/app/assets/font/BungeeInline-Regular.svg
@@ -0,0 +1,9115 @@
+
+
+
diff --git a/app/assets/font/BungeeInline-Regular.ttf b/app/assets/font/BungeeInline-Regular.ttf
new file mode 100755
index 0000000000..6dbd5e1963
Binary files /dev/null and b/app/assets/font/BungeeInline-Regular.ttf differ
diff --git a/app/assets/font/BungeeInline-Regular.woff b/app/assets/font/BungeeInline-Regular.woff
new file mode 100755
index 0000000000..0b872dd3f8
Binary files /dev/null and b/app/assets/font/BungeeInline-Regular.woff differ
diff --git a/app/assets/font/STARWARS.eot b/app/assets/font/STARWARS.eot
new file mode 100755
index 0000000000..a5acc30e28
Binary files /dev/null and b/app/assets/font/STARWARS.eot differ
diff --git a/app/assets/font/STARWARS.svg b/app/assets/font/STARWARS.svg
new file mode 100755
index 0000000000..d1011700b3
--- /dev/null
+++ b/app/assets/font/STARWARS.svg
@@ -0,0 +1,499 @@
+
+
+
diff --git a/app/assets/font/STARWARS.ttf b/app/assets/font/STARWARS.ttf
new file mode 100755
index 0000000000..d1d0c7e987
Binary files /dev/null and b/app/assets/font/STARWARS.ttf differ
diff --git a/app/assets/font/STARWARS.woff b/app/assets/font/STARWARS.woff
new file mode 100755
index 0000000000..867cf399e4
Binary files /dev/null and b/app/assets/font/STARWARS.woff differ
diff --git a/app/assets/images/.DS_Store b/app/assets/images/.DS_Store
new file mode 100644
index 0000000000..5008ddfcf5
Binary files /dev/null and b/app/assets/images/.DS_Store differ
diff --git a/app/assets/images/.keep b/app/assets/images/.keep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/app/assets/images/admiral-ackbar.png b/app/assets/images/admiral-ackbar.png
new file mode 100644
index 0000000000..5781380fef
Binary files /dev/null and b/app/assets/images/admiral-ackbar.png differ
diff --git a/app/assets/images/boba-fett.png b/app/assets/images/boba-fett.png
new file mode 100644
index 0000000000..1b85a7ab47
Binary files /dev/null and b/app/assets/images/boba-fett.png differ
diff --git a/app/assets/images/c3p0.png b/app/assets/images/c3p0.png
new file mode 100644
index 0000000000..9e2d54b1ba
Binary files /dev/null and b/app/assets/images/c3p0.png differ
diff --git a/app/assets/images/chewbacca.png b/app/assets/images/chewbacca.png
new file mode 100644
index 0000000000..a46e9595d5
Binary files /dev/null and b/app/assets/images/chewbacca.png differ
diff --git a/app/assets/images/clone-trooper.png b/app/assets/images/clone-trooper.png
new file mode 100644
index 0000000000..e5bca7e466
Binary files /dev/null and b/app/assets/images/clone-trooper.png differ
diff --git a/app/assets/images/darth-maul.png b/app/assets/images/darth-maul.png
new file mode 100644
index 0000000000..77d0feee0c
Binary files /dev/null and b/app/assets/images/darth-maul.png differ
diff --git a/app/assets/images/darth-vader-faith.jpg b/app/assets/images/darth-vader-faith.jpg
new file mode 100644
index 0000000000..a00b4ba9af
Binary files /dev/null and b/app/assets/images/darth-vader-faith.jpg differ
diff --git a/app/assets/images/darth-vader.png b/app/assets/images/darth-vader.png
new file mode 100644
index 0000000000..0f2c2e749f
Binary files /dev/null and b/app/assets/images/darth-vader.png differ
diff --git a/app/assets/images/emperor-palpatine.png b/app/assets/images/emperor-palpatine.png
new file mode 100644
index 0000000000..641f293ab3
Binary files /dev/null and b/app/assets/images/emperor-palpatine.png differ
diff --git a/app/assets/images/ep_naturalblack.png b/app/assets/images/ep_naturalblack.png
new file mode 100644
index 0000000000..e600af5848
Binary files /dev/null and b/app/assets/images/ep_naturalblack.png differ
diff --git a/app/assets/images/ewok.png b/app/assets/images/ewok.png
new file mode 100644
index 0000000000..58af6569d3
Binary files /dev/null and b/app/assets/images/ewok.png differ
diff --git a/app/assets/images/favicon_red.png b/app/assets/images/favicon_red.png
new file mode 100644
index 0000000000..3c54deffc2
Binary files /dev/null and b/app/assets/images/favicon_red.png differ
diff --git a/app/assets/images/greedo.png b/app/assets/images/greedo.png
new file mode 100644
index 0000000000..85d8082134
Binary files /dev/null and b/app/assets/images/greedo.png differ
diff --git a/app/assets/images/han-solo.png b/app/assets/images/han-solo.png
new file mode 100644
index 0000000000..538ae4a34b
Binary files /dev/null and b/app/assets/images/han-solo.png differ
diff --git a/app/assets/images/hero.jpg b/app/assets/images/hero.jpg
new file mode 100644
index 0000000000..d75e717589
Binary files /dev/null and b/app/assets/images/hero.jpg differ
diff --git a/app/assets/images/jabba-the-hutt.png b/app/assets/images/jabba-the-hutt.png
new file mode 100644
index 0000000000..08a4606ac0
Binary files /dev/null and b/app/assets/images/jabba-the-hutt.png differ
diff --git a/app/assets/images/jango-fett.png b/app/assets/images/jango-fett.png
new file mode 100644
index 0000000000..30609eacd2
Binary files /dev/null and b/app/assets/images/jango-fett.png differ
diff --git a/app/assets/images/jawa.png b/app/assets/images/jawa.png
new file mode 100644
index 0000000000..f69f7e1525
Binary files /dev/null and b/app/assets/images/jawa.png differ
diff --git a/app/assets/images/lando-calrissian.png b/app/assets/images/lando-calrissian.png
new file mode 100644
index 0000000000..23347f0550
Binary files /dev/null and b/app/assets/images/lando-calrissian.png differ
diff --git a/app/assets/images/lightsaber-darth-vader.png b/app/assets/images/lightsaber-darth-vader.png
new file mode 100644
index 0000000000..9d03b6fdcc
Binary files /dev/null and b/app/assets/images/lightsaber-darth-vader.png differ
diff --git a/app/assets/images/lightsaber-luke-anh.png b/app/assets/images/lightsaber-luke-anh.png
new file mode 100644
index 0000000000..e99d2035ce
Binary files /dev/null and b/app/assets/images/lightsaber-luke-anh.png differ
diff --git a/app/assets/images/lightsaber-luke-rotj.png b/app/assets/images/lightsaber-luke-rotj.png
new file mode 100644
index 0000000000..5cc18eb3a9
Binary files /dev/null and b/app/assets/images/lightsaber-luke-rotj.png differ
diff --git a/app/assets/images/lobot.png b/app/assets/images/lobot.png
new file mode 100644
index 0000000000..88f25d6ac5
Binary files /dev/null and b/app/assets/images/lobot.png differ
diff --git a/app/assets/images/luke-skywalker.png b/app/assets/images/luke-skywalker.png
new file mode 100644
index 0000000000..053b2bb6e6
Binary files /dev/null and b/app/assets/images/luke-skywalker.png differ
diff --git a/app/assets/images/obiwan-kenobi.png b/app/assets/images/obiwan-kenobi.png
new file mode 100644
index 0000000000..ae43f25f97
Binary files /dev/null and b/app/assets/images/obiwan-kenobi.png differ
diff --git a/app/assets/images/princess-leia.png b/app/assets/images/princess-leia.png
new file mode 100644
index 0000000000..308a5535cd
Binary files /dev/null and b/app/assets/images/princess-leia.png differ
diff --git a/app/assets/images/qui-gon-jinn.png b/app/assets/images/qui-gon-jinn.png
new file mode 100644
index 0000000000..b922f1d166
Binary files /dev/null and b/app/assets/images/qui-gon-jinn.png differ
diff --git a/app/assets/images/r2d2.png b/app/assets/images/r2d2.png
new file mode 100644
index 0000000000..ce051d3aab
Binary files /dev/null and b/app/assets/images/r2d2.png differ
diff --git a/app/assets/images/red-five.png b/app/assets/images/red-five.png
new file mode 100644
index 0000000000..0e2f2c48ae
Binary files /dev/null and b/app/assets/images/red-five.png differ
diff --git a/app/assets/images/stardust.png b/app/assets/images/stardust.png
new file mode 100644
index 0000000000..288a7d2062
Binary files /dev/null and b/app/assets/images/stardust.png differ
diff --git a/app/assets/images/stormtrooper.png b/app/assets/images/stormtrooper.png
new file mode 100644
index 0000000000..84006d6ade
Binary files /dev/null and b/app/assets/images/stormtrooper.png differ
diff --git a/app/assets/images/tusken-raider.png b/app/assets/images/tusken-raider.png
new file mode 100644
index 0000000000..121e7e2f47
Binary files /dev/null and b/app/assets/images/tusken-raider.png differ
diff --git a/app/assets/images/yoda.png b/app/assets/images/yoda.png
new file mode 100644
index 0000000000..1362c5af6b
Binary files /dev/null and b/app/assets/images/yoda.png differ
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
new file mode 100644
index 0000000000..c805d90718
--- /dev/null
+++ b/app/assets/javascripts/application.js
@@ -0,0 +1,70 @@
+// 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, 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. JavaScript code in this file should be added after the last require_* statement.
+//
+// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
+// about supported directives.
+//
+//= require rails-ujs
+//= require foundation
+//= require turbolinks
+//= require_tree .
+
+// $(function(){ $(document).foundation(); });
+//
+// StarWars = (function() {
+//
+// /*
+// * Constructor
+// */
+// function StarWars(args) {
+// // Context wrapper
+// this.el = $(args.el);
+//
+// // Audio to play the opening crawl
+// this.audio = this.el.find('audio').get(0);
+//
+// // Start the animation
+// this.start = this.el.find('.start');
+//
+// // The animation wrapper
+// this.animation = this.el.find('.animation');
+//
+// // Remove animation and shows the start screen
+// this.reset();
+//
+// // Start the animation on click
+// this.start.bind('click', $.proxy(function() {
+// this.start.hide();
+// this.audio.play();
+// this.el.append(this.animation);
+// }, this));
+//
+// // Reset the animation and shows the start screen
+// $(this.audio).bind('ended', $.proxy(function() {
+// this.audio.currentTime = 0;
+// this.reset();
+// }, this));
+// }
+//
+// /*
+// * Resets the animation and shows the start screen.
+// */
+// StarWars.prototype.reset = function() {
+// this.start.show();
+// this.cloned = this.animation.clone(true);
+// this.animation.remove();
+// this.animation = this.cloned;
+// };
+//
+// return StarWars;
+// })();
+//
+// new StarWars({
+// el : '.starwars'
+// });
diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js
new file mode 100644
index 0000000000..739aa5f022
--- /dev/null
+++ b/app/assets/javascripts/cable.js
@@ -0,0 +1,13 @@
+// Action Cable provides the framework to deal with WebSockets in Rails.
+// You can generate new channels where WebSocket features live using the `rails generate channel` command.
+//
+//= require action_cable
+//= require_self
+//= require_tree ./channels
+
+(function() {
+ this.App || (this.App = {});
+
+ App.cable = ActionCable.createConsumer();
+
+}).call(this);
diff --git a/app/assets/javascripts/carts.js b/app/assets/javascripts/carts.js
new file mode 100644
index 0000000000..dee720facd
--- /dev/null
+++ b/app/assets/javascripts/carts.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/javascripts/categories.js b/app/assets/javascripts/categories.js
new file mode 100644
index 0000000000..dee720facd
--- /dev/null
+++ b/app/assets/javascripts/categories.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/javascripts/channels/.keep b/app/assets/javascripts/channels/.keep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js
new file mode 100644
index 0000000000..dee720facd
--- /dev/null
+++ b/app/assets/javascripts/main.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/javascripts/merchants.js b/app/assets/javascripts/merchants.js
new file mode 100644
index 0000000000..dee720facd
--- /dev/null
+++ b/app/assets/javascripts/merchants.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/javascripts/order_items.js b/app/assets/javascripts/order_items.js
new file mode 100644
index 0000000000..dee720facd
--- /dev/null
+++ b/app/assets/javascripts/order_items.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/javascripts/orders.js b/app/assets/javascripts/orders.js
new file mode 100644
index 0000000000..dee720facd
--- /dev/null
+++ b/app/assets/javascripts/orders.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/javascripts/payments.js b/app/assets/javascripts/payments.js
new file mode 100644
index 0000000000..dee720facd
--- /dev/null
+++ b/app/assets/javascripts/payments.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/javascripts/products.js b/app/assets/javascripts/products.js
new file mode 100644
index 0000000000..dee720facd
--- /dev/null
+++ b/app/assets/javascripts/products.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/javascripts/reviews.js b/app/assets/javascripts/reviews.js
new file mode 100644
index 0000000000..dee720facd
--- /dev/null
+++ b/app/assets/javascripts/reviews.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/javascripts/sessions.js b/app/assets/javascripts/sessions.js
new file mode 100644
index 0000000000..dee720facd
--- /dev/null
+++ b/app/assets/javascripts/sessions.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss
new file mode 100644
index 0000000000..39ba680c03
--- /dev/null
+++ b/app/assets/stylesheets/_settings.scss
@@ -0,0 +1,862 @@
+// Foundation for Sites Settings
+// -----------------------------
+//
+// Table of Contents:
+//
+// 1. Global
+// 2. Breakpoints
+// 3. The Grid
+// 4. Base Typography
+// 5. Typography Helpers
+// 6. Abide
+// 7. Accordion
+// 8. Accordion Menu
+// 9. Badge
+// 10. Breadcrumbs
+// 11. Button
+// 12. Button Group
+// 13. Callout
+// 14. Card
+// 15. Close Button
+// 16. Drilldown
+// 17. Dropdown
+// 18. Dropdown Menu
+// 19. Flexbox Utilities
+// 20. Forms
+// 21. Label
+// 22. Media Object
+// 23. Menu
+// 24. Meter
+// 25. Off-canvas
+// 26. Orbit
+// 27. Pagination
+// 28. Progress Bar
+// 29. Prototype Arrow
+// 30. Prototype Border-Box
+// 31. Prototype Border-None
+// 32. Prototype Bordered
+// 33. Prototype Display
+// 34. Prototype Font-Styling
+// 35. Prototype List-Style-Type
+// 36. Prototype Overflow
+// 37. Prototype Position
+// 38. Prototype Rounded
+// 39. Prototype Separator
+// 40. Prototype Shadow
+// 41. Prototype Sizing
+// 42. Prototype Spacing
+// 43. Prototype Text-Decoration
+// 44. Prototype Text-Transformation
+// 45. Prototype Text-Utilities
+// 46. Responsive Embed
+// 47. Reveal
+// 48. Slider
+// 49. Switch
+// 50. Table
+// 51. Tabs
+// 52. Thumbnail
+// 53. Title Bar
+// 54. Tooltip
+// 55. Top Bar
+// 56. Xy Grid
+
+@import 'util/util';
+
+// 1. Global
+// ---------
+
+$global-font-size: 100%;
+$global-width: rem-calc(1200);
+$global-lineheight: 1.5;
+$foundation-palette: (
+ primary: #1779ba,
+ secondary: #767676,
+ success: #3adb76,
+ warning: #ffae00,
+ alert: #cc4b37,
+);
+$light-gray: #e6e6e6;
+$medium-gray: #cacaca;
+$dark-gray: #8a8a8a;
+$black: #0a0a0a;
+$white: #fefefe;
+$body-background: $white;
+$body-font-color: $black;
+$body-font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;
+$body-antialiased: true;
+$global-margin: 1rem;
+$global-padding: 1rem;
+$global-position: 1rem;
+$global-weight-normal: normal;
+$global-weight-bold: bold;
+$global-radius: 0;
+$global-menu-padding: 0.7rem 1rem;
+$global-menu-nested-margin: 1rem;
+$global-text-direction: ltr;
+$global-flexbox: true;
+$global-prototype-breakpoints: false;
+$global-color-pick-contrast-tolerance: 0;
+$print-transparent-backgrounds: true;
+
+@include add-foundation-colors;
+
+// 2. Breakpoints
+// --------------
+
+$breakpoints: (
+ small: 0,
+ medium: 640px,
+ large: 1024px,
+ xlarge: 1200px,
+ xxlarge: 1440px,
+);
+$print-breakpoint: large;
+$breakpoint-classes: (small medium large);
+
+// 3. The Grid
+// -----------
+
+$grid-row-width: $global-width;
+$grid-column-count: 12;
+$grid-column-gutter: (
+ small: 20px,
+ medium: 30px,
+);
+$grid-column-align-edge: true;
+$grid-column-alias: 'columns';
+$block-grid-max: 8;
+
+// 4. Base Typography
+// ------------------
+
+$header-font-family: $body-font-family;
+$header-font-weight: $global-weight-normal;
+$header-font-style: normal;
+$font-family-monospace: Consolas, 'Liberation Mono', Courier, monospace;
+$header-color: inherit;
+$header-lineheight: 1.4;
+$header-margin-bottom: 0.5rem;
+$header-styles: (
+ small: (
+ 'h1': ('font-size': 24),
+ 'h2': ('font-size': 20),
+ 'h3': ('font-size': 19),
+ 'h4': ('font-size': 18),
+ 'h5': ('font-size': 17),
+ 'h6': ('font-size': 16),
+ ),
+ medium: (
+ 'h1': ('font-size': 48),
+ 'h2': ('font-size': 40),
+ 'h3': ('font-size': 31),
+ 'h4': ('font-size': 25),
+ 'h5': ('font-size': 20),
+ 'h6': ('font-size': 16),
+ ),
+);
+$header-text-rendering: optimizeLegibility;
+$small-font-size: 80%;
+$header-small-font-color: $medium-gray;
+$paragraph-lineheight: 1.6;
+$paragraph-margin-bottom: 1rem;
+$paragraph-text-rendering: optimizeLegibility;
+$code-color: $black;
+$code-font-family: $font-family-monospace;
+$code-font-weight: $global-weight-normal;
+$code-background: $light-gray;
+$code-border: 1px solid $medium-gray;
+$code-padding: rem-calc(2 5 1);
+$anchor-color: $primary-color;
+$anchor-color-hover: scale-color($anchor-color, $lightness: -14%);
+$anchor-text-decoration: none;
+$anchor-text-decoration-hover: none;
+$hr-width: $global-width;
+$hr-border: 1px solid $medium-gray;
+$hr-margin: rem-calc(20) auto;
+$list-lineheight: $paragraph-lineheight;
+$list-margin-bottom: $paragraph-margin-bottom;
+$list-style-type: disc;
+$list-style-position: outside;
+$list-side-margin: 1.25rem;
+$list-nested-side-margin: 1.25rem;
+$defnlist-margin-bottom: 1rem;
+$defnlist-term-weight: $global-weight-bold;
+$defnlist-term-margin-bottom: 0.3rem;
+$blockquote-color: $dark-gray;
+$blockquote-padding: rem-calc(9 20 0 19);
+$blockquote-border: 1px solid $medium-gray;
+$cite-font-size: rem-calc(13);
+$cite-color: $dark-gray;
+$cite-pseudo-content: '\2014 \0020';
+$keystroke-font: $font-family-monospace;
+$keystroke-color: $black;
+$keystroke-background: $light-gray;
+$keystroke-padding: rem-calc(2 4 0);
+$keystroke-radius: $global-radius;
+$abbr-underline: 1px dotted $black;
+
+// 5. Typography Helpers
+// ---------------------
+
+$lead-font-size: $global-font-size * 1.25;
+$lead-lineheight: 1.6;
+$subheader-lineheight: 1.4;
+$subheader-color: $dark-gray;
+$subheader-font-weight: $global-weight-normal;
+$subheader-margin-top: 0.2rem;
+$subheader-margin-bottom: 0.5rem;
+$stat-font-size: 2.5rem;
+
+// 6. Abide
+// --------
+
+$abide-inputs: true;
+$abide-labels: true;
+$input-background-invalid: get-color(alert);
+$form-label-color-invalid: get-color(alert);
+$input-error-color: get-color(alert);
+$input-error-font-size: rem-calc(12);
+$input-error-font-weight: $global-weight-bold;
+
+// 7. Accordion
+// ------------
+
+$accordion-background: $white;
+$accordion-plusminus: true;
+$accordion-title-font-size: rem-calc(12);
+$accordion-item-color: $primary-color;
+$accordion-item-background-hover: $light-gray;
+$accordion-item-padding: 1.25rem 1rem;
+$accordion-content-background: $white;
+$accordion-content-border: 1px solid $light-gray;
+$accordion-content-color: $body-font-color;
+$accordion-content-padding: 1rem;
+
+// 8. Accordion Menu
+// -----------------
+
+$accordionmenu-padding: $global-menu-padding;
+$accordionmenu-nested-margin: $global-menu-nested-margin;
+$accordionmenu-submenu-padding: $accordionmenu-padding;
+$accordionmenu-arrows: true;
+$accordionmenu-arrow-color: $primary-color;
+$accordionmenu-item-background: null;
+$accordionmenu-border: null;
+$accordionmenu-submenu-toggle-background: null;
+$accordion-submenu-toggle-border: $accordionmenu-border;
+$accordionmenu-submenu-toggle-width: 40px;
+$accordionmenu-submenu-toggle-height: $accordionmenu-submenu-toggle-width;
+$accordionmenu-arrow-size: 6px;
+
+// 9. Badge
+// --------
+
+$badge-background: $primary-color;
+$badge-color: $white;
+$badge-color-alt: $black;
+$badge-palette: $foundation-palette;
+$badge-padding: 0.3em;
+$badge-minwidth: 2.1em;
+$badge-font-size: 0.6rem;
+
+// 10. Breadcrumbs
+// ---------------
+
+$breadcrumbs-margin: 0 0 $global-margin 0;
+$breadcrumbs-item-font-size: rem-calc(11);
+$breadcrumbs-item-color: $primary-color;
+$breadcrumbs-item-color-current: $black;
+$breadcrumbs-item-color-disabled: $medium-gray;
+$breadcrumbs-item-margin: 0.75rem;
+$breadcrumbs-item-uppercase: true;
+$breadcrumbs-item-separator: true;
+$breadcrumbs-item-separator-item: '/';
+$breadcrumbs-item-separator-item-rtl: '\\';
+$breadcrumbs-item-separator-color: $medium-gray;
+
+// 11. Button
+// ----------
+
+$button-font-family: inherit;
+$button-padding: 0.85em 1em;
+$button-margin: 0 0 $global-margin 0;
+$button-fill: solid;
+$button-background: $primary-color;
+$button-background-hover: scale-color($button-background, $lightness: -15%);
+$button-color: $white;
+$button-color-alt: $black;
+$button-radius: $global-radius;
+$button-hollow-border-width: 1px;
+$button-sizes: (
+ tiny: 0.6rem,
+ small: 0.75rem,
+ default: 0.9rem,
+ large: 1.25rem,
+);
+$button-palette: $foundation-palette;
+$button-opacity-disabled: 0.25;
+$button-background-hover-lightness: -20%;
+$button-hollow-hover-lightness: -50%;
+$button-transition: background-color 0.25s ease-out, color 0.25s ease-out;
+
+// 12. Button Group
+// ----------------
+
+$buttongroup-margin: 1rem;
+$buttongroup-spacing: 1px;
+$buttongroup-child-selector: '.button';
+$buttongroup-expand-max: 6;
+$buttongroup-radius-on-each: true;
+
+// 13. Callout
+// -----------
+
+$callout-background: $white;
+$callout-background-fade: 85%;
+$callout-border: 1px solid rgba($black, 0.25);
+$callout-margin: 0 0 1rem 0;
+$callout-padding: 1rem;
+$callout-font-color: $body-font-color;
+$callout-font-color-alt: $body-background;
+$callout-radius: $global-radius;
+$callout-link-tint: 30%;
+
+// 14. Card
+// --------
+
+$card-background: $white;
+$card-font-color: $body-font-color;
+$card-divider-background: $light-gray;
+$card-border: 1px solid $light-gray;
+$card-shadow: none;
+$card-border-radius: $global-radius;
+$card-padding: $global-padding;
+$card-margin-bottom: $global-margin;
+
+// 15. Close Button
+// ----------------
+
+$closebutton-position: right top;
+$closebutton-offset-horizontal: (
+ small: 0.66rem,
+ medium: 1rem,
+);
+$closebutton-offset-vertical: (
+ small: 0.33em,
+ medium: 0.5rem,
+);
+$closebutton-size: (
+ small: 1.5em,
+ medium: 2em,
+);
+$closebutton-lineheight: 1;
+$closebutton-color: $dark-gray;
+$closebutton-color-hover: $black;
+
+// 16. Drilldown
+// -------------
+
+$drilldown-transition: transform 0.15s linear;
+$drilldown-arrows: true;
+$drilldown-padding: $global-menu-padding;
+$drilldown-nested-margin: 0;
+$drilldown-background: $white;
+$drilldown-submenu-padding: $drilldown-padding;
+$drilldown-submenu-background: $white;
+$drilldown-arrow-color: $primary-color;
+$drilldown-arrow-size: 6px;
+
+// 17. Dropdown
+// ------------
+
+$dropdown-padding: 1rem;
+$dropdown-background: $body-background;
+$dropdown-border: 1px solid $medium-gray;
+$dropdown-font-size: 1rem;
+$dropdown-width: 300px;
+$dropdown-radius: $global-radius;
+$dropdown-sizes: (
+ tiny: 100px,
+ small: 200px,
+ large: 400px,
+);
+
+// 18. Dropdown Menu
+// -----------------
+
+$dropdownmenu-arrows: true;
+$dropdownmenu-arrow-color: $anchor-color;
+$dropdownmenu-arrow-size: 6px;
+$dropdownmenu-arrow-padding: 1.5rem;
+$dropdownmenu-min-width: 200px;
+$dropdownmenu-background: $white;
+$dropdownmenu-submenu-background: $dropdownmenu-background;
+$dropdownmenu-padding: $global-menu-padding;
+$dropdownmenu-nested-margin: 0;
+$dropdownmenu-submenu-padding: $dropdownmenu-padding;
+$dropdownmenu-border: 1px solid $medium-gray;
+$dropdown-menu-item-color-active: get-color(primary);
+$dropdown-menu-item-background-active: transparent;
+
+// 19. Flexbox Utilities
+// ---------------------
+
+$flex-source-ordering-count: 6;
+$flexbox-responsive-breakpoints: true;
+
+// 20. Forms
+// ---------
+
+$fieldset-border: 1px solid $medium-gray;
+$fieldset-padding: rem-calc(20);
+$fieldset-margin: rem-calc(18 0);
+$legend-padding: rem-calc(0 3);
+$form-spacing: rem-calc(16);
+$helptext-color: $black;
+$helptext-font-size: rem-calc(13);
+$helptext-font-style: italic;
+$input-prefix-color: $black;
+$input-prefix-background: $light-gray;
+$input-prefix-border: 1px solid $medium-gray;
+$input-prefix-padding: 1rem;
+$form-label-color: $black;
+$form-label-font-size: rem-calc(14);
+$form-label-font-weight: $global-weight-normal;
+$form-label-line-height: 1.8;
+$select-background: $white;
+$select-triangle-color: $dark-gray;
+$select-radius: $global-radius;
+$input-color: $black;
+$input-placeholder-color: $medium-gray;
+$input-font-family: inherit;
+$input-font-size: rem-calc(16);
+$input-font-weight: $global-weight-normal;
+$input-line-height: $global-lineheight;
+$input-background: $white;
+$input-background-focus: $white;
+$input-background-disabled: $light-gray;
+$input-border: 1px solid $medium-gray;
+$input-border-focus: 1px solid $dark-gray;
+$input-padding: $form-spacing / 2;
+$input-shadow: inset 0 1px 2px rgba($black, 0.1);
+$input-shadow-focus: 0 0 5px $medium-gray;
+$input-cursor-disabled: not-allowed;
+$input-transition: box-shadow 0.5s, border-color 0.25s ease-in-out;
+$input-number-spinners: true;
+$input-radius: $global-radius;
+$form-button-radius: $global-radius;
+
+// 21. Label
+// ---------
+
+$label-background: $primary-color;
+$label-color: $white;
+$label-color-alt: $black;
+$label-palette: $foundation-palette;
+$label-font-size: 0.8rem;
+$label-padding: 0.33333rem 0.5rem;
+$label-radius: $global-radius;
+
+// 22. Media Object
+// ----------------
+
+$mediaobject-margin-bottom: $global-margin;
+$mediaobject-section-padding: $global-padding;
+$mediaobject-image-width-stacked: 100%;
+
+// 23. Menu
+// --------
+
+$menu-margin: 0;
+$menu-nested-margin: $global-menu-nested-margin;
+$menu-items-padding: $global-menu-padding;
+$menu-simple-margin: 1rem;
+$menu-item-color-active: $white;
+$menu-item-background-active: get-color(primary);
+$menu-icon-spacing: 0.25rem;
+$menu-item-background-hover: $light-gray;
+$menu-state-back-compat: true;
+$menu-centered-back-compat: true;
+
+// 24. Meter
+// ---------
+
+$meter-height: 1rem;
+$meter-radius: $global-radius;
+$meter-background: $medium-gray;
+$meter-fill-good: $success-color;
+$meter-fill-medium: $warning-color;
+$meter-fill-bad: $alert-color;
+
+// 25. Off-canvas
+// --------------
+
+$offcanvas-size: 250px;
+$offcanvas-vertical-size: 250px;
+$offcanvas-background: $light-gray;
+$offcanvas-shadow: 0 0 10px rgba($black, 0.7);
+$offcanvas-inner-shadow-size: 20px;
+$offcanvas-inner-shadow-color: rgba($black, 0.25);
+$offcanvas-overlay-zindex: 11;
+$offcanvas-push-zindex: 12;
+$offcanvas-overlap-zindex: 13;
+$offcanvas-reveal-zindex: 12;
+$offcanvas-transition-length: 0.5s;
+$offcanvas-transition-timing: ease;
+$offcanvas-fixed-reveal: true;
+$offcanvas-exit-background: rgba($white, 0.25);
+$maincontent-class: 'off-canvas-content';
+
+// 26. Orbit
+// ---------
+
+$orbit-bullet-background: $medium-gray;
+$orbit-bullet-background-active: $dark-gray;
+$orbit-bullet-diameter: 1.2rem;
+$orbit-bullet-margin: 0.1rem;
+$orbit-bullet-margin-top: 0.8rem;
+$orbit-bullet-margin-bottom: 0.8rem;
+$orbit-caption-background: rgba($black, 0.5);
+$orbit-caption-padding: 1rem;
+$orbit-control-background-hover: rgba($black, 0.5);
+$orbit-control-padding: 1rem;
+$orbit-control-zindex: 10;
+
+// 27. Pagination
+// --------------
+
+$pagination-font-size: rem-calc(14);
+$pagination-margin-bottom: $global-margin;
+$pagination-item-color: $black;
+$pagination-item-padding: rem-calc(3 10);
+$pagination-item-spacing: rem-calc(1);
+$pagination-radius: $global-radius;
+$pagination-item-background-hover: $light-gray;
+$pagination-item-background-current: $primary-color;
+$pagination-item-color-current: $white;
+$pagination-item-color-disabled: $medium-gray;
+$pagination-ellipsis-color: $black;
+$pagination-mobile-items: false;
+$pagination-mobile-current-item: false;
+$pagination-arrows: true;
+
+// 28. Progress Bar
+// ----------------
+
+$progress-height: 1rem;
+$progress-background: $medium-gray;
+$progress-margin-bottom: $global-margin;
+$progress-meter-background: $primary-color;
+$progress-radius: $global-radius;
+
+// 29. Prototype Arrow
+// -------------------
+
+$prototype-arrow-directions: (
+ down,
+ up,
+ right,
+ left
+);
+$prototype-arrow-size: 0.4375rem;
+$prototype-arrow-color: $black;
+
+// 30. Prototype Border-Box
+// ------------------------
+
+$prototype-border-box-breakpoints: $global-prototype-breakpoints;
+
+// 31. Prototype Border-None
+// -------------------------
+
+$prototype-border-none-breakpoints: $global-prototype-breakpoints;
+
+// 32. Prototype Bordered
+// ----------------------
+
+$prototype-bordered-breakpoints: $global-prototype-breakpoints;
+$prototype-border-width: rem-calc(1);
+$prototype-border-type: solid;
+$prototype-border-color: $medium-gray;
+
+// 33. Prototype Display
+// ---------------------
+
+$prototype-display-breakpoints: $global-prototype-breakpoints;
+$prototype-display: (
+ inline,
+ inline-block,
+ block,
+ table,
+ table-cell
+);
+
+// 34. Prototype Font-Styling
+// --------------------------
+
+$prototype-font-breakpoints: $global-prototype-breakpoints;
+$prototype-wide-letter-spacing: rem-calc(4);
+$prototype-font-normal: $global-weight-normal;
+$prototype-font-bold: $global-weight-bold;
+
+// 35. Prototype List-Style-Type
+// -----------------------------
+
+$prototype-list-breakpoints: $global-prototype-breakpoints;
+$prototype-style-type-unordered: (
+ disc,
+ circle,
+ square
+);
+$prototype-style-type-ordered: (
+ decimal,
+ lower-alpha,
+ lower-latin,
+ lower-roman,
+ upper-alpha,
+ upper-latin,
+ upper-roman
+);
+
+// 36. Prototype Overflow
+// ----------------------
+
+$prototype-overflow-breakpoints: $global-prototype-breakpoints;
+$prototype-overflow: (
+ visible,
+ hidden,
+ scroll
+);
+
+// 37. Prototype Position
+// ----------------------
+
+$prototype-position-breakpoints: $global-prototype-breakpoints;
+$prototype-position: (
+ static,
+ relative,
+ absolute,
+ fixed
+);
+$prototype-position-z-index: 975;
+
+// 38. Prototype Rounded
+// ---------------------
+
+$prototype-rounded-breakpoints: $global-prototype-breakpoints;
+$prototype-border-radius: rem-calc(3);
+
+// 39. Prototype Separator
+// -----------------------
+
+$prototype-separator-breakpoints: $global-prototype-breakpoints;
+$prototype-separator-align: center;
+$prototype-separator-height: rem-calc(2);
+$prototype-separator-width: 3rem;
+$prototype-separator-background: $primary-color;
+$prototype-separator-margin-top: $global-margin;
+
+// 40. Prototype Shadow
+// --------------------
+
+$prototype-shadow-breakpoints: $global-prototype-breakpoints;
+$prototype-box-shadow: 0 2px 5px 0 rgba(0,0,0,.16),
+ 0 2px 10px 0 rgba(0,0,0,.12);
+
+// 41. Prototype Sizing
+// --------------------
+
+$prototype-sizing-breakpoints: $global-prototype-breakpoints;
+$prototype-sizing: (
+ width,
+ height
+);
+$prototype-sizes: (
+ 25: 25%,
+ 50: 50%,
+ 75: 75%,
+ 100: 100%
+);
+
+// 42. Prototype Spacing
+// ---------------------
+
+$prototype-spacing-breakpoints: $global-prototype-breakpoints;
+$prototype-spacers-count: 3;
+
+// 43. Prototype Text-Decoration
+// -----------------------------
+
+$prototype-decoration-breakpoints: $global-prototype-breakpoints;
+$prototype-text-decoration: (
+ overline,
+ underline,
+ line-through,
+);
+
+// 44. Prototype Text-Transformation
+// ---------------------------------
+
+$prototype-transformation-breakpoints: $global-prototype-breakpoints;
+$prototype-text-transformation: (
+ lowercase,
+ uppercase,
+ capitalize
+);
+
+// 45. Prototype Text-Utilities
+// ----------------------------
+
+$prototype-utilities-breakpoints: $global-prototype-breakpoints;
+$prototype-text-overflow: ellipsis;
+
+// 46. Responsive Embed
+// --------------------
+
+$responsive-embed-margin-bottom: rem-calc(16);
+$responsive-embed-ratios: (
+ default: 4 by 3,
+ widescreen: 16 by 9,
+);
+
+// 47. Reveal
+// ----------
+
+$reveal-background: $white;
+$reveal-width: 600px;
+$reveal-max-width: $global-width;
+$reveal-padding: $global-padding;
+$reveal-border: 1px solid $medium-gray;
+$reveal-radius: $global-radius;
+$reveal-zindex: 1005;
+$reveal-overlay-background: rgba($black, 0.45);
+
+// 48. Slider
+// ----------
+
+$slider-width-vertical: 0.5rem;
+$slider-transition: all 0.2s ease-in-out;
+$slider-height: 0.5rem;
+$slider-background: $light-gray;
+$slider-fill-background: $medium-gray;
+$slider-handle-height: 1.4rem;
+$slider-handle-width: 1.4rem;
+$slider-handle-background: $primary-color;
+$slider-opacity-disabled: 0.25;
+$slider-radius: $global-radius;
+
+// 49. Switch
+// ----------
+
+$switch-background: $medium-gray;
+$switch-background-active: $primary-color;
+$switch-height: 2rem;
+$switch-height-tiny: 1.5rem;
+$switch-height-small: 1.75rem;
+$switch-height-large: 2.5rem;
+$switch-radius: $global-radius;
+$switch-margin: $global-margin;
+$switch-paddle-background: $white;
+$switch-paddle-offset: 0.25rem;
+$switch-paddle-radius: $global-radius;
+$switch-paddle-transition: all 0.25s ease-out;
+
+// 50. Table
+// ---------
+
+$table-background: #031530;
+$table-color-scale: 5%;
+$table-border: 3px solid smart-scale($table-background, $table-color-scale);
+$table-padding: rem-calc(8 10 10);
+$table-hover-scale: 2%;
+$table-row-hover: darken($table-background, $table-hover-scale);
+$table-row-stripe-hover: darken($table-background, $table-color-scale + $table-hover-scale);
+$table-is-striped: true;
+$table-striped-background: smart-scale($table-background, $table-color-scale);
+$table-stripe: even;
+$table-head-background: smart-scale($table-background, $table-color-scale / 2);
+$table-head-row-hover: darken($table-head-background, $table-hover-scale);
+$table-foot-background: smart-scale($table-background, $table-color-scale);
+$table-foot-row-hover: darken($table-foot-background, $table-hover-scale);
+$table-head-font-color: $white;
+$table-foot-font-color: $white;
+$show-header-for-stacked: false;
+$table-stack-breakpoint: medium;
+
+// 51. Tabs
+// --------
+
+$tab-margin: 0;
+$tab-background: $white;
+$tab-color: $primary-color;
+$tab-background-active: $light-gray;
+$tab-active-color: $primary-color;
+$tab-item-font-size: rem-calc(12);
+$tab-item-background-hover: $white;
+$tab-item-padding: 1.25rem 1.5rem;
+$tab-expand-max: 6;
+$tab-content-background: $white;
+$tab-content-border: $light-gray;
+$tab-content-color: $body-font-color;
+$tab-content-padding: 1rem;
+
+// 52. Thumbnail
+// -------------
+
+$thumbnail-border: solid 4px $white;
+$thumbnail-margin-bottom: $global-margin;
+$thumbnail-shadow: 0 0 0 1px rgba($black, 0.2);
+$thumbnail-shadow-hover: 0 0 6px 1px rgba($primary-color, 0.5);
+$thumbnail-transition: box-shadow 200ms ease-out;
+$thumbnail-radius: $global-radius;
+
+// 53. Title Bar
+// -------------
+
+$titlebar-background: $black;
+$titlebar-color: $white;
+$titlebar-padding: 0.5rem;
+$titlebar-text-font-weight: bold;
+$titlebar-icon-color: $white;
+$titlebar-icon-color-hover: $medium-gray;
+$titlebar-icon-spacing: 0.25rem;
+
+// 54. Tooltip
+// -----------
+
+$has-tip-cursor: help;
+$has-tip-font-weight: $global-weight-bold;
+$has-tip-border-bottom: dotted 1px $dark-gray;
+$tooltip-background-color: $black;
+$tooltip-color: $white;
+$tooltip-padding: 0.75rem;
+$tooltip-max-width: 10rem;
+$tooltip-font-size: $small-font-size;
+$tooltip-pip-width: 0.75rem;
+$tooltip-pip-height: $tooltip-pip-width * 0.866;
+$tooltip-radius: $global-radius;
+
+// 55. Top Bar
+// -----------
+
+$topbar-padding: 0.5rem;
+$topbar-background: $light-gray;
+$topbar-submenu-background: $topbar-background;
+$topbar-title-spacing: 0.5rem 1rem 0.5rem 0;
+$topbar-input-width: 200px;
+$topbar-unstack-breakpoint: medium;
+
+// 56. Xy Grid
+// -----------
+
+$xy-grid: true;
+$grid-container: $global-width;
+$grid-columns: 12;
+$grid-margin-gutters: (
+ small: 20px,
+ medium: 30px
+);
+$grid-padding-gutters: $grid-margin-gutters;
+$grid-container-padding: $grid-padding-gutters;
+$grid-container-max: $global-width;
+$block-grid-max: 8;
diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss
new file mode 100644
index 0000000000..a8e9e7106f
--- /dev/null
+++ b/app/assets/stylesheets/application.scss
@@ -0,0 +1,389 @@
+/*
+ * 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, 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 other CSS/SCSS
+
+ * files in this directory. Styles in this file should be added after the last require_* statement.
+ * It is generally better to create a new file per style scope.
+ *
+ *= require_tree .
+ *= require_self
+ *= require foundation_and_overrides
+
+ */
+// @import url('http://fonts.googleapis.com/css?family=Didact+Gothic');
+
+@import url('https://fonts.googleapis.com/css?family=Bungee+Inline');
+
+// @import font-url('//fonts.googleapis.com/css?family=Asar|Open+Sans');
+
+@font-face {font-family:"STARWARS";src:font-url("STARWARS.eot?") format("eot"),font-url("STARWARS.woff") format("woff"),font-url("STARWARS.ttf") format("truetype"),font-url("STARWARS.svg#STARWARS") format("svg");font-weight:normal;font-style:normal;}
+
+// @font-face {font-family: 'Bungee Inline';src:font-url("BungeeInline-Regular.eot?") format("eot"), font-url("BungeeInline-Regular.woff") format("woff"), font-url("BungeeInline-Regular.ttf") format("truetype"), font-url("BungeeInline-Regular.svg#BungeeInline-Regular") format("svg");font-weight:normal;font-style:normal;}
+/******************************************************
+ STYLING ACROSS ALL PAGES
+*******************************************************/
+
+body, html {
+ margin: 0;
+ font-family: 'Open Sans', sans-serif;
+ font-size: 1em;
+}
+
+body {
+ background-image: image-url('ep_naturalblack.png');
+ color: #F6F6F6;
+}
+
+header a {
+ color: white;
+}
+
+.more-margin {
+ margin: 50px;
+}
+
+.padding {
+ padding: 5px;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.margin-zero {
+ margin: 0;
+}
+
+.min-width {
+ min-width: 100%
+}
+
+a.button {
+ background-color: #020b56;
+ color: #ffdf00;;
+ font-family: 'Bungee Inline', cursive;
+
+}
+
+input {
+ // background-color: #FEDD32;
+ background-color: #020b56;
+ // color: black;
+ // font-family: "STARWARS"
+ color: #ffdf00;
+ font-family: 'Bungee Inline', cursive;
+ padding: 12px;
+ border: none;
+}
+input:hover {
+ background-color: #14679e;
+ color: #fefefe;
+}
+
+
+/* *****************************************************
+ NAV
+****************************************************** */
+
+.top-bar ul, .top-bar {
+ background-color: black;
+}
+
+.navimg {
+ max-width: 35px;
+ max-height: 25px;
+}
+
+header a {
+ color: #ffdf00;
+ font-family: 'Bungee Inline', cursive;
+}
+
+div.top-bar-left ul.menu li.padding a.nav-link {
+ color: #ffdf00;
+ font-family: 'Bungee Inline', cursive;
+}
+
+/* *****************************************************
+ DROP DOWN MISC
+****************************************************** */
+
+
+/* The container
- needed to position the dropdown content */
+.dropdown {
+ // position: relative;
+ display: inline-block;
+}
+
+/* Dropdown Content (Hidden by Default) */
+.dropdown-content {
+ display: none;
+ position: absolute;
+ background-color: #282828;
+ min-width: 130px;
+ box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+ z-index: 1;
+}
+
+/* Links inside the dropdown */
+.inside-dropdown {
+ color: white;
+ padding: 12px 16px;
+ text-decoration: none;
+ display: block;
+}
+
+/* Change color of dropdown links on hover */
+.dropdown-content a:hover { background-color: #003366 }
+
+/* Show the dropdown menu on hover */
+.dropdown:hover .dropdown-content {
+ display: block;
+}
+
+.margin-top {
+ margin-top: 8px;
+ margin-right: 10px;
+}
+
+// div.nav-menu {
+// width: 60%;
+// display: flex;
+// justify-content: center;
+// align-content: center;
+// }
+// div.nav-menu ul {
+// overflow: hidden;
+// display: flex;
+// justify-content: center;
+// align-content: center;
+// width: 60%;
+// }
+// div.nav-menu ul li {
+// margin: 1% 0 0 20%;
+// width: 45%;
+// text-align: center;
+// }
+// .jedi-content,
+// .driver-content {
+// display: none;
+// position: absolute;
+// min-width: 180px;
+// background: #fafafa;
+// box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+// z-index: 1;
+// }
+// .jedi-dropdown a,
+// .driver-dropdown a {
+// padding: 14px 20px;
+// text-decoration: none;
+// display: block;
+// text-align: left;
+// }
+// .drop-title i { margin-left: 2%; color: #666; }
+// .jedi-content a i,
+// .driver-content a i { margin-right: 10%; }
+// .jedi-content a:hover,
+// .driver-content a:hover { background: #ccc; }
+// .jedi-dropdown:hover .passenger-content { display: block; }
+// .driver-dropdown:hover .driver-content { display: block; }
+
+
+
+/* *****************************************************
+HERO
+****************************************************** */
+
+// .hero {
+// // TODO: Make this height reactive with media breaks
+// background-image: image-url('hero.jpg');
+// background-size: cover;
+// height: 300px;
+// text-align: center;
+// display: flex;
+// align-items: center;
+// justify-content: center;
+//
+// .hero-section-text a{
+// color: white;
+// text-shadow: 1px 1px 2px black;
+// }
+// }
+
+.hero h1 {
+ padding-top: 125px;
+ font-family: 'STARWARS';
+ font-size: 5em;
+}
+
+
+.hero {
+ // TODO: Make this height reactive with media breaks
+ background-image: image-url('hero.jpg');
+ background-size: cover;
+ height: 350px;
+ text-align: center;
+ background-attachment: fixed;
+ background-position: center;
+ background-repeat: no-repeat;
+
+ .hero-section-text a {
+ color: white;
+ text-shadow: 1px 1px 2px black;
+ }
+}
+
+
+/******************************************************
+ FLASH
+*******************************************************/
+
+
+.row.status.success {
+ font-family: "arial-black";
+ border-radius: 5px;
+ background-color: #202b82;
+ padding: 20px 25px;
+ font-size: 1em;
+ min-width: 100%;
+}
+
+.row.status.failure {
+ font-family: "arial-black";
+ border-radius: 5px;
+ background-color: #a80609;
+ padding: 20px 25px;
+ font-size: 1em;
+ min-width: 100%;
+}
+
+.no-bg-color {
+ background-color: transparent;
+}
+// TODO: would the below code be the same as above and help clean things up?
+// .row.status{
+// .success {
+// border-radius: 5px;
+// background-color: lightblue;
+// padding: 20px 25px;
+// font-size: 1em;
+// min-width: 100%;
+// }
+// .failure {
+// border-radius: 5px;
+// background-color: pink;
+// padding: 20px 25px;
+// font-size: 1em;
+// min-width: 100%;
+// }
+// }
+/******************************************************
+ INDEX/ROOT
+*******************************************************/
+
+h1 {
+ padding: 50px;
+}
+
+.force-index h2 {
+ padding: 30px;
+}
+.force-index {
+ background: image-url('ep_naturalblack.png');
+}
+
+
+/******************************************************
+ MAIN
+*******************************************************/
+
+////////CART////////////
+
+.cart-heading {
+ margin-top: 20px;
+ padding-top: 30px;
+ padding-bottom: 20px;
+}
+
+.cart-name {
+ font-size: 1.5em;
+ padding-top: 15px;
+}
+
+.checkout {
+ padding-bottom: 40px;
+ padding-top: 20px;
+}
+
+.cart-image img {
+ width: 60%;
+ padding-bottom: 20px;
+ padding-left: 80px;
+}
+
+select {
+ width: 40%;
+ // margin-left: 50px;
+}
+
+input {
+ margin-left: 10px;
+}
+
+.text-block {
+ padding-top: 40px;
+}
+
+.button-large{
+ color: #CA4C3D;
+}
+
+hr {
+ opacity: .5;
+}
+
+.button {
+ font-size: 1em;
+}
+/******************************************************
+ OPENING
+*******************************************************/
+
+/******************************************************
+ FOOTER
+*******************************************************/
+
+
+.footer-margin {
+ margin-top: 100px;
+ padding: 20px;
+}
+
+// footer p {
+// opacity: .6;
+// margin-bottom: 0;
+// // background-color: #282828;
+// padding-top: 20px;
+// }
+
+/******************************************************
+ TABLES
+*******************************************************/
+table {
+ width: 80%;
+}
+
+.mini{
+ width: 100px;
+ }
+
+ .orderindex{
+ max-width: 90px;
+ max-height: 70px;
+ }
diff --git a/app/assets/stylesheets/carts.scss b/app/assets/stylesheets/carts.scss
new file mode 100644
index 0000000000..4938fd566b
--- /dev/null
+++ b/app/assets/stylesheets/carts.scss
@@ -0,0 +1,7 @@
+// Place all the styles related to the Carts controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
+
+.gear {
+ font-size: 1.5em;
+}
diff --git a/app/assets/stylesheets/categories.scss b/app/assets/stylesheets/categories.scss
new file mode 100644
index 0000000000..42976cbc11
--- /dev/null
+++ b/app/assets/stylesheets/categories.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the Categories controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/assets/stylesheets/foundation_and_overrides.scss b/app/assets/stylesheets/foundation_and_overrides.scss
new file mode 100644
index 0000000000..2e528eb34b
--- /dev/null
+++ b/app/assets/stylesheets/foundation_and_overrides.scss
@@ -0,0 +1,54 @@
+@charset 'utf-8';
+
+@import 'settings';
+@import 'foundation';
+
+// If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package.
+//
+
+
+// We include everything by default. To slim your CSS, remove components you don't use.
+
+@include foundation-global-styles;
+@include foundation-grid;
+@include foundation-typography;
+@include foundation-button;
+@include foundation-forms;
+@include foundation-visibility-classes;
+@include foundation-float-classes;
+@include foundation-accordion;
+@include foundation-accordion-menu;
+@include foundation-badge;
+@include foundation-breadcrumbs;
+@include foundation-button-group;
+@include foundation-callout;
+@include foundation-card;
+@include foundation-close-button;
+@include foundation-drilldown-menu;
+@include foundation-dropdown;
+@include foundation-dropdown-menu;
+@include foundation-responsive-embed;
+@include foundation-label;
+@include foundation-media-object;
+@include foundation-menu;
+@include foundation-menu-icon;
+@include foundation-off-canvas;
+@include foundation-orbit;
+@include foundation-pagination;
+@include foundation-progress-bar;
+@include foundation-slider;
+@include foundation-sticky;
+@include foundation-reveal;
+@include foundation-switch;
+@include foundation-table;
+@include foundation-tabs;
+@include foundation-thumbnail;
+@include foundation-title-bar;
+@include foundation-tooltip;
+@include foundation-top-bar;
+
+// If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package.
+//
+@import 'motion-ui/motion-ui';
+@include motion-ui-transitions;
+@include motion-ui-animations;
diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss
new file mode 100644
index 0000000000..dd6bc9b7d0
--- /dev/null
+++ b/app/assets/stylesheets/main.scss
@@ -0,0 +1,28 @@
+// Place all the styles related to the main controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
+
+h2, footer.bg {
+ color: #ffdf00;
+ font-family: 'Bungee Inline', cursive;
+}
+
+.bg-white {
+ background-color: white;
+}
+
+.small-thumb {
+ width: 300px;
+}
+
+.more-padding {
+ padding: 50px;
+}
+
+main.no-bg {
+ background-color: transparent;
+}
+
+blockquote {
+ display: inline;
+}
diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss
new file mode 100644
index 0000000000..50932fc230
--- /dev/null
+++ b/app/assets/stylesheets/merchants.scss
@@ -0,0 +1,20 @@
+table {
+ font-family: "Arial black";
+ text-align: center;
+}
+
+a {
+ color: #ffdf00;
+ font-family: 'Bungee Inline', cursive;
+}
+
+a.button {
+ color: #ffdf00;
+ font-family: 'Bungee Inline', cursive;
+ background-color: #031530;
+}
+
+h3, h4 {
+ color: white;
+ font-family: 'Bungee Inline', cursive;
+}
diff --git a/app/assets/stylesheets/order_items.scss b/app/assets/stylesheets/order_items.scss
new file mode 100644
index 0000000000..584862de9b
--- /dev/null
+++ b/app/assets/stylesheets/order_items.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the OrderItems controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss
new file mode 100644
index 0000000000..42bfeff0a8
--- /dev/null
+++ b/app/assets/stylesheets/orders.scss
@@ -0,0 +1,10 @@
+// Place all the styles related to the Orders controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
+#complete {
+ color: #88a003;
+}
+
+#paid {
+ color: #a50407;
+}
diff --git a/app/assets/stylesheets/payments.scss b/app/assets/stylesheets/payments.scss
new file mode 100644
index 0000000000..90aa409c7d
--- /dev/null
+++ b/app/assets/stylesheets/payments.scss
@@ -0,0 +1,19 @@
+// Place all the styles related to the BillingInfos controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
+
+.payment-form label {
+ color: white;
+ text-align: left;
+}
+
+
+.button {
+ color: #ffdf00;
+ font-family: 'Bungee Inline', cursive;
+ background-color: #020b56;
+}
+
+label {
+ font-family: "Arial black";
+}
diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss
new file mode 100644
index 0000000000..7a57e05716
--- /dev/null
+++ b/app/assets/stylesheets/products.scss
@@ -0,0 +1,102 @@
+// Place all the styles related to the Products controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
+
+.show-product img {
+ height: 400px;
+ width: 400px;
+ border: 1px solid;
+ margin-bottom: 30px;
+}
+
+.show-box {
+ text-align: center;
+}
+
+.description {
+ display: block;
+ font-size: 1.2em;
+ font-family: sans-serif;
+}
+
+.inventory {
+ font-size: 1.2em;
+ padding: 30px;
+}
+
+h1 {
+ color: white;
+ font-family: 'Bungee Inline', cursive;
+}
+/* *****************************************************
+ INDEX
+****************************************************** */
+
+#new_order_item {
+ display: inline-block;
+}
+
+#quantity {
+ height: 30px;
+ width: 100px;
+}
+
+.button-style {
+ font-family: 'Bungee Inline', cursive;
+ color: #ffdf00
+}
+
+header.bottom-margin {
+ margin-bottom: 80px;
+}
+
+.product-block {
+ padding-top: 25px;
+}
+
+#products-index {
+ margin: 5%;
+}
+
+p.product-name {
+ padding-top: 10px;
+}
+
+#available {
+ font-family: sans-serif;
+}
+
+
+/* *****************************************************
+ SHOW
+****************************************************** */
+
+.review h2 {
+ padding-top: 60px;
+}
+
+.review-details {
+ padding-top: 20px;
+ padding-bottom: 20px;
+}
+
+.review-details img {
+ height:70px;
+ padding-top: 20px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+/* *****************************************************
+ EDIT
+****************************************************** */
+
+.button {
+ color: #ffdf00;
+ font-family: 'Bungee Inline', cursive;
+ background-color: #031530;
+}
+
+label {
+ font-family: "Arial black";
+}
diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss
new file mode 100644
index 0000000000..dc8d6fa19f
--- /dev/null
+++ b/app/assets/stylesheets/reviews.scss
@@ -0,0 +1,24 @@
+// Place all the styles related to the Reviews controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
+#review_body {
+ padding: 40px;
+ text-align: center;
+}
+
+
+// select {
+// width:auto;
+// border: 1px solid #cccccc;
+// background-color: #ffffff;
+// }
+#review_rating {
+ width: 100px;
+ margin: 0;
+
+}
+
+ .review-button {
+ margin-top: 30px;
+ font-size: 1.5em;
+}
diff --git a/app/assets/stylesheets/sessions.scss b/app/assets/stylesheets/sessions.scss
new file mode 100644
index 0000000000..ccb1ed25b2
--- /dev/null
+++ b/app/assets/stylesheets/sessions.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the Sessions controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb
new file mode 100644
index 0000000000..d672697283
--- /dev/null
+++ b/app/channels/application_cable/channel.rb
@@ -0,0 +1,4 @@
+module ApplicationCable
+ class Channel < ActionCable::Channel::Base
+ end
+end
diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb
new file mode 100644
index 0000000000..0ff5442f47
--- /dev/null
+++ b/app/channels/application_cable/connection.rb
@@ -0,0 +1,4 @@
+module ApplicationCable
+ class Connection < ActionCable::Connection::Base
+ end
+end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
new file mode 100644
index 0000000000..73a266a79a
--- /dev/null
+++ b/app/controllers/application_controller.rb
@@ -0,0 +1,63 @@
+class ApplicationController < ActionController::Base
+ protect_from_forgery with: :exception
+
+ before_action :find_merchant
+
+ helper :all
+
+ helper_method :current_order
+ helper_method :restrict_merchant
+ # helper_method :number_to_currency
+
+ protected
+
+ def flash_unathorized
+ flash[:status] = :failure
+ flash[:message] = "You must be authorized to do that"
+ end
+
+ def save_and_flash(model)
+ result = model.save
+ if result
+ flash[:status] = :success
+ flash[:message] = "Successfully saved #{model.class} #{model.id}"
+ else
+ flash.now[:status] = :failure
+ flash.now[:message] = "Failed to save #{model.class}"
+ flash.now[:details] = model.errors.messages
+ end
+ return result
+ end
+
+ def current_order
+ if session[:order_id]
+ Order.find(session[:order_id])
+ else
+ Order.new
+ end
+ end
+
+private
+
+ def find_merchant
+ if session[:merchant_id]
+ @login_merchant = Merchant.find_by(id: session[:merchant_id])
+ end
+ end
+
+
+ def restrict_merchant(expected_merchant_id)
+ @merchant = Merchant.find_by(id: expected_merchant_id)
+
+ if @login_merchant && @login_merchant.id == @merchant.id
+ unless @merchant
+ head :not_found
+ end
+ else
+ flash[:status] = :failure
+ flash[:message] = "You must be authorized to do that"
+ redirect_back fallback_location: root_path
+ end
+ end
+
+end
diff --git a/app/controllers/carts_controller.rb b/app/controllers/carts_controller.rb
new file mode 100644
index 0000000000..ebd378e5eb
--- /dev/null
+++ b/app/controllers/carts_controller.rb
@@ -0,0 +1,7 @@
+class CartsController < ApplicationController
+
+ def show
+ @order_items = current_order.order_items
+ end
+
+end
diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb
new file mode 100644
index 0000000000..743ae280df
--- /dev/null
+++ b/app/controllers/main_controller.rb
@@ -0,0 +1,6 @@
+class MainController < ApplicationController
+
+ def index
+ end
+
+end
diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb
new file mode 100644
index 0000000000..ca31e56cf4
--- /dev/null
+++ b/app/controllers/merchants_controller.rb
@@ -0,0 +1,25 @@
+class MerchantsController < ApplicationController
+
+ before_action only:[:show] do
+ @try_merchant = Merchant.find_by(id: params[:id])
+ restrict_merchant(@try_merchant)
+ end
+
+ def show
+ @unfufilled = @merchant.orders_hash_by_status("paid").count
+ @unfufilled_revenue = @merchant.sum_ord_hash("paid")
+ @complete = @merchant.orders_hash_by_status("complete").count
+ @complete_revenue = @merchant.sum_ord_hash("complete")
+ @total = @unfufilled + @complete
+ @total_revenue = @unfufilled_revenue + @complete_revenue
+ end
+
+ def products
+ @merchant = Merchant.find(params[:merchant_id])
+ if @login_merchant && @login_merchant.id == @merchant.id
+ @access = true
+ end
+ @products = @merchant.products
+ end
+
+end
diff --git a/app/controllers/order_items_controller.rb b/app/controllers/order_items_controller.rb
new file mode 100644
index 0000000000..3cf8698ab9
--- /dev/null
+++ b/app/controllers/order_items_controller.rb
@@ -0,0 +1,61 @@
+class OrderItemsController < ApplicationController
+
+ before_action only:[:ship] do
+ @order_item = OrderItem.find_by(id: params[:id])
+ restrict_merchant(@order_item.merchant.id)
+ end
+
+ def create
+ @order = current_order
+ @item = @order.order_items.new(order_items_params)
+ @order.save
+ session[:order_id] = @order.id
+ redirect_to cart_path
+ end
+
+
+ def update
+ @order_item = OrderItem.find_by(id: params[:id])
+ @order_item.update_attributes(order_items_params)
+
+ # order_item can only update the quantity in the cart_controller show
+ if @order_item.save
+ flash[:status] = :success
+ flash[:message] = "The quantity for #{@order_item.product.name} was updated!"
+ else
+ flash[:status] = :failure
+ flash[:message] = "Unable to change quantity. Please try again."
+ end
+ redirect_to cart_path
+ end
+
+ def destroy
+ @order = current_order
+ @item = @order.order_items.find(params[:id])
+ if @item
+ @item.destroy
+ @order.save
+ else
+ flash_unathorized
+ end
+ redirect_to cart_path
+ end
+
+ def ship
+ @order_item.shipped = true
+ @order_item.save
+ @order_item.order.change_to_shipped
+ @order_item.order.save
+ flash[:status] = "success"
+ flash[:message] = "Item Shipped"
+ redirect_back fallback_location: merchant_orders_path(:merchant_id) # redirect_back is going to go first to request.referrer
+
+ end
+
+ private
+
+ def order_items_params
+ params.require(:order_item).permit(:product_id, :quantity)
+ end
+
+end
diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb
new file mode 100644
index 0000000000..b0eeaaa931
--- /dev/null
+++ b/app/controllers/orders_controller.rb
@@ -0,0 +1,35 @@
+class OrdersController < ApplicationController
+
+ # TODO: TAKE ALOOK AT THIS. WHAT IS THE MERCHANT ID COMING FROM? SESSIONS? ALREADY A @LOGIN_MERCHANT
+ before_action only:[:index] do
+ restrict_merchant(params[:merchant_id])
+ end
+
+ def index
+ if @login_merchant
+ # @merchant = Merchant.find_by(id: params[:merchant_id])
+ @orders = @merchant.distinct_orders
+ @paid_orders_hash = @merchant.orders_hash_by_status("paid")
+ # @paid_total = @merchant.sum_ord_hash("paid")
+ @complete_orders_hash = @merchant.orders_hash_by_status("complete")
+ # @complete_total = @merchant.sum_ord_hash("complete")
+ else
+ flash_unathorized
+ redirect_to root_path
+ end
+ end
+
+ def show
+ @order = Order.find_by(id: params[:id])
+
+ unless @order
+ head :not_found
+ end
+ end
+
+ private
+
+ def order_items_params
+ params.permit(:quantity, :product_id)
+ end
+end
diff --git a/app/controllers/payments_controller.rb b/app/controllers/payments_controller.rb
new file mode 100644
index 0000000000..ac07dadd7c
--- /dev/null
+++ b/app/controllers/payments_controller.rb
@@ -0,0 +1,62 @@
+class PaymentsController < ApplicationController
+
+ def new # Show the form for billing info
+ order = Order.find_by(id: params[:order_id])
+ if order
+ @payment = Payment.new
+ @payment.order_id = params[:order_id]
+ else
+ head :not_found
+ end
+ end
+
+ def create
+ @payment = Payment.new(payment_params)
+ @payment.order_id = params[:order_id] #TODO: May have to change this to @order instead of using the session
+
+
+ if @payment.save
+ order = Order.find_by(id: params[:order_id])
+
+ order.products.each do |item|
+ order.order_items.each do |order_item|
+ item.inventory -= order_item.quantity
+ item.save
+ end
+ end
+ order.status = "paid"
+ order.save
+
+ session[:order_id] = nil
+
+ flash[:status] = :success
+ flash[:message] = "success payment"
+ redirect_to order_path(@payment.order_id)
+
+ else
+ flash[:status] = :failure
+ flash[:message] = "Whoops! Something was wrong when placing your order!"
+ flash[:details] = @payment.errors.messages
+ render :new, status: :bad_request
+ end
+ end
+
+
+ def show
+ @payment = Payment.find_by(id: params[:id])
+ if @login_merchant && @payment
+ if @login_merchant.orders.ids.include? @payment.order_id
+ # flash[:status] = :success
+ return @payment
+ end
+ end
+ flash_unathorized
+ redirect_to root_path
+ end
+
+ private
+
+ def payment_params
+ params.require(:payment).permit(:name, :email, :mailing_address, :cc_name, :cc_expiration, :cc_number, :cc_ccv, :billing_zip)
+ end
+end
diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb
new file mode 100644
index 0000000000..b38b154490
--- /dev/null
+++ b/app/controllers/products_controller.rb
@@ -0,0 +1,93 @@
+class ProductsController < ApplicationController
+
+ before_action only:[:edit] do
+ @product = Product.find_by(id: params[:id])
+ if @product
+ restrict_merchant(@product.merchant.id)
+ end
+ end
+
+ def index
+ @category = Category.find_by(id: params[:id])
+
+ if @category
+ @order_item = OrderItem.new
+ @products = @category.products
+ else
+ head :not_found
+ end
+ end
+
+ def show
+ @order = current_order
+ @order_item = OrderItem.new
+ @product = Product.find_by(id: params[:id])
+ unless @product
+ head :not_found
+ end
+ end
+
+ def new
+ if @login_merchant
+ @product = Product.new
+ else
+ flash_unathorized
+ redirect_to root_path
+ end
+ end
+
+ def create
+ if @login_merchant
+ # If category exists make a new product
+ @product = Product.new(products_params) # This pulls in the params from the form and uses the categories and checks to see if the names are already in the database.
+ @product.merchant_id = @login_merchant.id
+ if save_and_flash(@product)
+ redirect_to product_path(@product)
+ else
+ render :new, status: :bad_request
+ end
+ else
+ flash_unathorized
+ redirect_to root_path
+ end
+ end
+
+ def edit
+ if @login_merchant
+ @product = Product.find_by(id: params[:id])
+ unless @product
+ head :not_found
+ end
+ else
+ flash_unathorized
+ redirect_to root_path
+ end
+ end
+
+ def update
+ if @login_merchant
+ @product = Product.find(params[:id])
+
+ if @product.update_attributes(products_params)
+ flash[:status] = :success
+ flash[:message] = "Successfully updated #{@product.name}!"
+ redirect_to product_path(@product)
+ else
+ flash[:status] = :failure
+ flash[:message] = "There was an error when updating your product"
+ flash[:details] = @product.errors.messages
+ render :edit, status: :bad_request
+ end
+ else
+ flash_unathorized
+ redirect_to root_path
+ end
+ end
+
+ private
+
+ def products_params
+ params.require(:product).permit(:name, :price, :inventory, :description, :photo_url, categories_attributes: [:name])
+ end
+
+end
diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb
new file mode 100644
index 0000000000..fdc271c2a6
--- /dev/null
+++ b/app/controllers/reviews_controller.rb
@@ -0,0 +1,35 @@
+class ReviewsController < ApplicationController
+
+ def new
+ product = Product.find_by(id: params[:product_id])
+ if product
+ @review = Review.new
+ @review.product_id = params[:product_id]
+ else
+ render :new, status: :not_found
+ end
+ end
+
+ def create
+ @review = Review.new(reviews_params)
+ @review.product_id = params[:product_id]
+
+ if @review.save
+ flash[:status] = :success
+ flash[:message] = "Thank you for reviewing this product!"
+ redirect_to product_path(params[:product_id]) # Back to the product show page
+ else
+ flash[:status] = :failure
+ flash[:message] = "Could not submit review. Please try again!"
+ flash[:errors] = @review.errors.messages
+ render :new, status: :bad_request
+ end
+ end
+
+ private
+
+ def reviews_params
+ params.require(:review).permit(:review, :rating)
+ end
+
+end
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
new file mode 100644
index 0000000000..25b5658c90
--- /dev/null
+++ b/app/controllers/sessions_controller.rb
@@ -0,0 +1,38 @@
+class SessionsController < ApplicationController
+
+ def login
+ auth_hash = request.env['omniauth.auth']
+
+ if auth_hash['uid']
+ merchant = Merchant.find_by(provider: params[:provider], uid: auth_hash['uid'])
+ if merchant.nil? # If merchant was not previously logged in
+ merchant = Merchant.from_auth_hash(params[:provider], auth_hash)
+ save_and_flash(merchant)
+ else # If merchant previously existed
+ session[:merchant_id] = merchant.id
+ flash[:status] = :success
+ flash[:message] = "Welcome back, #{merchant.username}"
+ end
+ session[:merchant_id] = merchant.id
+ session[:merchant_username] = merchant.username
+ else
+ flash[:status] = :failure
+ flash[:message] = "Failed to create a new user"
+ #TODO: Not sure if the root_path is the correct reroute if an oath uid is not provided
+ end
+
+ redirect_to root_path
+ end
+
+ def logout
+ if @login_merchant
+ session[:merchant_id] = nil
+ flash[:status] = :success
+ flash[:message] = "Successfully logged out!"
+ else
+ flash_unathorized
+ end
+ redirect_to root_path
+ end
+
+end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
new file mode 100644
index 0000000000..de6be7945c
--- /dev/null
+++ b/app/helpers/application_helper.rb
@@ -0,0 +1,2 @@
+module ApplicationHelper
+end
diff --git a/app/helpers/billing_infos_helper.rb b/app/helpers/billing_infos_helper.rb
new file mode 100644
index 0000000000..34d07a42b4
--- /dev/null
+++ b/app/helpers/billing_infos_helper.rb
@@ -0,0 +1,2 @@
+module BillingInfosHelper
+end
diff --git a/app/helpers/carts_helper.rb b/app/helpers/carts_helper.rb
new file mode 100644
index 0000000000..d99c380cb5
--- /dev/null
+++ b/app/helpers/carts_helper.rb
@@ -0,0 +1,2 @@
+module CartsHelper
+end
diff --git a/app/helpers/categories_helper.rb b/app/helpers/categories_helper.rb
new file mode 100644
index 0000000000..e06f31554c
--- /dev/null
+++ b/app/helpers/categories_helper.rb
@@ -0,0 +1,2 @@
+module CategoriesHelper
+end
diff --git a/app/helpers/main_helper.rb b/app/helpers/main_helper.rb
new file mode 100644
index 0000000000..826effed96
--- /dev/null
+++ b/app/helpers/main_helper.rb
@@ -0,0 +1,2 @@
+module MainHelper
+end
diff --git a/app/helpers/merchants_helper.rb b/app/helpers/merchants_helper.rb
new file mode 100644
index 0000000000..5337747b0f
--- /dev/null
+++ b/app/helpers/merchants_helper.rb
@@ -0,0 +1,2 @@
+module MerchantsHelper
+end
diff --git a/app/helpers/order_items_helper.rb b/app/helpers/order_items_helper.rb
new file mode 100644
index 0000000000..e197528ae1
--- /dev/null
+++ b/app/helpers/order_items_helper.rb
@@ -0,0 +1,2 @@
+module OrderItemsHelper
+end
diff --git a/app/helpers/orders_helper.rb b/app/helpers/orders_helper.rb
new file mode 100644
index 0000000000..443227fd48
--- /dev/null
+++ b/app/helpers/orders_helper.rb
@@ -0,0 +1,2 @@
+module OrdersHelper
+end
diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb
new file mode 100644
index 0000000000..ab5c42b325
--- /dev/null
+++ b/app/helpers/products_helper.rb
@@ -0,0 +1,2 @@
+module ProductsHelper
+end
diff --git a/app/helpers/reviews_helper.rb b/app/helpers/reviews_helper.rb
new file mode 100644
index 0000000000..682b7b1abc
--- /dev/null
+++ b/app/helpers/reviews_helper.rb
@@ -0,0 +1,2 @@
+module ReviewsHelper
+end
diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb
new file mode 100644
index 0000000000..309f8b2eb3
--- /dev/null
+++ b/app/helpers/sessions_helper.rb
@@ -0,0 +1,2 @@
+module SessionsHelper
+end
diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb
new file mode 100644
index 0000000000..a009ace51c
--- /dev/null
+++ b/app/jobs/application_job.rb
@@ -0,0 +1,2 @@
+class ApplicationJob < ActiveJob::Base
+end
diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb
new file mode 100644
index 0000000000..286b2239d1
--- /dev/null
+++ b/app/mailers/application_mailer.rb
@@ -0,0 +1,4 @@
+class ApplicationMailer < ActionMailer::Base
+ default from: 'from@example.com'
+ layout 'mailer'
+end
diff --git a/app/models/application_record.rb b/app/models/application_record.rb
new file mode 100644
index 0000000000..10a4cba84d
--- /dev/null
+++ b/app/models/application_record.rb
@@ -0,0 +1,3 @@
+class ApplicationRecord < ActiveRecord::Base
+ self.abstract_class = true
+end
diff --git a/app/models/category.rb b/app/models/category.rb
new file mode 100644
index 0000000000..7584521288
--- /dev/null
+++ b/app/models/category.rb
@@ -0,0 +1,6 @@
+class Category < ApplicationRecord
+ has_many :product_categories
+ has_many :products, through: :product_categories
+
+ validates :name, presence: true, uniqueness: true
+end
diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/app/models/merchant.rb b/app/models/merchant.rb
new file mode 100644
index 0000000000..69f71fe260
--- /dev/null
+++ b/app/models/merchant.rb
@@ -0,0 +1,41 @@
+class Merchant < ApplicationRecord
+ # Relationships
+ has_many :products, dependent: :destroy
+ has_many :order_items, through: :products
+ has_many :orders, through: :order_items
+
+ # Make sure to add and validate uid and provider when we get around to Oauth
+ validates :username, presence: true, uniqueness: true
+ validates :email, presence: true, uniqueness: true
+
+ def self.from_auth_hash(provider, auth_hash)
+ merchant = new
+ merchant.provider = provider
+ merchant.uid = auth_hash['uid']
+ merchant.email = auth_hash['info']['email']
+ merchant.username = auth_hash['info']['nickname']
+ return merchant
+ end
+
+ def orders_hash
+ data = {}
+ self.distinct_orders.each do |order|
+ data[order] = order.order_items.select { |oi| oi.merchant == self }
+ end
+ return data
+ end
+
+ def orders_hash_by_status(order_status)
+ var = self.orders_hash
+ return var.select{ |k,v| k.status == order_status}
+ end
+
+ def distinct_orders
+ return self.orders.distinct
+ end
+
+ def sum_ord_hash(order_status)
+ var = self.orders_hash_by_status(order_status)
+ return var.values.flatten.inject(0) {|sum, oi| sum + oi.line_item_total}
+ end
+end
diff --git a/app/models/order.rb b/app/models/order.rb
new file mode 100644
index 0000000000..333d2f83a3
--- /dev/null
+++ b/app/models/order.rb
@@ -0,0 +1,36 @@
+class Order < ApplicationRecord
+ CATEGORIES = %w(paid complete)
+ has_many :order_items
+ has_many :products, through: :order_items
+ has_one :payment
+
+ validates :status, presence: true
+
+ #TODO Test calculate total
+
+ #TODO Can we use line_item_total here?
+
+ def calculate_total
+ self.order_items.collect { |item| item.product.price * item.quantity}.sum
+ end
+
+ def ship_order
+ all_items = self.order_items
+ if all_items.empty?
+ return false
+ else
+ all_items.each do |order_item|
+ if order_item.shipped == false
+ return false
+ end
+ end
+ end
+ return true
+ end
+
+ def change_to_shipped
+ if self.ship_order
+ return self.status = "complete"
+ end
+ end
+end
diff --git a/app/models/order_item.rb b/app/models/order_item.rb
new file mode 100644
index 0000000000..b4a3d119ee
--- /dev/null
+++ b/app/models/order_item.rb
@@ -0,0 +1,17 @@
+class OrderItem < ApplicationRecord
+ # Relationships
+ belongs_to :product
+ belongs_to :order
+ has_one :merchant, through: :product
+
+ # Validations
+ validates_uniqueness_of :order_id, :scope => :product_id
+ validates :quantity, presence: true, numericality: { greater_than: 0}
+
+ def line_item_total
+ price = self.product.price
+ quantity = self.quantity
+ total = price * quantity
+ return total
+ end
+end
diff --git a/app/models/payment.rb b/app/models/payment.rb
new file mode 100644
index 0000000000..5ace6c87fc
--- /dev/null
+++ b/app/models/payment.rb
@@ -0,0 +1,23 @@
+class Payment < ApplicationRecord
+ has_one :order
+
+ validates :name, presence: { message: "Must include a name" }
+ validates :email, presence: { message: "Must have an email" }
+ validates :mailing_address, presence: { message: "Must have a mailing address" }
+ validates :cc_name, presence: { message: "Must have a credit card name" }
+ validates :cc_expiration, presence: { message: "Must have an expiration date" }
+ validate :expiration_date_cannot_be_in_the_past
+ validates :cc_number, presence: { message: "Must have a credit card number" }
+ validates :cc_number, format: { with: /\b\d{13,16}\b/, message: "Enter a valid credit card number" }
+ validates :cc_ccv, presence: { message: "Must include a ccv number" }
+ validates :cc_ccv, format: { with: /\b\d{3}\b/, message: "Must enter a valid CCV" }
+ validates :billing_zip, presence: { message: "Must include a billing zip code" }
+ validates :billing_zip, format: { with: /\b\d{5}\b/, message: "Enter a valid ZIP code" }
+
+ def expiration_date_cannot_be_in_the_past
+ if cc_expiration.present? && cc_expiration < Date.today
+ errors.add(:cc_expiration, "Expiration date can't be in the past")
+ end
+ end
+
+end
diff --git a/app/models/product.rb b/app/models/product.rb
new file mode 100644
index 0000000000..d92231e5af
--- /dev/null
+++ b/app/models/product.rb
@@ -0,0 +1,38 @@
+class Product < ApplicationRecord
+ belongs_to :merchant
+ has_many :reviews, dependent: :destroy
+ has_many :order_items, dependent: :destroy
+ has_many :orders, through: :order_items
+ has_many :product_categories, dependent: :destroy
+ has_many :categories, through: :product_categories
+
+ validates :name, presence: true, uniqueness: true
+ validates :price, presence: true, numericality: { greater_than: 0}
+ validates :inventory, presence: true, numericality: { greater_than_or_equal_to: 0}
+ validates :categories, presence: true
+
+ # TODO: Ask instructors if we need to state this validation b/c the relationship dictates that we need a merchant
+ validates :merchant, presence: true
+ accepts_nested_attributes_for :categories
+
+ def categories_attributes=(category_attributes)
+ category_attributes.values.each do |category_attribute|
+ category = Category.find_or_create_by(category_attribute)
+ if !self.categories.include? category
+ self.categories << category
+ end
+ end
+ end
+
+ def average_rating
+ if self.reviews.count > 0
+ total = 0.0
+ self.reviews.each do |r|
+ total += r.rating
+ end
+ total /= self.reviews.count
+ return total
+ end
+ end #def
+
+end #class
diff --git a/app/models/product_category.rb b/app/models/product_category.rb
new file mode 100644
index 0000000000..6a4b58aed9
--- /dev/null
+++ b/app/models/product_category.rb
@@ -0,0 +1,6 @@
+class ProductCategory < ApplicationRecord
+ belongs_to :product
+ belongs_to :category
+
+ validates_uniqueness_of :product_id, :scope => :category_id
+end
diff --git a/app/models/review.rb b/app/models/review.rb
new file mode 100644
index 0000000000..e38e79dc87
--- /dev/null
+++ b/app/models/review.rb
@@ -0,0 +1,5 @@
+class Review < ApplicationRecord
+ belongs_to :product
+
+ validates :rating, numericality: { only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 5 }
+end
diff --git a/app/views/.DS_Store b/app/views/.DS_Store
new file mode 100644
index 0000000000..86110446f4
Binary files /dev/null and b/app/views/.DS_Store differ
diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb
new file mode 100644
index 0000000000..07198bead6
--- /dev/null
+++ b/app/views/carts/show.html.erb
@@ -0,0 +1,40 @@
+
+
+
+ <% if @order_items.any? %>
+
Your Cart
+
Your Total: <%= number_to_currency current_order.calculate_total %>
+
The Gear You are Looking for
+ <%= link_to "Checkout", "/orders/#{current_order.id}/payments/new", class: 'button large' %>
+ <% else %>
+
I find your lack of items disturbing...
+ <%= image_tag'darth-vader-faith.jpg'%>
+
+ <%end %>
+
+
+
+ <% if @order_items.any? %>
+ <% @order_items.each do |item| %>
+
+
+

/>
+
+
+
+
Unit Price: <%= number_to_currency item.product.price %> | Quantity: <%= item.quantity %>
+
Total Price: <%= number_to_currency (item.product.price * item.quantity) %>
+ <%= form_for item do |f| %>
+ <%= f.select :quantity, 1..item.product.inventory %>
+ <%= f.submit %>
+ <% end %>
+
+ <%= button_to "Delete", order_item_path(item), method: :delete %>
+
+
+
+ <% end %>
+
+ <% end %>
+
+
diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb
new file mode 100644
index 0000000000..c0dfbaeeba
--- /dev/null
+++ b/app/views/categories/index.html.erb
@@ -0,0 +1 @@
+This is the index of all categories page!
diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb
new file mode 100644
index 0000000000..1faadec70e
--- /dev/null
+++ b/app/views/categories/show.html.erb
@@ -0,0 +1 @@
+THis is the category show page as a place holder for the categories/id/products
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
new file mode 100644
index 0000000000..24937bd17d
--- /dev/null
+++ b/app/views/layouts/application.html.erb
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
<%= content_for?(:title) ? yield(:title) : "StarMart" %>
+
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
+ <%= javascript_include_tag "application", 'data-turbolinks-track' => true %>
+ <%= csrf_meta_tags %>
+ <%= favicon_link_tag 'favicon_red.png'%>
+
+
+
+
+ <%############### CATEGORIES NAVIGATION #################### %>
+
+ <%# Need to utilize %>
+
+
+ <%############### HERO HEADER #################### %>
+
+
+
+
+ <%= link_to root_path do %>
+
STARMART
+ <% end %>
+
+
+
+
+ <%############### FLASH MESSAGES #################### %>
+
+
+
+ <% if flash[:status] == :failure %>
+ <%= "A problem occurred: #{flash[:message]}" %>
+ <% if flash[:details] %>
+
+ <% flash[:details].each do |errors_array| %>
+ <% errors_array[1].each do |error| %>
+ - <%= error %>
+ <% end %>
+ <% end %>
+ <% end %>
+
+ <% else %>
+ <%= flash[:message] %>
+ <% end %>
+
+
+
+
+ <%############### MAIN CONTENT #################### %>
+
+ <%= yield %>
+
+ <%############### STAR WARS OPENING #################### %>
+
+ <%# TODO: ADD THE STAR WARS THEME HERE IF TIME
+
+
+
+ <%############### FOOTER #################### %>
+
+
+
+
+
+
diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb
new file mode 100644
index 0000000000..cbd34d2e9d
--- /dev/null
+++ b/app/views/layouts/mailer.html.erb
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+ <%= yield %>
+
+
diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb
new file mode 100644
index 0000000000..37f0bddbd7
--- /dev/null
+++ b/app/views/layouts/mailer.text.erb
@@ -0,0 +1 @@
+<%= yield %>
diff --git a/app/views/main/index.html.erb b/app/views/main/index.html.erb
new file mode 100644
index 0000000000..157a82ffc0
--- /dev/null
+++ b/app/views/main/index.html.erb
@@ -0,0 +1,19 @@
+
+
+
+
+ <% if Product.any? %>
+ <% product = Product.first %>
+
+ <%= link_to image_tag(product.photo_url), product_path(product), class:"padding", alt:"#{product.name}" %>
+
+ <%= product.name %>
+ <%= number_to_currency product.price %>
+ <% else %>
+ Products coming soon!
+ <% end %>
+
+
+
diff --git a/app/views/merchants/products.html.erb b/app/views/merchants/products.html.erb
new file mode 100644
index 0000000000..1b7e0624e4
--- /dev/null
+++ b/app/views/merchants/products.html.erb
@@ -0,0 +1,39 @@
+
+
+ <%= @merchant.username %>'s Products
+ <% if @access %>
+ <%= link_to "Add Product", new_product_path, class: "button"%>
+ <% end %>
+
+
+ <% unless @products.empty? %>
+
+
+
+ | Name |
+ Inventory |
+ Img |
+ <% if @access %>
+   |
+ <% end %>
+
+
+
+ <% @products.each do |product| %>
+
+ | <%= link_to product.name, product_path(product) %> |
+ <%= product.inventory %> |
+ <%= image_tag product.photo_url, class:"thumbnail mini"%> |
+ <% if @access %>
+ <%= link_to "Edit", edit_product_path(product)%> |
+ <% end %>
+
+ <% end %>
+
+
+ <% else %>
+
+ No Products: Merchant has no products.
+
+ <% end %>
+
diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb
new file mode 100644
index 0000000000..c7f607c228
--- /dev/null
+++ b/app/views/merchants/show.html.erb
@@ -0,0 +1,47 @@
+
+
+ Your Dashboard <%= @login_merchant.username %>
+ Member Since <%= @login_merchant.created_at.strftime("%e %b %Y")%>
+ <%= link_to "Manage Orders", merchant_orders_path(@login_merchant), class: "button" %>
+ <%= link_to "Manage Products", merchant_products_path(@login_merchant), class: "button"%>
+ <%# payment_path(payment_id) %>
+
+
+ <% if @merchant.products.empty? %>
+ Please add products!
+ <% end %>
+
+
+
+
+ |
+ Summary
+ |
+
+
+
+
+
+
+ |   |
+ Revenue |
+ Orders |
+
+
+ | Unfulfilled Orders |
+ <%= number_to_currency(@unfufilled_revenue)%> |
+ <%= @unfufilled%> |
+
+
+ | Completed Orders |
+ <%= number_to_currency(@complete_revenue)%> |
+ <%= @complete%> |
+
+
+ | Total |
+ <%=number_to_currency(@total_revenue)%> |
+ <%= @total%> |
+
+
+
+
diff --git a/app/views/orders/_orderstable.html.erb b/app/views/orders/_orderstable.html.erb
new file mode 100644
index 0000000000..be792373d4
--- /dev/null
+++ b/app/views/orders/_orderstable.html.erb
@@ -0,0 +1,62 @@
+<% if !orders_hash.empty? %>
+ <% orders_hash.keys.each do |order| %>
+
+
+
+
+ Order ID: <%= order.id %>
+ <% if order.status == 'paid' %>
+ <%= image_tag 'darth-maul.png', class: "orderindex" %>
+ <% else %>
+ <%= image_tag 'qui-gon-jinn.png', class: "orderindex" %>
+ <% end %>
+ |
+
+
+ | PRODUCTS |
+ QUANTITY |
+ TOTAL |
+ SHIPPED |
+
+ <% orders_hash[order].each do |oi| %>
+
+ | <%= link_to oi.product.name, product_path(oi.product)%> |
+ <%= oi.quantity %> |
+ <%= number_to_currency(oi.line_item_total) %> |
+ <% if oi.shipped == false %>
+
+ <%= link_to "Ship", ship_order_item_path(oi), method: :patch %>
+ |
+ <% else %>
+
+ Item Sent!
+ |
+ <% end %>
+
+ <% end %>
+
+ |
+
+ ORDER DETAILS
+ |
+ |
+ |
+
+
+
+
+
+ | Placed: <%= order.payment.created_at.strftime("%e %b %Y") %> |
+ <% if order.status == "paid" %>
+ Status: <%= order.status.capitalize %> |
+ <%elsif order.status == "complete" %>
+ Status: <%= order.status.capitalize %> |
+ <% end %>
+ Total: <%= number_to_currency(orders_hash[order].inject(0) {|sum, oi| sum + oi.line_item_total})%> |
+ <%= link_to "Shipping Info", payment_path(order.payment) %> |
+
+
+ <% end %>
+<% else %>
+
NO ORDERS HAVE BEEN PLACED!
+<% end %>
diff --git a/app/views/orders/cart.html.erb b/app/views/orders/cart.html.erb
new file mode 100644
index 0000000000..6475d6958e
--- /dev/null
+++ b/app/views/orders/cart.html.erb
@@ -0,0 +1,9 @@
+
+
+
+ Your Subtotal:
+
+ <%= link_to "Checkout", order_path(order(:id)), class: "button" %>
+
diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb
new file mode 100644
index 0000000000..69d6dc005e
--- /dev/null
+++ b/app/views/orders/index.html.erb
@@ -0,0 +1,18 @@
+
+
+ <%= @merchant.username %> orders
+
+ <% unless @orders.empty? %>
+ <%= render partial: "orderstable", locals: {
+ orders_hash: @paid_orders_hash
+ } %>
+
+ <%= render partial: "orderstable", locals: {
+ orders_hash: @complete_orders_hash
+ } %>
+ <% else %>
+
+ No Orders: Merchant hasn't sold any products.
+
+ <% end %>
+
diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb
new file mode 100644
index 0000000000..d96ecbd604
--- /dev/null
+++ b/app/views/orders/show.html.erb
@@ -0,0 +1,41 @@
+
+
+
+
+ Your Order
+ Your Total: <%= number_to_currency @order.calculate_total %>
+ Order placed: <%= @order.payment.created_at.strftime("%B %d,%Y") %>
+
+
+
+
+ <% if @order.products.any? %>
+ <% @order.products.each do |product| %>
+
+
+

/>
+
+
+
+ <% item = OrderItem.find_by(product_id: product.id, order_id: @order.id) %>
+
Unit Price: <%= number_to_currency product.price %>
+
Quantity: <%= item.quantity %>
+
Total Price: <%= number_to_currency (product.price * item.quantity) %>
+
+ <% if item.shipped %>
+
Item has been shipped
+ <% else %>
+
Item not yet shipped
+ <% end %>
+
+
+
+ <% end %>
+
+ <% else %>
+
+ Your order is empty.
+
+ <% end %>
+
+
diff --git a/app/views/payments/_form.html.erb b/app/views/payments/_form.html.erb
new file mode 100644
index 0000000000..a55463d75a
--- /dev/null
+++ b/app/views/payments/_form.html.erb
@@ -0,0 +1,31 @@
+
diff --git a/app/views/payments/new.html.erb b/app/views/payments/new.html.erb
new file mode 100644
index 0000000000..8289ef8d17
--- /dev/null
+++ b/app/views/payments/new.html.erb
@@ -0,0 +1,9 @@
+
+
+
+
+ <%= render partial: "form" %>
+
+
diff --git a/app/views/payments/show.html.erb b/app/views/payments/show.html.erb
new file mode 100644
index 0000000000..00f9bd8b39
--- /dev/null
+++ b/app/views/payments/show.html.erb
@@ -0,0 +1,23 @@
+
+ Shipping Information
+
+
+
+
+
+ | Name
+ | Email
+ | Mailing Address |
+ Last four of Credit Card |
+ Credit Card Expiration |
+
+
+ | <%= @payment.name %> |
+ <%= @payment.email %> |
+ <%= @payment.mailing_address %> |
+ <%= @payment.cc_number.split(//).last(4).join %> |
+ <%= @payment.cc_expiration %> |
+
+
+
+
diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb
new file mode 100644
index 0000000000..8956d9b972
--- /dev/null
+++ b/app/views/products/_form.html.erb
@@ -0,0 +1,30 @@
+
+
+
diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb
new file mode 100644
index 0000000000..e81b542989
--- /dev/null
+++ b/app/views/products/edit.html.erb
@@ -0,0 +1,8 @@
+
+
+
+ <%= render partial: "form" %>
+
+
diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb
new file mode 100644
index 0000000000..9869788b44
--- /dev/null
+++ b/app/views/products/index.html.erb
@@ -0,0 +1,42 @@
+
+
+
+
+ <%= @category.name %>
+
+
+ <% if @products.any? %>
+
+ <% @products.each do |product| %>
+
+
+
+ <%= link_to image_tag(product.photo_url), product_path(product) %>
+
<%= product.name %>
+
<%= number_to_currency product.price %>
+
+ <% if product.inventory <1 %>
+
<%= "This product is not available in stock right now" %>
+ <% else %>
+ <%= form_for @order_item do |f| %>
+ <%= f.hidden_field :product_id, value: product.id %>
+ <%= f.select :quantity, 1..product.inventory %>
+
+ <%= f.submit "Add to cart" %>
+ <% end %>
+ <% end %>
+
+
+
+
+
+ <% end %>
+
+ <% else %>
+
+
These are not the products you are looking for...
+
+ <% end %>
+