+
+<%else%>
+ everything is empty
+<% end %>
+
+
\ No newline at end of file
diff --git a/app/views/shared/_feed.html.erb b/app/views/shared/_feed.html.erb
new file mode 100644
index 0000000..d09e411
--- /dev/null
+++ b/app/views/shared/_feed.html.erb
@@ -0,0 +1,10 @@
+<%= form_tag("", :method => "post") do %>
+ <%= hidden_field_tag "challenge_id", @challenge_id %>
+
+ <%= text_area_tag(:feed_text, nil, :cols => "80", :rows => "8" ) %>
+
+ <%= recaptcha_tags %>
+ <%= image_submit_tag("post_button.png", :name =>"Submit", :alt => "Submit") %>
+
+<% end %>
+
diff --git a/app/views/shared/_reply.html.erb b/app/views/shared/_reply.html.erb
new file mode 100644
index 0000000..47faf75
--- /dev/null
+++ b/app/views/shared/_reply.html.erb
@@ -0,0 +1,15 @@
+
+
+
+<%= form_tag("new_reply", :method => "post") do %>
+ <%= hidden_field_tag "challenge_id", @challenge_id %>
+ <%= hidden_field_tag "feeditem_id", @feeditem_id %>
+
+ <%= text_area_tag("reply_text", nil, :cols => "80", :rows => "8" ) %>
+
+
+ <%= image_submit_tag("post_button.png", :name =>"Submit", :alt => "Submit") %>
+
+ <%= recaptcha_tags %>
+<% end %>
+
diff --git a/config/application.rb b/config/application.rb
index 8bbd9af..a27634b 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -1,11 +1,14 @@
require File.expand_path('../boot', __FILE__)
# Pick the frameworks you want:
-# require "active_record/railtie"
+require "active_record/railtie" #require a local db for captcha, etc.
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "sprockets/railtie"
+
+require 'net/http' #otherwise, it causes error with recaptcha
+
# require "rails/test_unit/railtie"
if defined?(Bundler)
diff --git a/config/cucumber.yml b/config/cucumber.yml
new file mode 100644
index 0000000..19b288d
--- /dev/null
+++ b/config/cucumber.yml
@@ -0,0 +1,8 @@
+<%
+rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
+rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
+std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags ~@wip"
+%>
+default: <%= std_opts %> features
+wip: --tags @wip:3 --wip features
+rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip
diff --git a/config/database.yml b/config/database.yml
new file mode 100644
index 0000000..cf8e135
--- /dev/null
+++ b/config/database.yml
@@ -0,0 +1,29 @@
+# SQLite version 3.x
+# gem install sqlite3
+#
+# Ensure the SQLite 3 gem is defined in your Gemfile
+# gem 'sqlite3'
+development:
+ adapter: sqlite3
+ database: db/development.sqlite3
+ pool: 5
+ timeout: 5000
+
+# Warning: The database defined as "test" will be erased and
+# re-generated from your development database when you run "rake".
+# Do not set this db to the same as development or production.
+test: &test
+ adapter: sqlite3
+ database: db/test.sqlite3
+ pool: 5
+ timeout: 5000
+
+production:
+ adapter: sqlite3
+ database: db/production.sqlite3
+ pool: 5
+ timeout: 5000
+
+
+cucumber:
+ <<: *test
\ No newline at end of file
diff --git a/config/databasedotcom.yml b/config/databasedotcom.yml
index 44c8a09..fb09389 100644
--- a/config/databasedotcom.yml
+++ b/config/databasedotcom.yml
@@ -1,3 +1,8 @@
client_id: 3MVG9QDx8IX8nP5RpaLJu2y8S4P3.C_na8FcsrAEJ228sG2hQHTcHblZp64brTxaQAib75.GzrFlygjto2VXU
client_secret: 7527222527070255933
-debugging: true
\ No newline at end of file
+
+version: 23.0
+debugging: true
+
+username: mess@cloudspokes.com.dev091
+password: 74H3yd2NZW
\ No newline at end of file
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 16f09d0..c8a4d6e 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -28,3 +28,9 @@
# Expands the lines which load the assets
config.assets.debug = true
end
+
+# for localhost Captcha
+Recaptcha.configure do |config|
+ config.public_key = '6LdXJckSAAAAAMUlEYKNC8sFjZz-BqYKQc5sySUW'
+ config.private_key = '6LdXJckSAAAAAEbEEW1XOGeaI_66wq6a4zLFUhmR'
+end
diff --git a/config/environments/production.rb b/config/environments/production.rb
index e65c6bf..83d8964 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -15,7 +15,7 @@
config.assets.compress = true
# Don't fallback to assets pipeline if a precompiled asset is missed
- config.assets.compile = false
+ config.assets.compile = true
# Generate digests for assets URLs
config.assets.digest = true
@@ -58,3 +58,9 @@
# Send deprecation notices to registered listeners
config.active_support.deprecation = :notify
end
+
+# for Heroku
+Recaptcha.configure do |config|
+ config.public_key = '6LcrJckSAAAAAK18jvSAjamzsltV5czan8rQCWEI'
+ config.private_key = '6LcrJckSAAAAACNRvbPijU4907NgMsQzD2xzz3vG'
+end
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index f5c50fe..03b8fe2 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,11 +1,23 @@
Cloudspokes::Application.routes.draw do
root to: 'content#show', id: 'home'
match "/:id", to: "content#show", as: "content"
+
+ match '/members/index' => 'members#index'
+ match "/members/:id" => "members#show"
+ resources :members, :only => [:index, :new, :create, :show]
+
+ get "/challenges/new_reply" => "challenges#new_reply"
+ post "/challenges/new_reply" => "challenges#do_new_reply"
+ match '/challenges/index' => 'challenges#index'
+ post "/challenges/:id" => "challenges#do_new_post_feed"
+ match "/challenges/:id" => "challenges#show"
- get 'challenges/index'
+ match '/simple_captcha(/:action)' => 'simple_captcha', :as => :simple_captcha
+
get 'sessions/login'
get 'sessions/sfdcauth'
match '/auth/:provider/callback', :to => 'sessions#create'
- match '/auth/failure', :to => 'sessions#failure'
+ match '/auth/failure', :to => 'sessions#failure'
+
end
diff --git a/db/schema.rb b/db/schema.rb
new file mode 100644
index 0000000..932dd45
--- /dev/null
+++ b/db/schema.rb
@@ -0,0 +1,16 @@
+# encoding: UTF-8
+# This file is auto-generated from the current state of the database. Instead
+# of editing this file, please use the migrations feature of Active Record to
+# incrementally modify your database, and then regenerate this schema definition.
+#
+# Note that this schema.rb definition is the authoritative source for your
+# database schema. If you need to create the application database on another
+# system, you should be using db:schema:load, not running all the migrations
+# from scratch. The latter is a flawed and unsustainable approach (the more migrations
+# you'll amass, the slower it'll run and the greater likelihood for issues).
+#
+# It's strongly recommended to check this file into your version control system.
+
+ActiveRecord::Schema.define(:version => 20111016003212) do
+
+end
diff --git a/features/cloudspokes.feature b/features/cloudspokes.feature
new file mode 100644
index 0000000..2376254
--- /dev/null
+++ b/features/cloudspokes.feature
@@ -0,0 +1,11 @@
+Feature: CloudSpoke Website
+ Basic steps for the "Challenge" function
+
+ Scenario: View home page
+ Given I am on the home page
+ Then I should see "Join Us"
+
+ Scenario: Visit challenge index page
+ Given I am on the home page
+ When I click "Challenges"
+ Then I should see "List of Challenges"
diff --git a/features/step_definitions/web_steps.rb b/features/step_definitions/web_steps.rb
new file mode 100644
index 0000000..da15655
--- /dev/null
+++ b/features/step_definitions/web_steps.rb
@@ -0,0 +1,19 @@
+Given /^I am on the home page$/ do
+ visit "/"
+end
+
+Given /^I am on the member detail page$/ do
+ visit "/members\/\S+"
+end
+
+Then /^I should see "([^"]*)"$/ do |text|
+ page.should have_content text
+end
+
+Then /^I should see image "([^"]*)"$/ do |image|
+ page.should have_xpath("//img[@src=\"/assets/#{image}\"]")
+end
+
+When /^I click "([^"]*)"$/ do |element|
+ click_on element
+end
\ No newline at end of file
diff --git a/features/support/env.rb b/features/support/env.rb
new file mode 100644
index 0000000..6c40c8f
--- /dev/null
+++ b/features/support/env.rb
@@ -0,0 +1,50 @@
+# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
+# It is recommended to regenerate this file in the future when you upgrade to a
+# newer version of cucumber-rails. Consider adding your own code to a new file
+# instead of editing this one. Cucumber will automatically load all features/**/*.rb
+# files.
+
+require 'cucumber/rails'
+
+# Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In
+# order to ease the transition to Capybara we set the default here. If you'd
+# prefer to use XPath just remove this line and adjust any selectors in your
+# steps to use the XPath syntax.
+Capybara.default_selector = :css
+
+# By default, any exception happening in your Rails application will bubble up
+# to Cucumber so that your scenario will fail. This is a different from how
+# your application behaves in the production environment, where an error page will
+# be rendered instead.
+#
+# Sometimes we want to override this default behaviour and allow Rails to rescue
+# exceptions and display an error page (just like when the app is running in production).
+# Typical scenarios where you want to do this is when you test your error pages.
+# There are two ways to allow Rails to rescue exceptions:
+#
+# 1) Tag your scenario (or feature) with @allow-rescue
+#
+# 2) Set the value below to true. Beware that doing this globally is not
+# recommended as it will mask a lot of errors for you!
+#
+ActionController::Base.allow_rescue = false
+
+# Remove/comment out the lines below if your app doesn't have a database.
+# For some databases (like MongoDB and CouchDB) you may need to use :truncation instead.
+begin
+ DatabaseCleaner.strategy = :transaction
+rescue NameError
+ raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
+end
+
+# You may also want to configure DatabaseCleaner to use different strategies for certain features and scenarios.
+# See the DatabaseCleaner documentation for details. Example:
+#
+# Before('@no-txn,@selenium,@culerity,@celerity,@javascript') do
+# DatabaseCleaner.strategy = :truncation, {:except => %w[widgets]}
+# end
+#
+# Before('~@no-txn', '~@selenium', '~@culerity', '~@celerity', '~@javascript') do
+# DatabaseCleaner.strategy = :transaction
+# end
+#
diff --git a/features/support/paths.rb b/features/support/paths.rb
new file mode 100644
index 0000000..e69de29
diff --git a/lib/challenge_feeds.rb b/lib/challenge_feeds.rb
new file mode 100644
index 0000000..e58226c
--- /dev/null
+++ b/lib/challenge_feeds.rb
@@ -0,0 +1,43 @@
+class ChallengeFeeds
+
+ # get EntitySubscription associated between a Connection User and a Challenge (query_filter)
+ # usage:
+ # @entity_subscription = ChallengeFeeds.get_entity_subscription(dbdc_client, connection_user_id, "and ParentId='#{@challenge_id}'")
+ def self.get_entity_subscription (client, user_id, query_filter)
+ client.materialize('EntitySubscription')
+
+ # Safe max count is 500, >1000 exceeds salesforce non-admin limitation
+ subscribed = EntitySubscription.query("subscriberid ='#{user_id}' #{query_filter} limit 1")
+ return subscribed
+ end
+
+
+ # usage:
+ # @feeds = ChallengeFeeds.challenge_feeds(dbdc_client, @challenge_id)
+ def self.challenge_feeds(client, challenge_id)
+ chf = client.materialize('Challenge__Feed')
+ # Safe max count is 500, >1000 exceeds salesforce non-admin limitation
+ feeds = Challenge__Feed.query("parentId='#{challenge_id}' limit 500")
+ #puts "### Found #{feeds.size.to_s} Feeds"
+ return feeds
+ end
+
+ def self.post_feed(client, challenge_id, comment)
+ client.materialize('FeedItem')
+ post = FeedItem.new()
+ post.ParentId = challenge_id
+ post.Body = comment
+
+ status = post.save()
+ puts status
+ end
+
+ def self.post_comment (client, feeditem_id, reply_text)
+ client.materialize('FeedComment')
+ fcomment = FeedComment.new()
+ fcomment.FeedItemId = feeditem_id
+ fcomment.CommentBody = reply_text
+ status = fcomment.save()
+ puts status
+ end
+end
\ No newline at end of file
diff --git a/lib/challenges.rb b/lib/challenges.rb
index ba7d3ba..8c98b8f 100644
--- a/lib/challenges.rb
+++ b/lib/challenges.rb
@@ -3,11 +3,75 @@ class Challenges
include HTTParty
format :json
- headers 'Content-Type' => 'application/json'
- headers 'Authorization' => "OAuth #{ENV['access_token']}"
+ #headers 'Content-Type' => 'application/json'
+ #headers 'Authorization' => "OAuth #{ENV['access_token']}"
+ #headers 'Authorization' => "OAuth 00DU0000000IrOZ!ARoAQI7NAhR69k2y1T14aNdYWlf4.MLRoDQ4gt0OTEFB8.0bU8ilH7fv3TTuOGX9C86BwIwvfRNyHAi72XGslMfE0gJOVFVU"
- def self.get_challenges()
- get('https://na12.salesforce.com/services/apexrest/v.9/challenges')
+ def self.set_headers
+ headers 'Content-Type' => 'application/json'
+ headers 'Authorization' => "OAuth #{ENV['access_token']}"
+ puts '### using auth token: ' + ENV['access_token']
+ end
+ #get all Challenges
+ def self.get_challenges()
+ set_headers()
+ url = ENV['instance_url'] + '/services/apexrest/v.9/challenges'
+ result = get(url)
+ return result
end
+
+ #show a single Challenge
+ def self.show_challenge(challenge_id)
+ set_headers()
+ #apex web service
+ #get("https://na12.salesforce.com/services/apexrest/v.9/challenges/#{challenge_id}")
+ #This shows more details than the Apex webservice
+ url = ENV['instance_url'] + "/services/data/v#{ENV['api_version']}/sobjects/Challenge__c/#{challenge_id}"
+ get(url)
+ end
+
+ #show all Categories associated with a single Challenge
+ def self.show_challenge_categories_summary(challenge_id)
+ set_headers()
+ get(ENV['instance_url'] + "/services/apexrest/v.9/challenges/#{challenge_id}/categories")
+ end
+
+
+ # TODO, one of following is better
+ #show a single Category associated with a single Challenge
+ def self.show_challenge_category_detail(category_id, challenge_id)
+ set_headers()
+ get(ENV['instance_url'] + "/services/apexrest/v.9/challenges/#{challenge_id}/categories/#{category_id}")
+ end
+ #show a single Category associated with a single Challenge, This is better and shows more details.
+ def self.show_challenge_category_detail(category_id)
+ set_headers()
+ get(ENV['instance_url'] + "/services/data/v#{ENV['api_version']}/sobjects/Challenge_Category__c/#{category_id}")
+ end
+
+
+ #show all Prizes associated with a single Challenge
+ def self.show_challenge_prizes_summary(challenge_id)
+ set_headers()
+ get(ENV['instance_url'] + "/services/apexrest/v.9/challenges/#{challenge_id}/prizes")
+ end
+
+ #show a single Prize associated with a single Challenge
+ def self.show_challenge_prize_detail(challenge_id, prize_id)
+ set_headers()
+ get(ENV['instance_url'] + "/services/apexrest/v.9/challenges/#{challenge_id}/prizes/#{prize_id}")
+ end
+
+ #show all Reviewers associated with a single Challenge
+ def self.show_challenge_reviewers_summary(challenge_id)
+ set_headers()
+ get(ENV['instance_url'] + "/services/apexrest/v.9/challenges/#{challenge_id}/prizes")
+ end
+
+ #show a single Reviewer associated with a single Challenge
+ def self.show_challenge_reviewer_detail(challenge_id, reviewer_id)
+ set_headers()
+ get(ENV['instance_url'] + "/services/apexrest/v.9/challenges/#{challenge_id}/prizes/#{reviewer_id}")
+ end
end
\ No newline at end of file
diff --git a/lib/members.rb b/lib/members.rb
new file mode 100644
index 0000000..427d64d
--- /dev/null
+++ b/lib/members.rb
@@ -0,0 +1,41 @@
+class Members
+
+ include HTTParty
+ format :json
+
+ def self.set_headers
+ headers 'Content-Type' => 'application/json'
+ headers 'Authorization' => "OAuth #{ENV['access_token']}"
+ puts '### using auth token: ' + ENV['access_token']
+ end
+
+ #get all Members
+ def self.get_members()
+ set_headers()
+ url = ENV['instance_url'] + '/services/apexrest/v.9/members'
+ result = get(url)
+ return result
+ end
+
+ #show a single Member
+ def self.show_member(member_name)
+ set_headers()
+ #apex web service
+ #get("https://na12.salesforce.com/services/apexrest/v.9/challenges/#{challenge_id}")
+ #This shows more details than the Apex webservice
+ url = ENV['instance_url'] + "/services/apexrest/v.9/members?search=#{member_name}"
+ result = get(url)
+ member_url = ENV['instance_url'] + result[0]['attributes']['url']
+ # now get the real member
+ member_detail = get(member_url)
+ return member_detail
+ end
+
+ def self.show_member_detail_by_id(member_id)
+ set_headers()
+ url = ENV['instance_url'] + "/services/data/v22.0/sobjects/Member__c/#{member_id}"
+ result = get(url)
+ return result
+ end
+
+end
\ No newline at end of file
diff --git a/lib/tasks/cucumber.rake b/lib/tasks/cucumber.rake
new file mode 100644
index 0000000..83f7947
--- /dev/null
+++ b/lib/tasks/cucumber.rake
@@ -0,0 +1,65 @@
+# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
+# It is recommended to regenerate this file in the future when you upgrade to a
+# newer version of cucumber-rails. Consider adding your own code to a new file
+# instead of editing this one. Cucumber will automatically load all features/**/*.rb
+# files.
+
+
+unless ARGV.any? {|a| a =~ /^gems/} # Don't load anything when running the gems:* tasks
+
+vendored_cucumber_bin = Dir["#{Rails.root}/vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
+$LOAD_PATH.unshift(File.dirname(vendored_cucumber_bin) + '/../lib') unless vendored_cucumber_bin.nil?
+
+begin
+ require 'cucumber/rake/task'
+
+ namespace :cucumber do
+ Cucumber::Rake::Task.new({:ok => 'db:test:prepare'}, 'Run features that should pass') do |t|
+ t.binary = vendored_cucumber_bin # If nil, the gem's binary is used.
+ t.fork = true # You may get faster startup if you set this to false
+ t.profile = 'default'
+ end
+
+ Cucumber::Rake::Task.new({:wip => 'db:test:prepare'}, 'Run features that are being worked on') do |t|
+ t.binary = vendored_cucumber_bin
+ t.fork = true # You may get faster startup if you set this to false
+ t.profile = 'wip'
+ end
+
+ Cucumber::Rake::Task.new({:rerun => 'db:test:prepare'}, 'Record failing features and run only them if any exist') do |t|
+ t.binary = vendored_cucumber_bin
+ t.fork = true # You may get faster startup if you set this to false
+ t.profile = 'rerun'
+ end
+
+ desc 'Run all features'
+ task :all => [:ok, :wip]
+
+ task :statsetup do
+ require 'rails/code_statistics'
+ ::STATS_DIRECTORIES << %w(Cucumber\ features features) if File.exist?('features')
+ ::CodeStatistics::TEST_TYPES << "Cucumber features" if File.exist?('features')
+ end
+ end
+ desc 'Alias for cucumber:ok'
+ task :cucumber => 'cucumber:ok'
+
+ task :default => :cucumber
+
+ task :features => :cucumber do
+ STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
+ end
+
+ # In case we don't have ActiveRecord, append a no-op task that we can depend upon.
+ task 'db:test:prepare' do
+ end
+
+ task :stats => 'cucumber:statsetup'
+rescue LoadError
+ desc 'cucumber rake task not available (cucumber not installed)'
+ task :cucumber do
+ abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
+ end
+end
+
+end
diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties
new file mode 100644
index 0000000..cb5ab44
--- /dev/null
+++ b/nbproject/private/private.properties
@@ -0,0 +1 @@
+rails.servertype=WEBRICK
diff --git a/nbproject/private/rake-d.txt b/nbproject/private/rake-d.txt
new file mode 100644
index 0000000..08db776
--- /dev/null
+++ b/nbproject/private/rake-d.txt
@@ -0,0 +1,92 @@
+about=List versions of all Rails frameworks and the environment
+assets\:clean=Remove compiled assets
+assets\:precompile=Compile all the assets named in config.assets.precompile
+db\:abort_if_pending_migrations=
+db\:charset=
+db\:collation=
+db\:create=Create the database from config/database.yml for the current Rails.env (use db:create:all to create all dbs in the config)
+db\:create\:all=
+db\:drop=Drops the database for the current Rails.env (use db:drop:all to drop all databases)
+db\:drop\:all=
+db\:fixtures\:identify=
+db\:fixtures\:load=Load fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y. Load from subdirectory in test/fixtures using FIXTURES_DIR=z. Specify an alternative path (eg. spec/fixtures) using FIXTURES_PATH=spec/fixtures.
+db\:forward=
+db\:load_config=
+db\:migrate=Migrate the database (options: VERSION=x, VERBOSE=false).
+db\:migrate\:down=
+db\:migrate\:redo=
+db\:migrate\:reset=
+db\:migrate\:status=Display status of migrations
+db\:migrate\:up=
+db\:reset=
+db\:rollback=Rolls the schema back to the previous version (specify steps w/ STEP=n).
+db\:schema\:dump=Create a db/schema.rb file that can be portably used against any DB supported by AR
+db\:schema\:load=Load a schema.rb file into the database
+db\:seed=Load the seed data from db/seeds.rb
+db\:sessions\:clear=
+db\:sessions\:create=
+db\:setup=Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the db first)
+db\:structure\:dump=Dump the database structure to an SQL file
+db\:test\:clone=
+db\:test\:clone_structure=
+db\:test\:load=
+db\:test\:prepare=
+db\:test\:purge=
+db\:version=Retrieves the current schema version number
+default=
+doc=
+doc/api=
+doc/api/index.html=
+doc/app=
+doc/app/index.html=
+doc\:app=Generate docs for the app -- also available doc:rails, doc:guides, doc:plugins (options: TEMPLATE=/rdoc-template.rb, TITLE="Custom Title")
+doc\:clobber=
+doc\:clobber_app=
+doc\:clobber_plugins=
+doc\:clobber_rails=
+doc\:guides=
+doc\:plugins=
+doc\:rails=
+doc\:reapp=
+doc\:rerails=
+environment=
+log\:clear=Truncates all *.log files in log/ to zero bytes
+middleware=Prints out your Rack middleware stack
+noop=
+notes=Enumerate all annotations (use notes:optimize, :fixme, :todo for focus)
+notes\:custom=Enumerate a custom annotation, specify with ANNOTATION=CUSTOM
+notes\:fixme=
+notes\:optimize=
+notes\:todo=
+rails\:template=Applies the template supplied by LOCATION=(/path/to/template) or URL
+rails\:templates\:copy=
+rails\:update=Update configs and some other initially generated files (or use just update:configs, update:scripts, or update:application_controller)
+rails\:update\:application_controller=
+rails\:update\:configs=
+rails\:update\:scripts=
+rails_env=
+railties\:install\:migrations=
+routes=Print out all defined routes in match order, with names. Target specific controller with CONTROLLER=x.
+secret=Generate a cryptographically secure secret key (this is typically used to generate a secret for cookie sessions).
+spec=Run all specs in spec directory (excluding plugin specs)
+spec\:controllers=Run the code examples in spec/controllers
+spec\:helpers=Run the code examples in spec/helpers
+spec\:lib=Run the code examples in spec/lib
+spec\:mailers=Run the code examples in spec/mailers
+spec\:models=Run the code examples in spec/models
+spec\:rcov=Run all specs with rcov
+spec\:requests=Run the code examples in spec/requests
+spec\:routing=Run the code examples in spec/routing
+spec\:statsetup=
+spec\:views=Run the code examples in spec/views
+stats=Report code statistics (KLOCs, etc) from the application
+test\:prepare=
+time\:zones\:all=Displays all time zones, also available: time:zones:us, time:zones:local -- filter with OFFSET parameter, e.g., OFFSET=-6
+time\:zones\:local=
+time\:zones\:us=
+tmp\:cache\:clear=
+tmp\:clear=Clear session, cache, and socket files from tmp/ (narrow w/ tmp:sessions:clear, tmp:cache:clear, tmp:sockets:clear)
+tmp\:create=Creates tmp directories for sessions, cache, sockets, and pids
+tmp\:pids\:clear=
+tmp\:sessions\:clear=
+tmp\:sockets\:clear=
diff --git a/nbproject/project.properties b/nbproject/project.properties
new file mode 100644
index 0000000..0cb5ad5
--- /dev/null
+++ b/nbproject/project.properties
@@ -0,0 +1,3 @@
+platform.active=Ruby_0
+rails.port=3000
+source.encoding=UTF-8
diff --git a/nbproject/project.xml b/nbproject/project.xml
new file mode 100644
index 0000000..adededf
--- /dev/null
+++ b/nbproject/project.xml
@@ -0,0 +1,9 @@
+
+
+ org.netbeans.modules.ruby.railsprojects
+
+
+ CloudSpokes-Website
+
+
+
diff --git a/public/assets/application-1a112d4e60ba9876b65ab07838d35b7f.js b/public/assets/application-1a112d4e60ba9876b65ab07838d35b7f.js
new file mode 100644
index 0000000..c8dd4a8
--- /dev/null
+++ b/public/assets/application-1a112d4e60ba9876b65ab07838d35b7f.js
@@ -0,0 +1,19 @@
+/*!
+ * jQuery JavaScript Library v1.6.4
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Sep 12 18:54:48 2011 -0400
+ */
+(function(a,b){function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function C(){return!1}function D(){return!0}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")return;a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function V(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(Q.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function bf(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function bg(a,b){if(b.nodeType!==1||!f.hasData(a))return;var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i0)return c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0}),d+"px";d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;return d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)}),d+"px"}function bV(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bL),e=0,g=d.length,h,i,j;for(;e").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cu(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(e.isReady)return;try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};return e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(a==="body"&&!d&&c.body)return this.context=c,this[0]=c.body,this.selector=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?g=[null,a,null]:g=i.exec(a);if(g&&(g[1]||!d)){if(g[1])return d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes),e.merge(this,a);h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}return this.context=c,this.selector=a,this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}return e.isFunction(a)?f.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),e.makeArray(a,this))},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();return e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return e.each(this,a,b)},ready:function(a){return e.bindReady(),B.done(a),this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(B)return;B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="