From 08b3f56cb2020e1d0049d70ddd3ac149e87a40ee Mon Sep 17 00:00:00 2001 From: Marc St Raymond Date: Tue, 18 Jun 2013 16:49:22 -0700 Subject: [PATCH] Porting code from selfstarter fork to its new home --- Gemfile | 44 + Gemfile.lock | 240 +++ LICENSE | 22 + Procfile | 1 + README.md | 5 + Rakefile | 7 + app/assets/images/bullet.png | Bin 0 -> 148 bytes app/assets/images/crowdtilt.png | Bin 0 -> 7454 bytes app/assets/images/crowdtilt_badge.png | Bin 0 -> 12604 bytes app/assets/images/loading.gif | Bin 0 -> 1688 bytes app/assets/images/user_icon.png | Bin 0 -> 1208 bytes app/assets/javascripts/admin.js.coffee | 176 ++ app/assets/javascripts/application.js | 26 + app/assets/javascripts/campaigns.js.coffee | 70 + app/assets/javascripts/ckeditorbase.js.erb | 9 + app/assets/javascripts/jquery.textchange.js | 10 + app/assets/javascripts/jquery.timepicker.js | 1919 +++++++++++++++++ app/assets/javascripts/main.js.coffee | 16 + app/assets/javascripts/pages.js.coffee | 3 + app/assets/javascripts/users.js.coffee | 3 + app/assets/stylesheets/admin.css.scss | 207 ++ app/assets/stylesheets/application.css | 17 + app/assets/stylesheets/campaigns.css.scss | 214 ++ app/assets/stylesheets/devise.css.scss | 61 + app/assets/stylesheets/flash.css.scss | 18 + app/assets/stylesheets/main.css.scss | 15 + app/assets/stylesheets/navbar.css.scss | 35 + app/assets/stylesheets/pages.css.scss | 3 + app/assets/stylesheets/primitives.css.scss | 147 ++ app/assets/stylesheets/reset.css | 48 + app/assets/stylesheets/users.css.scss | 2 + app/controllers/admin/campaigns_controller.rb | 280 +++ app/controllers/admin_controller.rb | 88 + app/controllers/api/v0/base_controller.rb | 14 + .../api/v0/campaigns_controller.rb | 5 + app/controllers/api/v0/payments_controller.rb | 6 + app/controllers/application_controller.rb | 94 + app/controllers/campaigns_controller.rb | 186 ++ app/controllers/pages_controller.rb | 9 + app/controllers/registrations_controller.rb | 8 + app/controllers/users_controller.rb | 3 + app/helpers/admin/campaigns_helper.rb | 2 + app/helpers/admin_helper.rb | 2 + app/helpers/application_helper.rb | 15 + app/helpers/campaigns_helper.rb | 6 + app/helpers/pages_helper.rb | 2 + app/helpers/user_helper.rb | 2 + app/mailers/.gitkeep | 0 app/mailers/user_mailer.rb | 10 + app/models/.gitkeep | 0 app/models/campaign.rb | 84 + app/models/ckeditor/asset.rb | 4 + app/models/ckeditor/attachment_file.rb | 10 + app/models/ckeditor/picture.rb | 11 + app/models/faq.rb | 4 + app/models/payment.rb | 25 + app/models/reward.rb | 21 + app/models/settings.rb | 28 + app/models/user.rb | 12 + app/serializers/campaign_serializer.rb | 18 + app/serializers/payment_serializer.rb | 5 + app/serializers/reward_serializer.rb | 3 + app/validators/email_validator.rb | 7 + app/views/admin/_footer.html.erb | 6 + app/views/admin/_header.html.erb | 16 + app/views/admin/admin_bank_setup.html.erb | 111 + app/views/admin/admin_website.html.erb | 138 ++ app/views/admin/campaigns/_form.html.erb | 339 +++ app/views/admin/campaigns/edit.html.erb | 10 + app/views/admin/campaigns/index.html.erb | 57 + app/views/admin/campaigns/new.html.erb | 10 + app/views/admin/campaigns/payments.html.erb | 65 + app/views/campaigns/checkout_amount.html.erb | 96 + .../campaigns/checkout_confirmation.html.erb | 41 + app/views/campaigns/checkout_payment.html.erb | 444 ++++ app/views/devise/confirmations/new.html.erb | 12 + .../mailer/confirmation_instructions.html.erb | 5 + .../reset_password_instructions.html.erb | 8 + .../mailer/unlock_instructions.html.erb | 7 + app/views/devise/passwords/edit.html.erb | 18 + app/views/devise/passwords/new.html.erb | 14 + app/views/devise/registrations/edit.html.erb | 31 + app/views/devise/registrations/new.html.erb | 37 + app/views/devise/sessions/new.html.erb | 31 + app/views/devise/shared/_links.erb | 25 + app/views/devise/unlocks/new.html.erb | 12 + app/views/layouts/_facebook_metas.html.erb | 31 + app/views/layouts/_google_analytics.html.erb | 13 + app/views/layouts/_navbar.html.erb | 68 + app/views/layouts/_social_js.html.erb | 14 + app/views/layouts/admin.html.erb | 27 + app/views/layouts/application.html.erb | 33 + app/views/layouts/user_mailer.html.erb | 11 + app/views/shared/_paginate.html.erb | 28 + app/views/shared/_share_buttons.html.erb | 5 + .../theme/assets/javascripts/theme.js.coffee | 4 + .../theme/assets/stylesheets/base.css.scss | 193 ++ .../assets/stylesheets/campaign.css.scss | 288 +++ .../theme/assets/stylesheets/footer.css.scss | 27 + .../theme/assets/stylesheets/header.css.scss | 24 + .../assets/stylesheets/homepage.css.scss | 106 + .../theme/assets/stylesheets/theme.css.scss | 5 + app/views/theme/views/_footer.html.erb | 6 + app/views/theme/views/_header.html.erb | 20 + app/views/theme/views/campaign.html.erb | 186 ++ app/views/theme/views/homepage.html.erb | 80 + .../user_mailer/payment_confirmation.html.erb | 49 + .../user_mailer/payment_confirmation.text.erb | 49 + config.ru | 5 + config/application.rb | 68 + config/boot.rb | 6 + config/database.yml | 19 + config/environment.rb | 5 + config/environments/development.rb | 44 + config/environments/production.rb | 74 + config/environments/test.rb | 37 + .../initializers/active_model_serializers.rb | 4 + config/initializers/asset_sync.rb | 27 + config/initializers/backtrace_silencers.rb | 7 + config/initializers/ckeditor.rb | 21 + config/initializers/crowdtilt_api.rb | 18 + config/initializers/devise.rb | 240 +++ config/initializers/inflections.rb | 15 + config/initializers/mime_types.rb | 5 + config/initializers/secret_token.rb | 7 + config/initializers/session_store.rb | 8 + config/initializers/wrap_parameters.rb | 14 + config/locales/devise.en.yml | 59 + config/locales/en.yml | 5 + config/newrelic.yml | 255 +++ config/routes.rb | 37 + config/unicorn.rb | 23 + db/migrate/20130207215028_create_settings.rb | 33 + .../20130208014533_devise_create_users.rb | 46 + .../20130208222350_add_fullname_to_users.rb | 5 + .../20130208225658_add_ct_user_id_to_users.rb | 5 + ...204930_add_initialized_flag_to_settings.rb | 5 + .../20130212231331_add_admin_to_users.rb | 5 + .../20130215103202_create_ckeditor_assets.rb | 26 + ...ttachment_video_placeholder_to_settings.rb | 5 + db/migrate/20130215194710_update_settings.rb | 55 + ...18004943_add_ct_campaign_id_to_settings.rb | 5 + .../20130226012016_add_fields_to_settings.rb | 10 + ...8_add_attachment_logo_image_to_settings.rb | 11 + ...dd_attachment_project_image_to_settings.rb | 11 + db/migrate/20130226064633_create_faqs.rb | 11 + ...228071510_add_has_default_bank_to_users.rb | 5 + .../20130307083354_update_settings_again.rb | 39 + ...d_attachment_facebook_image_to_settings.rb | 11 + db/migrate/20130321235718_create_campaigns.rb | 43 + .../20130327211608_add_faqs_to_campaigns.rb | 5 + .../20130328201719_add_stats_to_campaigns.rb | 11 + ...329070859_add_visible_flag_to_campaigns.rb | 5 + .../20130329140533_clean_up_settings.rb | 73 + ...225754_add_homepage_content_to_settings.rb | 5 + ...130411035200_add_custom_css_to_settings.rb | 5 + ...130426205817_add_ct_user_id_to_settings.rb | 5 + db/migrate/20130429205659_create_payments.rb | 23 + ...20130502140108_add_shipping_to_payments.rb | 12 + ...30502205813_add_header_link_to_settings.rb | 6 + ...130502214625_add_goal_type_to_campaigns.rb | 20 + ...20130502223526_add_quantity_to_payments.rb | 5 + ...503003941_change_raised_amount_to_float.rb | 5 + ...30504202125_change_archive_to_published.rb | 5 + .../20130508061114_add_defaults_to_setings.rb | 5 + ...30508234212_add_ct_admin_id_to_settings.rb | 27 + ...053641_add_production_flag_to_campaigns.rb | 5 + db/migrate/20130514213640_create_rewards.rb | 13 + .../20130514214040_add_reward_support.rb | 7 + ...130528182659_remove_extra_shipping_flag.rb | 9 + ...0130604232404_add_additional_info_field.rb | 7 + .../20130605200524_add_api_key_to_settings.rb | 5 + ...07043849_add_reply_to_email_to_settings.rb | 5 + db/schema.rb | 188 ++ db/seeds.rb | 7 + doc/README_FOR_APP | 2 + lib/assets/.gitkeep | 0 lib/tasks/.gitkeep | 0 log/.gitkeep | 0 public/404.html | 26 + public/422.html | 26 + public/500.html | 25 + public/favicon.ico | Bin 0 -> 894 bytes public/robots.txt | 5 + script/rails | 6 + .../api/v0/base_controller_spec.rb | 48 + .../api/v0/campaigns_controller_spec.rb | 25 + .../api/v0/payments_controller_spec.rb | 26 + spec/factories/campaigns.rb | 8 + spec/factories/payments.rb | 8 + spec/factories/rewards.rb | 10 + spec/factories/settings.rb | 5 + spec/fixtures/orders.yml | 30 + spec/fixtures/users.yml | 9 + spec/spec_helper.rb | 42 + vendor/assets/javascripts/.gitkeep | 0 .../assets/javascripts/html5shiv-printshiv.js | 11 + vendor/assets/stylesheets/.gitkeep | 0 vendor/plugins/.gitkeep | 0 199 files changed, 9191 insertions(+) create mode 100755 Gemfile create mode 100755 Gemfile.lock create mode 100755 LICENSE create mode 100755 Procfile create mode 100755 README.md create mode 100755 Rakefile create mode 100755 app/assets/images/bullet.png create mode 100755 app/assets/images/crowdtilt.png create mode 100755 app/assets/images/crowdtilt_badge.png create mode 100755 app/assets/images/loading.gif create mode 100755 app/assets/images/user_icon.png create mode 100755 app/assets/javascripts/admin.js.coffee create mode 100755 app/assets/javascripts/application.js create mode 100755 app/assets/javascripts/campaigns.js.coffee create mode 100755 app/assets/javascripts/ckeditorbase.js.erb create mode 100755 app/assets/javascripts/jquery.textchange.js create mode 100755 app/assets/javascripts/jquery.timepicker.js create mode 100755 app/assets/javascripts/main.js.coffee create mode 100755 app/assets/javascripts/pages.js.coffee create mode 100755 app/assets/javascripts/users.js.coffee create mode 100755 app/assets/stylesheets/admin.css.scss create mode 100755 app/assets/stylesheets/application.css create mode 100755 app/assets/stylesheets/campaigns.css.scss create mode 100755 app/assets/stylesheets/devise.css.scss create mode 100755 app/assets/stylesheets/flash.css.scss create mode 100755 app/assets/stylesheets/main.css.scss create mode 100755 app/assets/stylesheets/navbar.css.scss create mode 100755 app/assets/stylesheets/pages.css.scss create mode 100755 app/assets/stylesheets/primitives.css.scss create mode 100755 app/assets/stylesheets/reset.css create mode 100755 app/assets/stylesheets/users.css.scss create mode 100755 app/controllers/admin/campaigns_controller.rb create mode 100755 app/controllers/admin_controller.rb create mode 100755 app/controllers/api/v0/base_controller.rb create mode 100755 app/controllers/api/v0/campaigns_controller.rb create mode 100755 app/controllers/api/v0/payments_controller.rb create mode 100755 app/controllers/application_controller.rb create mode 100755 app/controllers/campaigns_controller.rb create mode 100755 app/controllers/pages_controller.rb create mode 100755 app/controllers/registrations_controller.rb create mode 100755 app/controllers/users_controller.rb create mode 100755 app/helpers/admin/campaigns_helper.rb create mode 100755 app/helpers/admin_helper.rb create mode 100755 app/helpers/application_helper.rb create mode 100755 app/helpers/campaigns_helper.rb create mode 100755 app/helpers/pages_helper.rb create mode 100755 app/helpers/user_helper.rb create mode 100755 app/mailers/.gitkeep create mode 100755 app/mailers/user_mailer.rb create mode 100755 app/models/.gitkeep create mode 100755 app/models/campaign.rb create mode 100755 app/models/ckeditor/asset.rb create mode 100755 app/models/ckeditor/attachment_file.rb create mode 100755 app/models/ckeditor/picture.rb create mode 100755 app/models/faq.rb create mode 100755 app/models/payment.rb create mode 100755 app/models/reward.rb create mode 100755 app/models/settings.rb create mode 100755 app/models/user.rb create mode 100755 app/serializers/campaign_serializer.rb create mode 100755 app/serializers/payment_serializer.rb create mode 100755 app/serializers/reward_serializer.rb create mode 100755 app/validators/email_validator.rb create mode 100755 app/views/admin/_footer.html.erb create mode 100755 app/views/admin/_header.html.erb create mode 100755 app/views/admin/admin_bank_setup.html.erb create mode 100755 app/views/admin/admin_website.html.erb create mode 100755 app/views/admin/campaigns/_form.html.erb create mode 100755 app/views/admin/campaigns/edit.html.erb create mode 100755 app/views/admin/campaigns/index.html.erb create mode 100755 app/views/admin/campaigns/new.html.erb create mode 100755 app/views/admin/campaigns/payments.html.erb create mode 100755 app/views/campaigns/checkout_amount.html.erb create mode 100755 app/views/campaigns/checkout_confirmation.html.erb create mode 100755 app/views/campaigns/checkout_payment.html.erb create mode 100755 app/views/devise/confirmations/new.html.erb create mode 100755 app/views/devise/mailer/confirmation_instructions.html.erb create mode 100755 app/views/devise/mailer/reset_password_instructions.html.erb create mode 100755 app/views/devise/mailer/unlock_instructions.html.erb create mode 100755 app/views/devise/passwords/edit.html.erb create mode 100755 app/views/devise/passwords/new.html.erb create mode 100755 app/views/devise/registrations/edit.html.erb create mode 100755 app/views/devise/registrations/new.html.erb create mode 100755 app/views/devise/sessions/new.html.erb create mode 100755 app/views/devise/shared/_links.erb create mode 100755 app/views/devise/unlocks/new.html.erb create mode 100755 app/views/layouts/_facebook_metas.html.erb create mode 100755 app/views/layouts/_google_analytics.html.erb create mode 100755 app/views/layouts/_navbar.html.erb create mode 100755 app/views/layouts/_social_js.html.erb create mode 100755 app/views/layouts/admin.html.erb create mode 100755 app/views/layouts/application.html.erb create mode 100755 app/views/layouts/user_mailer.html.erb create mode 100755 app/views/shared/_paginate.html.erb create mode 100755 app/views/shared/_share_buttons.html.erb create mode 100755 app/views/theme/assets/javascripts/theme.js.coffee create mode 100755 app/views/theme/assets/stylesheets/base.css.scss create mode 100755 app/views/theme/assets/stylesheets/campaign.css.scss create mode 100755 app/views/theme/assets/stylesheets/footer.css.scss create mode 100755 app/views/theme/assets/stylesheets/header.css.scss create mode 100755 app/views/theme/assets/stylesheets/homepage.css.scss create mode 100755 app/views/theme/assets/stylesheets/theme.css.scss create mode 100755 app/views/theme/views/_footer.html.erb create mode 100755 app/views/theme/views/_header.html.erb create mode 100755 app/views/theme/views/campaign.html.erb create mode 100755 app/views/theme/views/homepage.html.erb create mode 100755 app/views/user_mailer/payment_confirmation.html.erb create mode 100755 app/views/user_mailer/payment_confirmation.text.erb create mode 100755 config.ru create mode 100755 config/application.rb create mode 100755 config/boot.rb create mode 100755 config/database.yml create mode 100755 config/environment.rb create mode 100755 config/environments/development.rb create mode 100755 config/environments/production.rb create mode 100755 config/environments/test.rb create mode 100755 config/initializers/active_model_serializers.rb create mode 100755 config/initializers/asset_sync.rb create mode 100755 config/initializers/backtrace_silencers.rb create mode 100755 config/initializers/ckeditor.rb create mode 100755 config/initializers/crowdtilt_api.rb create mode 100755 config/initializers/devise.rb create mode 100755 config/initializers/inflections.rb create mode 100755 config/initializers/mime_types.rb create mode 100755 config/initializers/secret_token.rb create mode 100755 config/initializers/session_store.rb create mode 100755 config/initializers/wrap_parameters.rb create mode 100755 config/locales/devise.en.yml create mode 100755 config/locales/en.yml create mode 100755 config/newrelic.yml create mode 100755 config/routes.rb create mode 100755 config/unicorn.rb create mode 100755 db/migrate/20130207215028_create_settings.rb create mode 100755 db/migrate/20130208014533_devise_create_users.rb create mode 100755 db/migrate/20130208222350_add_fullname_to_users.rb create mode 100755 db/migrate/20130208225658_add_ct_user_id_to_users.rb create mode 100755 db/migrate/20130212204930_add_initialized_flag_to_settings.rb create mode 100755 db/migrate/20130212231331_add_admin_to_users.rb create mode 100755 db/migrate/20130215103202_create_ckeditor_assets.rb create mode 100755 db/migrate/20130215175232_add_attachment_video_placeholder_to_settings.rb create mode 100755 db/migrate/20130215194710_update_settings.rb create mode 100755 db/migrate/20130218004943_add_ct_campaign_id_to_settings.rb create mode 100755 db/migrate/20130226012016_add_fields_to_settings.rb create mode 100755 db/migrate/20130226013148_add_attachment_logo_image_to_settings.rb create mode 100755 db/migrate/20130226013157_add_attachment_project_image_to_settings.rb create mode 100755 db/migrate/20130226064633_create_faqs.rb create mode 100755 db/migrate/20130228071510_add_has_default_bank_to_users.rb create mode 100755 db/migrate/20130307083354_update_settings_again.rb create mode 100755 db/migrate/20130307085308_add_attachment_facebook_image_to_settings.rb create mode 100755 db/migrate/20130321235718_create_campaigns.rb create mode 100755 db/migrate/20130327211608_add_faqs_to_campaigns.rb create mode 100755 db/migrate/20130328201719_add_stats_to_campaigns.rb create mode 100755 db/migrate/20130329070859_add_visible_flag_to_campaigns.rb create mode 100755 db/migrate/20130329140533_clean_up_settings.rb create mode 100755 db/migrate/20130408225754_add_homepage_content_to_settings.rb create mode 100755 db/migrate/20130411035200_add_custom_css_to_settings.rb create mode 100755 db/migrate/20130426205817_add_ct_user_id_to_settings.rb create mode 100755 db/migrate/20130429205659_create_payments.rb create mode 100755 db/migrate/20130502140108_add_shipping_to_payments.rb create mode 100755 db/migrate/20130502205813_add_header_link_to_settings.rb create mode 100755 db/migrate/20130502214625_add_goal_type_to_campaigns.rb create mode 100755 db/migrate/20130502223526_add_quantity_to_payments.rb create mode 100755 db/migrate/20130503003941_change_raised_amount_to_float.rb create mode 100755 db/migrate/20130504202125_change_archive_to_published.rb create mode 100755 db/migrate/20130508061114_add_defaults_to_setings.rb create mode 100755 db/migrate/20130508234212_add_ct_admin_id_to_settings.rb create mode 100755 db/migrate/20130510053641_add_production_flag_to_campaigns.rb create mode 100755 db/migrate/20130514213640_create_rewards.rb create mode 100755 db/migrate/20130514214040_add_reward_support.rb create mode 100755 db/migrate/20130528182659_remove_extra_shipping_flag.rb create mode 100755 db/migrate/20130604232404_add_additional_info_field.rb create mode 100755 db/migrate/20130605200524_add_api_key_to_settings.rb create mode 100755 db/migrate/20130607043849_add_reply_to_email_to_settings.rb create mode 100755 db/schema.rb create mode 100755 db/seeds.rb create mode 100755 doc/README_FOR_APP create mode 100755 lib/assets/.gitkeep create mode 100755 lib/tasks/.gitkeep create mode 100755 log/.gitkeep create mode 100755 public/404.html create mode 100755 public/422.html create mode 100755 public/500.html create mode 100755 public/favicon.ico create mode 100755 public/robots.txt create mode 100755 script/rails create mode 100755 spec/controllers/api/v0/base_controller_spec.rb create mode 100755 spec/controllers/api/v0/campaigns_controller_spec.rb create mode 100755 spec/controllers/api/v0/payments_controller_spec.rb create mode 100755 spec/factories/campaigns.rb create mode 100755 spec/factories/payments.rb create mode 100755 spec/factories/rewards.rb create mode 100755 spec/factories/settings.rb create mode 100755 spec/fixtures/orders.yml create mode 100755 spec/fixtures/users.yml create mode 100755 spec/spec_helper.rb create mode 100755 vendor/assets/javascripts/.gitkeep create mode 100755 vendor/assets/javascripts/html5shiv-printshiv.js create mode 100755 vendor/assets/stylesheets/.gitkeep create mode 100755 vendor/plugins/.gitkeep diff --git a/Gemfile b/Gemfile new file mode 100755 index 00000000..0871f927 --- /dev/null +++ b/Gemfile @@ -0,0 +1,44 @@ +source 'https://rubygems.org' +ruby "1.9.3" + +gem 'unicorn' + +gem 'rails', '3.2.13' +gem 'bootstrap-sass', '2.1' +gem 'devise' +gem 'pg' +gem "friendly_id", "~> 4.0.9" + +gem 'paperclip', '~> 3.0' +gem 'ckeditor' +gem 'aws-sdk' + +gem 'foreman' + +gem 'active_model_serializers' + +group :production do + gem 'newrelic_rpm' +end + +# Gems used only for assets and not required +# in production environments by default. +group :assets do + gem 'sass-rails', '~> 3.2.3' + gem 'coffee-rails', '~> 3.2.1' + gem 'uglifier', '>= 1.0.3' + gem "asset_sync" +end + +group :development, :test do + gem 'pry-rails' + gem 'rspec-rails' + gem 'shoulda' + gem 'factory_girl_rails' +end + +# jQuery & jQuery UI +gem 'jquery-rails' +gem 'jquery-ui-rails' + +gem 'crowdtilt', github: 'msaint/crowdtilt' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100755 index 00000000..8a6c7b69 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,240 @@ +GIT + remote: git://github.com/msaint/crowdtilt.git + revision: faa74632ac6c5b35f44b289e8e04252a7297f68d + specs: + crowdtilt (0.0.1) + activesupport + faraday (~> 0.8, < 0.10) + faraday_middleware (~> 0.9.0) + json + +GEM + remote: https://rubygems.org/ + specs: + actionmailer (3.2.13) + actionpack (= 3.2.13) + mail (~> 2.5.3) + actionpack (3.2.13) + activemodel (= 3.2.13) + activesupport (= 3.2.13) + builder (~> 3.0.0) + erubis (~> 2.7.0) + journey (~> 1.0.4) + rack (~> 1.4.5) + rack-cache (~> 1.2) + rack-test (~> 0.6.1) + sprockets (~> 2.2.1) + active_model_serializers (0.8.1) + activemodel (>= 3.0) + activemodel (3.2.13) + activesupport (= 3.2.13) + builder (~> 3.0.0) + activerecord (3.2.13) + activemodel (= 3.2.13) + activesupport (= 3.2.13) + arel (~> 3.0.2) + tzinfo (~> 0.3.29) + activeresource (3.2.13) + activemodel (= 3.2.13) + activesupport (= 3.2.13) + activesupport (3.2.13) + i18n (= 0.6.1) + multi_json (~> 1.0) + arel (3.0.2) + asset_sync (0.5.4) + activemodel + fog + aws-sdk (1.11.0) + json (~> 1.4) + nokogiri (>= 1.4.4) + uuidtools (~> 2.1) + bcrypt-ruby (3.0.1) + bootstrap-sass (2.1.0.0) + builder (3.0.4) + ckeditor (4.0.4) + mime-types + orm_adapter + climate_control (0.0.3) + activesupport (>= 3.0) + cocaine (0.5.1) + climate_control (>= 0.0.3, < 1.0) + coderay (1.0.9) + coffee-rails (3.2.2) + coffee-script (>= 2.2.0) + railties (~> 3.2.0) + coffee-script (2.2.0) + coffee-script-source + execjs + coffee-script-source (1.6.2) + devise (2.2.4) + bcrypt-ruby (~> 3.0) + orm_adapter (~> 0.1) + railties (~> 3.1) + warden (~> 1.2.1) + diff-lcs (1.2.4) + dotenv (0.7.0) + erubis (2.7.0) + excon (0.22.1) + execjs (1.4.0) + multi_json (~> 1.0) + factory_girl (4.2.0) + activesupport (>= 3.0.0) + factory_girl_rails (4.2.1) + factory_girl (~> 4.2.0) + railties (>= 3.0.0) + faraday (0.8.7) + multipart-post (~> 1.1) + faraday_middleware (0.9.0) + faraday (>= 0.7.4, < 0.9) + fog (1.11.1) + builder + excon (~> 0.20) + formatador (~> 0.2.0) + json (~> 1.7) + mime-types + net-scp (~> 1.1) + net-ssh (>= 2.1.3) + nokogiri (~> 1.5.0) + ruby-hmac + foreman (0.63.0) + dotenv (>= 0.7) + thor (>= 0.13.6) + formatador (0.2.4) + friendly_id (4.0.9) + hike (1.2.3) + i18n (0.6.1) + journey (1.0.4) + jquery-rails (3.0.0) + railties (>= 3.0, < 5.0) + thor (>= 0.14, < 2.0) + jquery-ui-rails (4.0.3) + jquery-rails + railties (>= 3.1.0) + json (1.8.0) + kgio (2.8.0) + mail (2.5.4) + mime-types (~> 1.16) + treetop (~> 1.4.8) + method_source (0.8.1) + mime-types (1.23) + multi_json (1.7.6) + multipart-post (1.2.0) + net-scp (1.1.1) + net-ssh (>= 2.6.5) + net-ssh (2.6.7) + newrelic_rpm (3.6.3.111) + nokogiri (1.5.9) + orm_adapter (0.4.0) + paperclip (3.4.2) + activemodel (>= 3.0.0) + activerecord (>= 3.0.0) + activesupport (>= 3.0.0) + cocaine (~> 0.5.0) + mime-types + pg (0.15.1) + polyglot (0.3.3) + pry (0.9.12.2) + coderay (~> 1.0.5) + method_source (~> 0.8) + slop (~> 3.4) + pry-rails (0.3.0) + pry (>= 0.9.10) + rack (1.4.5) + rack-cache (1.2) + rack (>= 0.4) + rack-ssl (1.3.3) + rack + rack-test (0.6.2) + rack (>= 1.0) + rails (3.2.13) + actionmailer (= 3.2.13) + actionpack (= 3.2.13) + activerecord (= 3.2.13) + activeresource (= 3.2.13) + activesupport (= 3.2.13) + bundler (~> 1.0) + railties (= 3.2.13) + railties (3.2.13) + actionpack (= 3.2.13) + activesupport (= 3.2.13) + rack-ssl (~> 1.3.2) + rake (>= 0.8.7) + rdoc (~> 3.4) + thor (>= 0.14.6, < 2.0) + raindrops (0.11.0) + rake (10.0.4) + rdoc (3.12.2) + json (~> 1.4) + rspec-core (2.13.1) + rspec-expectations (2.13.0) + diff-lcs (>= 1.1.3, < 2.0) + rspec-mocks (2.13.1) + rspec-rails (2.13.2) + actionpack (>= 3.0) + activesupport (>= 3.0) + railties (>= 3.0) + rspec-core (~> 2.13.0) + rspec-expectations (~> 2.13.0) + rspec-mocks (~> 2.13.0) + ruby-hmac (0.4.0) + sass (3.2.9) + sass-rails (3.2.6) + railties (~> 3.2.0) + sass (>= 3.1.10) + tilt (~> 1.3) + shoulda (3.5.0) + shoulda-context (~> 1.0, >= 1.0.1) + shoulda-matchers (>= 1.4.1, < 3.0) + shoulda-context (1.1.2) + shoulda-matchers (2.1.0) + activesupport (>= 3.0.0) + slop (3.4.5) + sprockets (2.2.2) + hike (~> 1.2) + multi_json (~> 1.0) + rack (~> 1.0) + tilt (~> 1.1, != 1.3.0) + thor (0.18.1) + tilt (1.4.1) + treetop (1.4.14) + polyglot + polyglot (>= 0.3.1) + tzinfo (0.3.37) + uglifier (2.1.1) + execjs (>= 0.3.0) + multi_json (~> 1.0, >= 1.0.2) + unicorn (4.6.2) + kgio (~> 2.6) + rack + raindrops (~> 0.7) + uuidtools (2.1.4) + warden (1.2.1) + rack (>= 1.0) + +PLATFORMS + ruby + +DEPENDENCIES + active_model_serializers + asset_sync + aws-sdk + bootstrap-sass (= 2.1) + ckeditor + coffee-rails (~> 3.2.1) + crowdtilt! + devise + factory_girl_rails + foreman + friendly_id (~> 4.0.9) + jquery-rails + jquery-ui-rails + newrelic_rpm + paperclip (~> 3.0) + pg + pry-rails + rails (= 3.2.13) + rspec-rails + sass-rails (~> 3.2.3) + shoulda + uglifier (>= 1.0.3) + unicorn diff --git a/LICENSE b/LICENSE new file mode 100755 index 00000000..d1938182 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +Copyright 2012 Apigy Inc. and other contributors +http://api.gy/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/Procfile b/Procfile new file mode 100755 index 00000000..9c823741 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb diff --git a/README.md b/README.md new file mode 100755 index 00000000..f603823a --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Crowdhoster + +New README coming soon! + +Contact team@crowdhoster.com with questions in the meantime diff --git a/Rakefile b/Rakefile new file mode 100755 index 00000000..9f0f37a0 --- /dev/null +++ b/Rakefile @@ -0,0 +1,7 @@ +#!/usr/bin/env rake +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require File.expand_path('../config/application', __FILE__) + +Selfstarter::Application.load_tasks diff --git a/app/assets/images/bullet.png b/app/assets/images/bullet.png new file mode 100755 index 0000000000000000000000000000000000000000..dbdcc2aea6aa5a93878125db2b124a83ba8742b5 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)T!3HEZPnf;}NJV?PIEF|}P3DOIpJ64inaPmZ zicRo;V}-rI=|_`T9{zTC)8H-CvY)BYOwUtd9`6yI9V(6%th1kFE4*V*GA=pU?jX~Y x_gr7$9{Ul-8!@|OI#@US+|1lDbwjHFLs;ha?^>pPw}93#c)I$ztaD0e0svJAF+l(T literal 0 HcmV?d00001 diff --git a/app/assets/images/crowdtilt.png b/app/assets/images/crowdtilt.png new file mode 100755 index 0000000000000000000000000000000000000000..953a6efa5307fab935e616dd160d94b07456fc1c GIT binary patch literal 7454 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/crowdtilt_badge.png b/app/assets/images/crowdtilt_badge.png new file mode 100755 index 0000000000000000000000000000000000000000..52a8e7350b19091288a51884188e176def33443f GIT binary patch literal 12604 zcmaKTbyOYCvMwG7?(PuW-642_OK{t;@y*8BY#b8YEf72ecL?t87F>e6yUXKu?>Xnb zKkj?IX3cc>s;}y+?pnRpOx1*`smPM;VjFbf!0Hjg`nOOlffMyn+PJ=*E7#Mgu8!cT|U1cR>n9+ z2*~jb4Fe-80dX`lw*$IT0f1IE4q`N?&FwT)HWp$uI(*8U%8t@NYa0cqGf)$%qGb-X zGZ(U;kr1a6g$TbX00CXis30JF2Nz+87|nm_6@KggGtEIm^?=V3GF^@=V#~Q<>Tk)Vx{8d?W2{so`2Ujx)n}ZAOzct7J zUCfAD8|usI2_| z7X^X-Bkkg<0sJ4n|EppbEl)=vhX&9E?B;C#wsDrU|Cn+VmUaf3xq_Xwz+n4-ucDeY z*cI$z4R)lG*5s#RR5mlWarkF~>Aw)l%EF2cF0N({=0HUmF`73W>^3$Q!a{O_A9*0{3n3pU?+7yv4ioTVRiA^P9lHu$3#yNNGV9kBm^f@nmOTJ;vii z=&-2#$&f@PRq&-6X=n;V1K<4&^}h`(EUjl@E!6jy!(J}x!La`y{+W#`r;Gus_$+hOG#T*-?{a*} z)qn`(>HvKFslyGJj! z%558RhQX(T;oGVU)v$}vQV;Cw?$Y$OIXa3;!N@V5v>$G74o6u)t6kV*{RI@=_v{yP zpi3Ks11jy3?&2re()RagC?b{y_lxP|M5R`G1>No2YmS;L$_wl|sN=ZQ}=bQJdz|`Y5 zg)z9L)C=#QPvW`T|L{;gVN9W*;f$0Ap@H%d{Ehkft+~>y9paCP*uSXMyWOl@c*h@8 zoZOLGgiwIYy$Q}(>%%r$Eq-v5Y97#UCNKFf0$lR=D^qRY#~cM_+|zC0xk?)ANO!IoZg(HCvo{G1sSIig?mYJe13i~jCV%>;)x278jKp*kaE$kRIt zlBj0Hcw;o$sY(efuq<=4MIy4MF?rRR-{nGUPHH;LqY=J|)v1X8?W=~)bz4^h^;pk6 zT;Wf%Xr>H)o}@#ER+T6;?bm^IR{9++9ep&z_NCw^WwLshdZlE(-VfXbGQ{3phpe(Y zR$;ptB;3N!UrvHlzr>`quQd;Q>`K$O%&fwzHi(|H6kwA?IIvXY1W(5K&|VxC!2}&K7)GYmS``27^a;&3dGl#^gy*Q%UN`BzhxL$ieJ?D+C(?s+@^Z3(G_VfFI`MFA$|Y->C2 z@)6o!d+#6R5iW297qGThKNimR3vFDFZ-;sDz_FNjuzywiZ9jq4jNj++^avH;?sAe= zf1r@@>&eACqs5n%x6yVRCp0lxzEM#3ENKQep83%vHMX>f3W>FjQhXl-6R9rWiwWU$V{7eY@BNE->RY{_o>xQXAZZ&v$X z>3R$){XkL-ZS3*QTnB=bg8@nZR+Au|JD3)6biNfBTW`bHCP8N+KU9v4$7f;h#N_T0 zy8+F`V%zqHor_20Uua!S%3q>Ctl%c9bVp*&ipQI1%2(Et> zcKRSrywR-Q8(N)qECa3i6C`Ola0;5qDz(sy!J$f894T{DfAz+?&dsU*Nyf*=S4F)> zgrc4o9hxdlka3$#uEZ&939aK@C$FiG5&{kau2A6V=KTTr%2t+D^-2brO#EuK-{H;7 zD#fPQokxT!xpJicof0YW-){(Uq^ncMt z5(pitO9jcf;wzpfChblXCq+>J_`8osuC=TnNv_j|T9x^%=Ckei<)omJJ+Ncy zrvR_cM>g6jEDZ|gPvOw(qXif9U)&yzzAMp$ry>=@7x2I{4WHgdaz`QU2C`3V!#S@_ z`M9yz9oUtgtq8^l7JPiZa8ym@W~THLm)srqy_2f`{n>=EYYgS|k`E|E_t!mGSV*W& z4h)O63X)E;qc6{3ReQ>^%x1U4Wb^j9SbPvV$&P7$Sil6OY4!{P3`wxVBd^?Xqcuyo zg>zwId&kV|Ro;EfaaxsE+b#8kq42 z^?6nI#K-FH%sBFO(fT;xh=Yu-4bd=~RZ`=1i^;F28WID7V!!gN#`bq>RV<9GVEo-L zC}&TzXLj(S-3YwWaFmhyFnE(@{_kkv=8NDQ19z#>o7wlcXeX115_M+j9o|$iq~#V;6;-{S?CuB`l<_6&Q@LlbK1gC+Sz> zzS_y7BccaU2++s#r=t^dM-TCF3VkVJV6TabQG1cp?xVavk^m9oqb_$D6d~GfSWm-c zS>N$@;P!KN;6|#*Ix1korQ^V!CB|AEI!+rH&u$XCPlml}&t==*JFhunr^6nIUwO+; zX7^|q{}^W_k62AqVJiDt(}K71cR1U(9d9rw6unPf7*64wJ>XMQKl~la9o!avcuWPg z+Vq5|2f@ZIyR6h}KUOG+eK3>SKacwPr>2<_y}P{FoHEt6mh$;*F^wg#2>{1vwe5_v z*NE1cPPE3`_T4{zGaW4juj0Wihro1=hjGOwAkGpFCj?bH$gITn^Ylz)@L_6<9Ghm1 zj4JLPFYLg`iPE`AU`^D*jG5!C8`fdh*x?mS?-z?Py)w;l72d`V9*JWU^j@g2t(?hL zmo#Gbl7w(6k!~lPl{MstW}Z>KJ|cTz7<=a(HP+PA)y#0BA$qI~NrTGUR5uJO!7?03 za;@p}#)?c=;qQN;m&)0b1pJtiO`Y)Z1wfj{5ybq2$ivR;5FpUn`xC=b3-~Jf!-<Qb8Q1Z~`l{9xh_-P*#~Xew~Ip9G4EE!>JxLVZI%z{GdY zw{_eW!|@Vhp->bGVyMes#f$~nt5)rAk`!ANmDC(w2uk1{xiYOB#7B{!ld`hL*7Jzb zBV1su(?R`KtAc}jLf3ep99eY;3hUK)l zi|)ENyF8)@$gFg4CXR ztswt=M|D8V`pM315s62nQ=Bhh8zrA%Nr~6a!N}d?H%J;gTV)&sfVTIjTeTtY{Kjwg z+Rzmp#zy|ipD&>!R+!v7icw8Xpqi4bG*xWZy8t`B^090T6t!hr_(#7gX7MJ|bRKV+ z*@LF`g*(mv$e^9#p)JVqLA%D=zS6M~CG=N|g8w@t(asBIrHM;u9RC$^dRb$C&x9BT z?gTGfgMa^(_(jv4h3}_qf-|&BVg+?9&EJTlb*&*64haa4wxRoo2nvS{xq^y5&=hg#54{Pz2xjAeKy24cV_ai`UO3?=EE{A_cLF974&U(O^K{EgAh~hoWIa6 z24iz8_u7(5m9$>P!Hi?LySaL_{{|JhEy+!>vqT*q1y3eC!F=Yjzh_ipOMSw+*l*v` zD<(ib@82M9pH>e_MmMOq#!>rinp=)2YA1vFGb0e|{41&5N+-@!VhyHs-@6TjUmBbf2y?|R$fE_-9`wI6I9QoOMA1YV&*xoL!K~bVR zExOkyjCB1ZJg!44sJ#)nT=vc7I=A7&0ryiwg)Yp>{9H{e#bM9cO_4&3i~6zv+?ibK z86rF6#s$sK7JE7IH9O=b=;d})e%0pG{J0zr7Q$d8K-wzIFRvYi2`Yymg8Ig~oY-(G z!(e#bMn3DF9jm}XPRzyumnUzsi0p=62O6vtm8R2e+vtc&E zyXju#)*Px5&mQR>orn#uFOR)Gqyjsp7h7R8rG*U&-c$3t{b?_a=KwX$LDh6#>UsY1 zR6!{+A=UMe43@=Cq3+(TIHQbyu!r>JdO5jPqbMH;yVDDQ*_X@I3Nhb^O0+UDAjEkznY+O!v z5_;F_`S-o6DVGx&vV@c~+vKP0>cZ( zo$<$Jdz{$+4bY1-j6q&O?_ zj>uJ6mEa-nG>al4{h7XDXQ6j*Sy+#Ak_v%99oac{Lg>~R*W*+9Wm=VB1gQ1Dr^ z^g+mk5!cG+iIzLsj^cNINjZ|#_+VeSKUrb>0|15Jem=DEv?c0X$A~^PD;iv#ym>h; z-rbi@cC^y^j^k0yfCe4N63Rfj$rHypDh0Rey1mnf)HA)Kp-MR#& z51p;+Sw{e1!o2<{4g7H^PIfL;Is`D3DDsV6um!{$u%ga#evJe(T%pjxL%P9X0gZyl zHJe;Un)F^ps-5$*&jz?W)b$KyMVpT1(?D9=vW?HXze$+A27FxRHKTGrVZs6eKku)- zFsxThV+$M)$e&VVIQ15a4~VG+x{+Q^Y;L&&Tvr?Gu~5Gse?5rA&(={~v*mZ~&A;I4 z39aDkxN4w9;s*ulD<4J2zc)%A2GQUirs~pdhBea7+UDiaEhfkP)~78+-Zq$0Ygt#Um238bF*?1OW5C5%J1g*>f&7g)}?G^a*oIFyK^n~h)M{r@Q0F`^$_Y1v_9 zYGRIqC#)#`U|lFuZDA1;KT@Yw~y2b(HUp6%QggXy+2TuhW3YjR34t`iUokLv;KjM8wdqmI8F}8#&3`YA6g&~4rbhxv1 zZ|}!~e*c1=hKZeHoyzCM=Cuz_Q;L#>I-W|j@4`Bui#8MTE9kYoOpM+_=!yuoT<|u&fO_D2?AfBk)|=1C7HMj|HiNgo?fZTN2##Cn zl^Vyf=084ZW|->t`VsIzNKE}i-P#(jbp{A0dZR!Rx37!x7$C61P|<4D`iH_CB(7(S5;~x zEJJ-^NANe1_XmJ*t-Osb33SDa-1g?EJDT)Fs{heJ{-RM@?dsbgh04<$>b%&lG?~D@ zGoE)fa=E3V0=Y0k-r;QSUIAt$cw1t!9`#oUL4Y(%;>jem6f{cP3-3kh+Q3tSXoYBCk;G8Vh{i6Nj8GaoT74kY{k= zv~2PcAyBa&@dL3wqLS_15SH{RNvq%@)Pr5V%H_*=i3(WXVTd0LHlr6UcKs)IVMm& zLl*Ra9gc2u{T-ztyHvGuqPk_0#V>ez7W5da{65dCx&U+Rd*$St?UN$S0=1?yzP2U0 z4sP0GNMiC_mM*5Q2{fjEGuFR9x-mZC;_Ue?wAjeU9WX<;rJ>|78tWlDWs+`rK{8Xc zci#73(gl7Cgq47*Z2ubLWI)2d!oxqff20YsiCGmR^Ybw)(w(~>YN4#!l@y|A0dhWl zy$Aay24R4v9PjUqs;p%xm|H3EzTYFWYKb(W1seO5h7FH=uAP_6@oZIFs+C=sH4@y; zv{SE}!;|E%7?SD~NZ_&`G#Dtk+WaLhR{8Q$;AA~a5lQC6zZ2a6i`x!?m!I9uo=HJf zk88#>i6#zN&+_&MP6gA_ulQe{G2@L;27NJ?kdo@6qWirU(Q>atTlR`)pXMi~(r8W_ zE?Q+xkrnzCxhdaK;I%;Xi1oZf7Qm;%&xIy!1{K$v^to^O$M8-b6HS(&Lw zH7oVne(*Ni=byggh4eV{MG0pFwzDtW>(8PHrjnCffyy(R35?r$RR$IN>c<6i9Nm;v ze}YR7u4i~E8ZCnx_u8`-QyM($Ad@ssPmh{@gp{K{%;#&YI9i^^mb!GQ|4jK~HTbm^ z4aN4cL`-J+bq=g)k-3+ADMik_Tm|ct zYm3}f89!WPwd>S+|CqQ@WBGIpPQ_gISlwPGpwSlWH5riqq)8HR?j(vyNU1LBVrHk> ztfwmWeC2wc&7`@g*6%syjtal^E0v=)(GF3K#L^E@9#(-PX=Og&m^P@OINWCG`<5rN zRaB`eI>K2=CfEJ^=oHU2zpq(N4F~o{@a~ruX-9sBtZp?k;V#BrAo=5vW938y3SmazGJMkXzIl!y zpOzMB=U{PXDoS;22nSzr?iA{sS;OCn*1S-OGR!*P-$WUGCV}5HvwHcm#$>)@TV-GB ziLDQcgz}rq0~Q*VI05^Qy1WmTaq?)Ys?_y2+Y9s0*8&ZoRkDt+(Ymc;NAyR)k5 zao3!N861+zlN8J)@LX)o>uWdHg1$$@Y6j?>BI!IR&C!Ap(Mf>)p*`U_63N~F_94O@tsI&MdUru6rI_GJiGF0`%;82I?9lCK?3Cu5SD z=;j8~Q?N*z=E3a~{v5b;tXGei&G8edrdO?*A2E{B-`rX7!rZs2F2f;99jUJ)+V5X{ zHlyZxJ!2@us%$hdns9lR(`ytBckKa_4Fy=9%8tC_dZ*uOoN^l|cp;8|lZZvhcP1PV z2wvb9U&_wD6XeSxiZOFuE((^6=~Y~hxQvrmZlHL(uZVya^H`J4Z!wz%Wd6h*fx-~# zD1kpnLH<3D+lC+Szb{@`1z*C5<;F}Gp^ya`Mie`N?HV*+enOa+%J{P_)jg*_*H~)L zPhr7Oq&hzyqZ1QHzn57_7h9@qEpaR}@s_-2%Q`oRs1FVh_GcK|MuHECC{b5C=uT9$ zq7h<}tBj-M|1oMk-!aC>R3^phHu3c<(QmtqNQ3f|5D`mO{P%vUQPG|ebyG#Cr@n2Z zryL6`tofynEbO=M*xd605n3^eXfnB9%~n zW_O3K!BifZ<+zM$FToA!1;01rv0Wpuid20H( z)U+QF&OolBZs9e@r{af6I?O+RiI5Q7M5L2UMBnrHqEAK47UFIg!8PE8;EJi(e?tw) zWF*;D?Ga}d6E}+!t5KDI@>sy|u689H+nYpUOJmp|1rWUt(9cRRFq?Vsp1#8u6#-F= z9VD?|_}(RDReJlt4wd}Iidz&1A;spw%hAl} zg!Q%tXD^b6ScVPidJfhWa;H10G3fK#!WBnERQe8D=^7b_%UJ6!SF`tD)g=!@F=s%!tl6GtbeZNl753fDrPtbE%xstJzU7J|zk`<>69usZ%=gS$*bK0z zyuEaifEUi}5mQ&MDr-+|Dnlp}>t7yyT1or`8ZM-z%gI}a zqVjVQ{FIhU(Z+sDl09`f3LQ1EDsc(X;Ff*MN%lJ^6)br{^Zl$rugD7Y5JcmRTqD#w z&4@w4E%S?*n~rCIPBv}r)W97f;Pe&s^&lpPavrwV07V|oZunz>Fy57GYtXUtsJeSF z7A>%cx5;7E+Rl8s#r3ZPQCQqY%FK!rSqFtkUKe z2!5NLXUIQBEcASE#X0@UUU)+EiaSdvIp3pp3e7+VB>az(07ROb4(=9!Q z4T<5p>`^zD9=yZ|?&h4;bGB^FR(7v}Et&{F_Kw>aWB+#V2H5VbdlDB1icm^Q$}k&B zOLHQlcF*Tj0Q@xckT`BhE;g2_v)3a2c!pbtzOY-EF!_RoikI{1Sm3n^B- zi68VueJXeAhT}~zpizWkV%pjQin*vP$`B4g+$)mIg4=fy^~ursU$(HOkmats@CmQW zX}gp%yg%d{dwo&k5(7vwqzg=>cbSIU)kZ;QmOp>QoAGY(0C+5m6v-#zq;402e{y`+ z+ft;mz>;=kH4KGheW!B*ynA8ZYqPDwi|QPUQ}V|@<(`ATgsPjM54E#OWvBGyGY2Lz zyF7mA>Hj&pAgrIE58nuxS$6B)|LDvbWCVwNjj-2AEPvjT3JYuUc)4Bxsl~PfmlXRH ze#o~fOWV#}0>Wl_vYe)QJp4V))z-(kKxH|*x=v**@H+7XrRw(89VemGZlH!0g@o?= zs49V{BYRUs3nS)#u-IG}3Nz1NJ>@y7rqJ5D9_(rMx@(M;tPZ%-017gJ_W* z*Eh=0_qt#?T0o5aaYUll_&ZXoEjapP&U=r3`Cv`z55YB6Xn^ZbSou%-8P35xt+r_@ z9NUFNl5bm3t~1Y?RCWE!Mb>&juun;~UeD)m`@5-2h$v~^45>S6=>vl$l(mb|S)yM5 zymuMBTRf1qfhCm0e$CzT%Ti&|qFh<@zbvb!CLlG~E(aL_3og~5t8ym~&VId2leBCI)`o*zq z582=<`AR-r8aC63&2Z(p6W0aDzUP#IZ7sog=ZnrImU+^hZMA=qvi|lyB@{NgP4ES9 z{A$P)g+{;UX2`sv+lb0_g^^}L0oM1QJMK6CT(^-o4BeoDUHJo&k2Trvj$6PzGdE`X zWH}eOktT5za!Ri0a^3gi`OcCs;92w%x}FU8WCx<~Q*P~q_Ho&gji4*n=S)cp=v?Du;`%&rpkR;D#fV-KugXUi<|uuV4_V9LK5U9Q5EKT#Dc zsF07Sp}DNK9F~XNTxkNfzhR%@uw!%fVsZBNAqY^sC64yAwa*9%C#!H?x@_%VLa67{ zN`Po8M4GTVKiP*1K6PvYZJluTa7J>6{0ULJ7jW7#=hRYI8tAoxNHGvbjH2!Q9;Hwg zKH4r1>wOSBTYowjAhVt{%mhni5yE*K3Q{Wd{+~COB%e4 z-+$%7y8Qm}#(hJ-sXw?%9R@wL9$RKdR+veRK( z9vaI(`?y(CB~%Av^GPCqw!D1ww8s8p1ZW<~=M6^q;77Pd6X(Q=`8`cS~`qt=M(`WcM88|5>)*wmXbID z@nt?AxBfIf%&p9ZuGUQiX`8umx$q#-L-0;_)OxwOa)R-^uCY_piL!X8&DN%#(ENAG z#e7rRYpH$bq%|tmPE}=?RBLptg02naf1^)sFO)XSI^bek8>`iJ(%7F%?TO63$DSQn zg3}@h8#U5~6Ot_6Gu>`7EWS$X6`R>W8n($z_ z(hv6K$*XGLM#pO#8p;|Q&%euzLnA=2{A`~s0Ql1rCcQh7L25XtG$$&58pb&hQPkb_ zMD35~q#a@y*q>0S7t`?a_PKMQrXTF*>_2(kwml1cM9Q3exeXDc#XI}j30J#OsNd|8 zh!YLzj1I^8Y)pO@^k>hFKAg77nAw`d;d zpAaBL#H!uYNQL}%!C$L%sBD&X@9Ns$?dI2KR~`riD27#WvGDO;W(58bQD#EW-NB~f#3F@N(}PEF z6DD_S-2P6Z*LYkY{jI2aoaB88+A^0%lC-6L_)ZTf|Th(07|8x&M^>_yZZ z8i99Q&~$?$#$C_%O}9}{-*gvwDp>C@ypj9^|0b-E@D#1%U8bdJbo% zsDYw?X983@IbWU3W7!U+@F*kZbbYfKflS{19-QMyV$7wCBt{3j!;*3dr&?fT_;qn` zxMc_sjjro?-D8$gLi^Rh{h}uf^_#N()L30uL9+QbS&vWMEOLLCMtkcTC@H{;YJ2hds!Efk{?&;%C;^jve zpocVm&$za8Sg)z1VY~hu<(91%iHpy-(i1#w82)p%%}(rRnL_S;nDTe(*eq0^UDXMX zvJfZJcWTba#jDa4iZ&TC(_z4xI0Z8>Y-aC~Af?XVaj@E77AM6sZEZSvM6s~h+0%*@ zj!j~P^5T#`+zO(k1oqEJ_Fo$CQ!d(d;Ff7|h*Z9dFZ&EAMagtfm3i8o7#{yX!G%;` zw6kJ=f5NZxa#zSEMO|^4KN9v)dyKG5HjizP3IE=O?UEuHMcQic6)9M z=D$g&tw^<@kQYaWBG}5sG`B%jSC%>fKmTy~c+G8|&xhpS4M0VXDP0>>t2<*r>fSG5 zv{-9a#thdnSqmEiWS=Ko>M2{g>OB^|mG6uy{BTLhtyoqet1H4&V>_S4wg?KhWh&R6 z>gs#o3n8)i3~1-)M=sony9Q7H_~sy|uEd{LsqP;Tt()`_z;=3TQ0U#5H0|SJSE>?MS&J34klF?XsWTZSz9L zp!y4yeP(mDC)=f9Nzr0}>4V_q@9(l@IFonIB@#eBx2VNqqN7B%ET2<9!sT4QRl?H_H@Q;{}e zo;~_9yfd2b#E?^MJV8sfcD@<+mQ?Ho(5tSkH^P^V_@%r1iOjYzzj65Rn zc&R?7>DPHx$)h;*70gK-+ST z*S}CIXF*k|<#%>%wTFwq*6Emk0WTt7rVPT9O3LM9^k8sb@$hl8>5lxS^hz)13mtm> zf7eF)zMK1P9ZaK=;TOsp5mAbFRk0!84Fng~+8W8I;`al0OD9WnHlz%i0{67%f B{;2=} literal 0 HcmV?d00001 diff --git a/app/assets/images/loading.gif b/app/assets/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..6fba77609ec50f9ab338a90d658e16bb05b8d206 GIT binary patch literal 1688 zcmb`{Z%i9?90u@T|8OmBp{1p?1LC6bjoZDt zkXep>N0_=eva4($!i&&_A= zW;rjn{OxjfHIq1=2=5CoTwNF*91gVyGpm_kvp>8yy0hlS_a|Ji)@kL>dI%ZU?-^tFX>XV|yhM;_kA{Hbj4_?z5yjh^aFnC>zj^ z_o#~Hj9!_H_*k7~=KW86b?g7){QF<}*1#h#Mg;I?KfvJ(Qn0`|`BAdFr+c0K))KhV z*VBp7xc^E2^r^{p+tmzG058~M{V~WRzNN315Fgk94t9hH^W?`#Bm#eA1pn#xrXL)h zI^;Ui`0^Wt{g;NKDbM;@HlU>SeVzx$S zD(zKa4PR~x=t+@VO553Pr?otfml2s$r5>svWlh@%v+uePKj_d>&Sdse`V8u3A-efVY*!3yWCkn;jGN z4p{|BeYkjFBuDAmvz64yq>ELiQR#^<2l$(TJ_(cKNgIz_Nhh1{G-^uptX@&fDfK2t z(V)gap5e@`c^bWergglzjkZ2b7t|ZiD2PIur&VL64kt(#wk%s zfpfc0(7HF(kPybcEeIz;ajkaEet4sf;8~k<7z?FDCO6U`$2I{oVnGgoggOchLhOqN zujBo1p!U0lG3Lc@doPaP9*MBWqJ6csgq&1;(|E<#M=8iVshFbW=dNn!XfpbUcOt5= zE9QQ%mv7-6?w%-TGfT~7?vfl`ue3$U8Hk1(Ar{J5VlbKLUbFb5$<}64dvvPYQY$gZ z-{o1=x%2J~N7H{eLJ-9RB~A-UI6@GPsO9tr(~w0oVGU3e5=_{g(8NjrC^SKdatd>N zZ_ojXLLvZ|&VD*8OgVP*-7I$V!nFk~4-nrk^8fCs{i$`wIdNfSjQ?CDCdQYDd}#4E zzO35eJ}t3O)RgwDxNBFV=}K*%X_Sk;Fy$B%yR;^qxMio+)v4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`GuBNuFf>#!Gt)CP zF*P$Y)KM@pFf`IP03tJ8LlY}gGbUo-h6WQb!1OB;3-k^33_xCjDfIQluQWFouDZA+C>7yetOgf{R2HP_ z2c;J0mlh=hBQ8xDWL1Hcb5UwyNq$jCetr%t6azByOY(~|@(UE4gUu8)d=ry1^FRWc zU>&}`R-SpqC5d^-sh%#jN=B~J68 zdQ)(_#Sy1oeV}9XK~ako)i5Do`T;TF2^YwLC;iksV0teCCTs_9qeun@MlDYl$B>F! zNngHxO+COY(Rf3+V{zjR!4B2NAI1XtY>$c*>NaIwR+}?x<_C#0JV#zPR%i>jJMywI z#%cVQ5;%YOxlv8qamJ1Ia+MQQJL~G|*q%tpopX@6pmMxGREalT{dj?x67PSV1>!iP+Sck0JKBs=VB zY21bSiC-X1C{Yf04 Ovc%KX&t;ucLK6T;c#OLM literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/admin.js.coffee b/app/assets/javascripts/admin.js.coffee new file mode 100755 index 00000000..de94d7bd --- /dev/null +++ b/app/assets/javascripts/admin.js.coffee @@ -0,0 +1,176 @@ +Selfstarter.admin = + + init: -> + + _this = this + + # + # All admin pages + # + + $('a.advanced_toggle').on "click", (e) -> + e.preventDefault() + $('#advanced').slideToggle() + + # + # Admin Campaigns + # + + $('#campaign_expiration_date').datetimepicker({ + timeFormat: "h:mm tt", + minDate: new Date() + }); + + d = $('#campaign_expiration_date').val() + if(d && d.length > 0) + d = new Date(d) + h = d.getHours() + if(h > 12) + t = (h-12) + ':' + ("0" + d.getMinutes()).slice(-2) + ' pm' + else + if(h == 0) + h = 12 + t = h + ':' + ("0" + d.getMinutes()).slice(-2) + ' am' + $('#campaign_expiration_date').val($.datepicker.formatDate('mm/dd/yy',d) + ' ' + t) + + $('form.campaign_form').on "submit", -> + $date = $('#campaign_expiration_date') + $date.val(new Date($date.val()).toUTCString()) + this.submit() + + $('input#campaign_collect_additional_info').on "change", -> + $('.additional_info_input').slideToggle() + + $('input[name="campaign[media_type]"]').on "change", -> + $('#video-options').slideToggle() + $('#image-options').slideToggle() + + $('input#campaign_payment_type_any').on "change", -> + $('#preset-amount').slideUp() + $('#min-amount').slideUp() + $('#no-rewards').slideUp() + $('#rewards').slideDown() + + $('input#campaign_payment_type_fixed').on "change", -> + $('#min-amount').slideUp() + $('#preset-amount').slideDown() + $('#rewards').slideUp() + $('#no-rewards').slideDown() + + $('input#campaign_payment_type_min').on "change", -> + $('#preset-amount').slideUp() + $('#min-amount').slideDown() + $('#no-rewards').slideUp() + $('#rewards').slideDown() + + $('input#goal_type_dollars').on "change", -> + $('input#campaign_payment_type_min').attr('disabled', false) + $('input#campaign_payment_type_any').attr('disabled', false) + $('#flexible_payment_options').show() + $('.amount_input').slideDown() + $('.orders_input').slideUp() + + $('input#goal_type_orders').on "change", -> + $('input#campaign_payment_type_fixed').trigger('click') + $('input#campaign_payment_type_min').attr('disabled', true) + $('input#campaign_payment_type_any').attr('disabled', true) + $('#flexible_payment_options').hide() + $('.amount_input').slideUp() + $('.orders_input').slideDown() + + $('#reward-add').on 'click', (e) -> + e.preventDefault() + $('#rewards ul').append('
  • RewardNumber ClaimedDelete?
    $



    0
  • ') + + $('.faq.sortable').sortable + stop: (e, ui) -> + iterator = 1 + $.each $('.faq.sortable li'), -> + $this = $(this) + $this.find('span').html(iterator) + iterator++ + + $('#faq-add').on 'click', (e) -> + e.preventDefault() + $element = $('.faq.sortable li:last-child').clone() + position = parseInt($element.find('span').html(), 10) + 1 + $element.find('span').html(position) + $element.find('textarea[name="faq[][question]"]').html('') + $element.find('textarea[name="faq[][answer]"]').html('') + $element.appendTo('.faq.sortable') + + $('.faq.sortable').on 'click', (e) -> + $this = $(e.target) + if $this.is('.faq-delete') + e.preventDefault() + $this.parent().remove() + iterator = 1 + $.each $('.faq.sortable li'), -> + $this = $(this) + $this.find('span').html(iterator) + iterator++ + + # + # Admin Bank Setup + # + + $('#bank_form').on "submit", (e) -> + e.preventDefault() + $('#errors').html('') + $this = $(this) + + userData = + name: $this.find('#full_legal_name').val() + phone: $this.find('#phone').val() + street_address: $this.find('#street_address').val() + postal_code: $this.find('#zip').val() + dob: $this.find('#birth_year').val() + '-' + $this.find('#birth_month').val() + + $.ajax '/ajax/verify', + type: 'POST' + data: userData + beforeSend: (jqXHR, settings) -> + # Devise requires the CSRF token in order to still recognize the current user + jqXHR.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')) + success: (data) -> + if(data == "success") + _this.createBankAccount($this) + else + $('#errors').append('

    An error occurred, please re-enter your account information

    ') + $('.loader').hide() + + + # Custom Functions + + createBankAccount: ($form) -> + bankData = + account_number: $form.find('#account_number').val() + name: $form.find('#full_legal_name').val() + bank_code: $form.find('#bank_routing_number').val() + + errors={} + if !crowdtilt.bank.validateUSARoutingNumber(bankData.bank_code) + errors["bank_routing_number"] = "Invalid routing number" + if bankData.account_number == '' + errors["bank_account_number"] = "Invalid account number" + + if !$.isEmptyObject(errors) + $.each errors, (index, value) -> + $('#errors').append('

    ' + value + '

    ') + $('.loader').hide() + else + user_id = $form.find('#ct_user_id').val() + crowdtilt.bank.create(user_id, bankData, Selfstarter.admin.bankResponseHandler) + + + bankResponseHandler: (response) -> + switch response.status + when 201 + token = response.bank.id + input = $(''); + form = document.getElementById('bank_form') + form.appendChild(input[0]) + form.submit() + else + $('#errors').append('

    An error occurred. Please try again.

    ') + $('.loader').hide() \ No newline at end of file diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100755 index 00000000..cd922de8 --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,26 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, +// or vendor/assets/javascripts of plugins, if any, 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 +// the compiled file. +// +// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD +// GO AFTER THE REQUIRES BELOW. +// + +//= require html5shiv-printshiv +//= require jquery +//= require jquery_ujs +//= require jquery.ui.all +//= require jquery.textchange +//= require jquery.timepicker +//= require ckeditorbase +//= require ckeditor/init +//= require bootstrap +//= require main +//= require admin +//= require campaigns +//= require theme \ No newline at end of file diff --git a/app/assets/javascripts/campaigns.js.coffee b/app/assets/javascripts/campaigns.js.coffee new file mode 100755 index 00000000..0d5c4bb4 --- /dev/null +++ b/app/assets/javascripts/campaigns.js.coffee @@ -0,0 +1,70 @@ +Selfstarter.campaigns = + + init: -> + + _this = this + + $("#video_image").on "click", -> + $("#player").removeClass("hidden") + $("#player").css('display', 'block') + $(this).hide() + + # Checkout section functions: + $('#quantity').on "change", (e) -> + quantity = $(this).val() + $amount = $('#amount') + new_amount = parseFloat($amount.attr('data-original')) * quantity + $amount.val(new_amount) + $('#total').html(new_amount.toFixed(2)) + + $('#amount').focus() + + $('.reward_option.active').on "click", (e) -> + $this = $(this) + $amount = $('#amount') + $this.find('input').prop('checked', true) + $('.reward_option').css('background-color', '') + $this.css('background-color', '#e6e6e6') + $amount.val($this.attr('data-price')) + + $('#payment_form').on "submit", (e) -> + e.preventDefault() + $('#errors').hide() + $('#errors').html('') + $('button[type="submit"]').attr('disabled', true).html('Processing, please wait...') + + $this = $(this) + + cardData = + number: $this.find('#card_number').val() + expiration_month: $this.find('#expiration_month').val() + expiration_year: $this.find('#expiration_year').val() + security_code: $this.find('#security_code').val() + + errors = crowdtilt.card.validate(cardData) + if !$.isEmptyObject(errors) + $.each errors, (index, value) -> + $('#errors').append('

    ' + value + '

    ') + $('#errors').show() + $('.loader').hide() + $button = $('button[type="submit"]') + $button.attr('disabled', false).html('Confirm payment of $' + $button.attr('data-total')) + else + user_id = $this.find('#ct_user_id').val() + crowdtilt.card.create(user_id, cardData, _this.cardResponseHandler) + + + cardResponseHandler: (response) -> + switch response.status + when 201 + token = response.card.id + input = $(''); + form = document.getElementById('payment_form') + form.appendChild(input[0]) + form.submit() + else + $('#errors').append('

    An error occurred. Please check your credit card details and try again.

    ') + $('#errors').show() + $('.loader').hide() + $button = $('button[type="submit"]') + $button.attr('disabled', false).html('Confirm payment of $' + $button.attr('data-total') ) diff --git a/app/assets/javascripts/ckeditorbase.js.erb b/app/assets/javascripts/ckeditorbase.js.erb new file mode 100755 index 00000000..1a39d522 --- /dev/null +++ b/app/assets/javascripts/ckeditorbase.js.erb @@ -0,0 +1,9 @@ +<% if Rails.env == 'production' %> +<% +base_path = '' +base_path << Rails.configuration.action_controller.asset_host +base_path << Rails.configuration.assets.prefix +base_path << '/ckeditor/' +%> +var CKEDITOR_BASEPATH = '<%= base_path %>'; +<% end %> diff --git a/app/assets/javascripts/jquery.textchange.js b/app/assets/javascripts/jquery.textchange.js new file mode 100755 index 00000000..93f179a2 --- /dev/null +++ b/app/assets/javascripts/jquery.textchange.js @@ -0,0 +1,10 @@ +/*! + * jQuery TextChange Plugin + * http://www.zurb.com/playground/jquery-text-change-custom-event + * + * Copyright 2010, ZURB + * Released under the MIT License + */ + (function(a){a.event.special.textchange={setup:function(){a(this).data("lastValue",this.contentEditable==="true"?a(this).html():a(this).val());a(this).bind("keyup.textchange",a.event.special.textchange.handler);a(this).bind("cut.textchange paste.textchange input.textchange",a.event.special.textchange.delayedHandler)},teardown:function(){a(this).unbind(".textchange")},handler:function(){a.event.special.textchange.triggerIfChanged(a(this))},delayedHandler:function(){var c=a(this);setTimeout(function(){a.event.special.textchange.triggerIfChanged(c)}, + 25)},triggerIfChanged:function(a){var b=a[0].contentEditable==="true"?a.html():a.val();b!==a.data("lastValue")&&(a.trigger("textchange",[a.data("lastValue")]),a.data("lastValue",b))}};a.event.special.hastext={setup:function(){a(this).bind("textchange",a.event.special.hastext.handler)},teardown:function(){a(this).unbind("textchange",a.event.special.hastext.handler)},handler:function(c,b){b===""&&b!==a(this).val()&&a(this).trigger("hastext")}};a.event.special.notext={setup:function(){a(this).bind("textchange", + a.event.special.notext.handler)},teardown:function(){a(this).unbind("textchange",a.event.special.notext.handler)},handler:function(c,b){a(this).val()===""&&a(this).val()!==b&&a(this).trigger("notext")}}})(jQuery); \ No newline at end of file diff --git a/app/assets/javascripts/jquery.timepicker.js b/app/assets/javascripts/jquery.timepicker.js new file mode 100755 index 00000000..15a3bdb9 --- /dev/null +++ b/app/assets/javascripts/jquery.timepicker.js @@ -0,0 +1,1919 @@ +/* + * jQuery timepicker addon + * By: Trent Richardson [http://trentrichardson.com] + * Version 1.2 + * Last Modified: 02/02/2013 + * + * Copyright 2013 Trent Richardson + * You may use this project under MIT or GPL licenses. + * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt + * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt + */ + +/*jslint evil: true, white: false, undef: false, nomen: false */ + +(function($) { + + /* + * Lets not redefine timepicker, Prevent "Uncaught RangeError: Maximum call stack size exceeded" + */ + $.ui.timepicker = $.ui.timepicker || {}; + if ($.ui.timepicker.version) { + return; + } + + /* + * Extend jQueryUI, get it started with our version number + */ + $.extend($.ui, { + timepicker: { + version: "1.2" + } + }); + + /* + * Timepicker manager. + * Use the singleton instance of this class, $.timepicker, to interact with the time picker. + * Settings for (groups of) time pickers are maintained in an instance object, + * allowing multiple different settings on the same page. + */ + var Timepicker = function() { + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + currentText: 'Now', + closeText: 'Done', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + timeFormat: 'HH:mm', + timeSuffix: '', + timeOnlyTitle: 'Choose Time', + timeText: 'Time', + hourText: 'Hour', + minuteText: 'Minute', + secondText: 'Second', + millisecText: 'Millisecond', + timezoneText: 'Time Zone', + isRTL: false + }; + this._defaults = { // Global defaults for all the datetime picker instances + showButtonPanel: true, + timeOnly: false, + showHour: true, + showMinute: true, + showSecond: false, + showMillisec: false, + showTimezone: false, + showTime: true, + stepHour: 1, + stepMinute: 1, + stepSecond: 1, + stepMillisec: 1, + hour: 0, + minute: 0, + second: 0, + millisec: 0, + timezone: null, + useLocalTimezone: false, + defaultTimezone: "+0000", + hourMin: 0, + minuteMin: 0, + secondMin: 0, + millisecMin: 0, + hourMax: 23, + minuteMax: 59, + secondMax: 59, + millisecMax: 999, + minDateTime: null, + maxDateTime: null, + onSelect: null, + hourGrid: 0, + minuteGrid: 0, + secondGrid: 0, + millisecGrid: 0, + alwaysSetTime: true, + separator: ' ', + altFieldTimeOnly: true, + altTimeFormat: null, + altSeparator: null, + altTimeSuffix: null, + pickerTimeFormat: null, + pickerTimeSuffix: null, + showTimepicker: true, + timezoneIso8601: false, + timezoneList: null, + addSliderAccess: false, + sliderAccessArgs: null, + controlType: 'slider', + defaultValue: null, + parse: 'strict' + }; + $.extend(this._defaults, this.regional['']); + }; + + $.extend(Timepicker.prototype, { + $input: null, + $altInput: null, + $timeObj: null, + inst: null, + hour_slider: null, + minute_slider: null, + second_slider: null, + millisec_slider: null, + timezone_select: null, + hour: 0, + minute: 0, + second: 0, + millisec: 0, + timezone: null, + defaultTimezone: "+0000", + hourMinOriginal: null, + minuteMinOriginal: null, + secondMinOriginal: null, + millisecMinOriginal: null, + hourMaxOriginal: null, + minuteMaxOriginal: null, + secondMaxOriginal: null, + millisecMaxOriginal: null, + ampm: '', + formattedDate: '', + formattedTime: '', + formattedDateTime: '', + timezoneList: null, + units: ['hour','minute','second','millisec'], + control: null, + + /* + * Override the default settings for all instances of the time picker. + * @param settings object - the new settings to use as defaults (anonymous object) + * @return the manager object + */ + setDefaults: function(settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + /* + * Create a new Timepicker instance + */ + _newInst: function($input, o) { + var tp_inst = new Timepicker(), + inlineSettings = {}, + fns = {}, + overrides, i; + + for (var attrName in this._defaults) { + if(this._defaults.hasOwnProperty(attrName)){ + var attrValue = $input.attr('time:' + attrName); + if (attrValue) { + try { + inlineSettings[attrName] = eval(attrValue); + } catch (err) { + inlineSettings[attrName] = attrValue; + } + } + } + } + overrides = { + beforeShow: function (input, dp_inst) { + if ($.isFunction(tp_inst._defaults.evnts.beforeShow)) { + return tp_inst._defaults.evnts.beforeShow.call($input[0], input, dp_inst, tp_inst); + } + }, + onChangeMonthYear: function (year, month, dp_inst) { + // Update the time as well : this prevents the time from disappearing from the $input field. + tp_inst._updateDateTime(dp_inst); + if ($.isFunction(tp_inst._defaults.evnts.onChangeMonthYear)) { + tp_inst._defaults.evnts.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst); + } + }, + onClose: function (dateText, dp_inst) { + if (tp_inst.timeDefined === true && $input.val() !== '') { + tp_inst._updateDateTime(dp_inst); + } + if ($.isFunction(tp_inst._defaults.evnts.onClose)) { + tp_inst._defaults.evnts.onClose.call($input[0], dateText, dp_inst, tp_inst); + } + } + }; + for (i in overrides) { + if (overrides.hasOwnProperty(i)) { + fns[i] = o[i] || null; + } + } + tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, o, overrides, { + evnts:fns, + timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker'); + }); + tp_inst.amNames = $.map(tp_inst._defaults.amNames, function(val) { + return val.toUpperCase(); + }); + tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function(val) { + return val.toUpperCase(); + }); + + // controlType is string - key to our this._controls + if(typeof(tp_inst._defaults.controlType) === 'string'){ + if($.fn[tp_inst._defaults.controlType] === undefined){ + tp_inst._defaults.controlType = 'select'; + } + tp_inst.control = tp_inst._controls[tp_inst._defaults.controlType]; + } + // controlType is an object and must implement create, options, value methods + else{ + tp_inst.control = tp_inst._defaults.controlType; + } + + if (tp_inst._defaults.timezoneList === null) { + var timezoneList = ['-1200', '-1100', '-1000', '-0930', '-0900', '-0800', '-0700', '-0600', '-0500', '-0430', '-0400', '-0330', '-0300', '-0200', '-0100', '+0000', + '+0100', '+0200', '+0300', '+0330', '+0400', '+0430', '+0500', '+0530', '+0545', '+0600', '+0630', '+0700', '+0800', '+0845', '+0900', '+0930', + '+1000', '+1030', '+1100', '+1130', '+1200', '+1245', '+1300', '+1400']; + + if (tp_inst._defaults.timezoneIso8601) { + timezoneList = $.map(timezoneList, function(val) { + return val == '+0000' ? 'Z' : (val.substring(0, 3) + ':' + val.substring(3)); + }); + } + tp_inst._defaults.timezoneList = timezoneList; + } + + tp_inst.timezone = tp_inst._defaults.timezone; + tp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin? tp_inst._defaults.hourMin : + tp_inst._defaults.hour > tp_inst._defaults.hourMax? tp_inst._defaults.hourMax : tp_inst._defaults.hour; + tp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin? tp_inst._defaults.minuteMin : + tp_inst._defaults.minute > tp_inst._defaults.minuteMax? tp_inst._defaults.minuteMax : tp_inst._defaults.minute; + tp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin? tp_inst._defaults.secondMin : + tp_inst._defaults.second > tp_inst._defaults.secondMax? tp_inst._defaults.secondMax : tp_inst._defaults.second; + tp_inst.millisec = tp_inst._defaults.millisec < tp_inst._defaults.millisecMin? tp_inst._defaults.millisecMin : + tp_inst._defaults.millisec > tp_inst._defaults.millisecMax? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec; + tp_inst.ampm = ''; + tp_inst.$input = $input; + + if (o.altField) { + tp_inst.$altInput = $(o.altField).css({ + cursor: 'pointer' + }).focus(function() { + $input.trigger("focus"); + }); + } + + if (tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0) { + tp_inst._defaults.minDate = new Date(); + } + if (tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0) { + tp_inst._defaults.maxDate = new Date(); + } + + // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime.. + if (tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) { + tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime()); + } + if (tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) { + tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime()); + } + if (tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) { + tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime()); + } + if (tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) { + tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime()); + } + tp_inst.$input.bind('focus', function() { + tp_inst._onFocus(); + }); + + return tp_inst; + }, + + /* + * add our sliders to the calendar + */ + _addTimePicker: function(dp_inst) { + var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val(); + + this.timeDefined = this._parseTime(currDT); + this._limitMinMaxDateTime(dp_inst, false); + this._injectTimePicker(); + }, + + /* + * parse the time string from input value or _setTime + */ + _parseTime: function(timeString, withDate) { + if (!this.inst) { + this.inst = $.datepicker._getInst(this.$input[0]); + } + + if (withDate || !this._defaults.timeOnly) { + var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat'); + try { + var parseRes = parseDateTimeInternal(dp_dateFormat, this._defaults.timeFormat, timeString, $.datepicker._getFormatConfig(this.inst), this._defaults); + if (!parseRes.timeObj) { + return false; + } + $.extend(this, parseRes.timeObj); + } catch (err) { + $.timepicker.log("Error parsing the date/time string: " + err + + "\ndate/time string = " + timeString + + "\ntimeFormat = " + this._defaults.timeFormat + + "\ndateFormat = " + dp_dateFormat); + return false; + } + return true; + } else { + var timeObj = $.datepicker.parseTime(this._defaults.timeFormat, timeString, this._defaults); + if (!timeObj) { + return false; + } + $.extend(this, timeObj); + return true; + } + }, + + /* + * generate and inject html for timepicker into ui datepicker + */ + _injectTimePicker: function() { + var $dp = this.inst.dpDiv, + o = this.inst.settings, + tp_inst = this, + litem = '', + uitem = '', + max = {}, + gridSize = {}, + size = null; + + // Prevent displaying twice + if ($dp.find("div.ui-timepicker-div").length === 0 && o.showTimepicker) { + var noDisplay = ' style="display:none;"', + html = '
    ' + '
    ' + o.timeText + '
    ' + + '
    '; + + // Create the markup + for(var i=0,l=this.units.length; i' + o[litem +'Text'] + '' + + '
    '; + + if (o['show'+uitem] && o[litem+'Grid'] > 0) { + html += '
    '; + + if(litem == 'hour'){ + for (var h = o[litem+'Min']; h <= max[litem]; h += parseInt(o[litem+'Grid'], 10)) { + gridSize[litem]++; + var tmph = $.datepicker.formatTime(useAmpm(o.pickerTimeFormat || o.timeFormat)? 'hht':'HH', {hour:h}, o); + html += ''; + } + } + else{ + for (var m = o[litem+'Min']; m <= max[litem]; m += parseInt(o[litem+'Grid'], 10)) { + gridSize[litem]++; + html += ''; + } + } + + html += '
    ' + tmph + '' + ((m < 10) ? '0' : '') + m + '
    '; + } + html += '
    '; + } + + // Timezone + html += '
    ' + o.timezoneText + '
    '; + html += '
    '; + + // Create the elements from string + html += '
    '; + var $tp = $(html); + + // if we only want time picker... + if (o.timeOnly === true) { + $tp.prepend('
    ' + '
    ' + o.timeOnlyTitle + '
    ' + '
    '); + $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide(); + } + + // add sliders, adjust grids, add events + for(var i=0,l=tp_inst.units.length; i 0) { + size = 100 * gridSize[litem] * o[litem+'Grid'] / (max[litem] - o[litem+'Min']); + $tp.find('.ui_tpicker_'+litem+' table').css({ + width: size + "%", + marginLeft: o.isRTL? '0' : ((size / (-2 * gridSize[litem])) + "%"), + marginRight: o.isRTL? ((size / (-2 * gridSize[litem])) + "%") : '0', + borderCollapse: 'collapse' + }).find("td").click(function(e){ + var $t = $(this), + h = $t.html(), + n = parseInt(h.replace(/[^0-9]/g),10), + ap = h.replace(/[^apm]/ig), + f = $t.data('for'); // loses scope, so we use data-for + + if(f == 'hour'){ + if(ap.indexOf('p') !== -1 && n < 12){ + n += 12; + } + else{ + if(ap.indexOf('a') !== -1 && n === 12){ + n = 0; + } + } + } + + tp_inst.control.value(tp_inst, tp_inst[f+'_slider'], litem, n); + + tp_inst._onTimeChange(); + tp_inst._onSelectHandler(); + }) + .css({ + cursor: 'pointer', + width: (100 / gridSize[litem]) + '%', + textAlign: 'center', + overflow: 'hidden' + }); + } // end if grid > 0 + } // end for loop + + // Add timezone options + this.timezone_select = $tp.find('.ui_tpicker_timezone').append('').find("select"); + $.fn.append.apply(this.timezone_select, + $.map(o.timezoneList, function(val, idx) { + return $("