shell-spinner 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. data/.gitignore +4 -22
  2. data/Gemfile +3 -90
  3. data/README.markdown +44 -0
  4. data/Rakefile +1 -7
  5. data/lib/shell-spinner.rb +59 -0
  6. data/lib/shell-spinner/version.rb +3 -0
  7. data/shell-spinner.gemspec +18 -0
  8. metadata +5 -470
  9. data/.rspec +0 -1
  10. data/.rvmrc +0 -53
  11. data/Gemfile.lock +0 -479
  12. data/README.md +0 -56
  13. data/app/admin/carriers.rb +0 -17
  14. data/app/admin/dashboards.rb +0 -31
  15. data/app/admin/interviews.rb +0 -77
  16. data/app/admin/users.rb +0 -40
  17. data/app/assets/images/icons/ajax-loader.gif +0 -0
  18. data/app/assets/images/icons/clear-results.png +0 -0
  19. data/app/assets/images/icons/clipboard.png +0 -0
  20. data/app/assets/images/icons/magnify.png +0 -0
  21. data/app/assets/images/icons/social/facebook.png +0 -0
  22. data/app/assets/images/icons/social/google.png +0 -0
  23. data/app/assets/images/icons/social/linkedin.png +0 -0
  24. data/app/assets/images/icons/social/small/facebook.png +0 -0
  25. data/app/assets/images/icons/social/small/google.png +0 -0
  26. data/app/assets/images/icons/social/small/linkedin.png +0 -0
  27. data/app/assets/images/icons/social/small/twitter.png +0 -0
  28. data/app/assets/images/icons/social/small/windowslive.png +0 -0
  29. data/app/assets/images/icons/social/small/yahoo.png +0 -0
  30. data/app/assets/images/icons/social/twitter.png +0 -0
  31. data/app/assets/images/icons/social/windowslive.png +0 -0
  32. data/app/assets/images/icons/social/yahoo.png +0 -0
  33. data/app/assets/images/logo.png +0 -0
  34. data/app/assets/javascripts/active_admin.js.coffee +0 -18
  35. data/app/assets/javascripts/admin/base.coffee +0 -0
  36. data/app/assets/javascripts/admin/interview_form.coffee +0 -95
  37. data/app/assets/javascripts/app/controllers/questions.js.coffee +0 -12
  38. data/app/assets/javascripts/app/index.js.coffee +0 -25
  39. data/app/assets/javascripts/app/lib/view.js.coffee +0 -3
  40. data/app/assets/javascripts/app/models/interview_template.js.coffee +0 -6
  41. data/app/assets/javascripts/app/models/question.js.coffee +0 -6
  42. data/app/assets/javascripts/app/views/questions/show.jst.hamljs +0 -2
  43. data/app/assets/javascripts/application.coffee +0 -48
  44. data/app/assets/javascripts/attachment_form.coffee +0 -31
  45. data/app/assets/javascripts/clipboard_control.coffee +0 -30
  46. data/app/assets/javascripts/invitation_form.coffee +0 -72
  47. data/app/assets/javascripts/recommendation_form.coffee +0 -19
  48. data/app/assets/javascripts/recommendations_list.coffee +0 -11
  49. data/app/assets/javascripts/search_contacts_form.coffee +0 -36
  50. data/app/assets/javascripts/templates/empty_recipients_list.tmpl +0 -1
  51. data/app/assets/javascripts/templates/recipient.tmpl +0 -5
  52. data/app/assets/stylesheets/active_admin.css.scss +0 -28
  53. data/app/assets/stylesheets/application.sass +0 -24
  54. data/app/assets/stylesheets/includes/_authorisation.sass +0 -29
  55. data/app/assets/stylesheets/includes/_bootstrap_tweaks.sass +0 -2
  56. data/app/assets/stylesheets/includes/_campaigns.sass +0 -44
  57. data/app/assets/stylesheets/includes/_controls.sass +0 -41
  58. data/app/assets/stylesheets/includes/_form.sass +0 -23
  59. data/app/assets/stylesheets/includes/_formatting.sass +0 -8
  60. data/app/assets/stylesheets/includes/_icons.sass +0 -31
  61. data/app/assets/stylesheets/includes/_interview.sass +0 -16
  62. data/app/assets/stylesheets/includes/_interview_form.sass +0 -170
  63. data/app/assets/stylesheets/includes/_interview_management.sass +0 -3
  64. data/app/assets/stylesheets/includes/_invitation_form.sass +0 -190
  65. data/app/assets/stylesheets/includes/_layout.sass +0 -69
  66. data/app/assets/stylesheets/includes/_mixins.sass +0 -42
  67. data/app/assets/stylesheets/includes/_navigation.sass +0 -16
  68. data/app/assets/stylesheets/includes/_recommendations.sass +0 -34
  69. data/app/concerns/authenticate_users.rb +0 -72
  70. data/app/concerns/conditional_redirect_after_signing_in.rb +0 -24
  71. data/app/concerns/eventable.rb +0 -16
  72. data/app/controllers/application_controller.rb +0 -31
  73. data/app/controllers/attachments_controller.rb +0 -36
  74. data/app/controllers/campaigns_controller.rb +0 -23
  75. data/app/controllers/contacts_controller.rb +0 -37
  76. data/app/controllers/interview_result_invitations_controller.rb +0 -21
  77. data/app/controllers/interview_results_controller.rb +0 -39
  78. data/app/controllers/interview_templates_controller.rb +0 -3
  79. data/app/controllers/pages_controller.rb +0 -6
  80. data/app/controllers/questions_controller.rb +0 -5
  81. data/app/controllers/recommendations_controller.rb +0 -64
  82. data/app/controllers/resources_controller.rb +0 -1
  83. data/app/controllers/users/omniauth_callbacks_controller.rb +0 -52
  84. data/app/helpers/admin/interview_helper.rb +0 -14
  85. data/app/helpers/answers_helper.rb +0 -8
  86. data/app/helpers/application_helper.rb +0 -1
  87. data/app/helpers/attachments_helper.rb +0 -5
  88. data/app/helpers/campaigns_helper.rb +0 -5
  89. data/app/helpers/layout_helper.rb +0 -5
  90. data/app/helpers/recommendation_helper.rb +0 -14
  91. data/app/mailers/invitation_mailer.rb +0 -13
  92. data/app/models/ability.rb +0 -23
  93. data/app/models/answer.rb +0 -36
  94. data/app/models/answer_choice.rb +0 -28
  95. data/app/models/attachment.rb +0 -34
  96. data/app/models/buying_attempt.rb +0 -31
  97. data/app/models/campaign.rb +0 -37
  98. data/app/models/carrier.rb +0 -30
  99. data/app/models/cell_phone_insurance_interview.rb +0 -17
  100. data/app/models/contact.rb +0 -31
  101. data/app/models/default_interview.rb +0 -17
  102. data/app/models/interesting_fact.rb +0 -30
  103. data/app/models/interview_result.rb +0 -65
  104. data/app/models/interview_template.rb +0 -52
  105. data/app/models/invitation.rb +0 -45
  106. data/app/models/invitation_identifier.rb +0 -29
  107. data/app/models/numeric_question.rb +0 -19
  108. data/app/models/one_correct_question.rb +0 -27
  109. data/app/models/possible_answer.rb +0 -54
  110. data/app/models/question.rb +0 -96
  111. data/app/models/recommendation.rb +0 -27
  112. data/app/models/scale_question.rb +0 -42
  113. data/app/models/user.rb +0 -102
  114. data/app/models/yes_no_question.rb +0 -18
  115. data/app/renderers/nav_links_renderer.rb +0 -10
  116. data/app/uploaders/attachement_uploader.rb +0 -55
  117. data/app/uploaders/file_uploader.rb +0 -20
  118. data/app/views/admin/interviews/_form.html.haml +0 -36
  119. data/app/views/admin/interviews/_possible_answer_fields.html.haml +0 -6
  120. data/app/views/admin/interviews/_question_fields.html.haml +0 -28
  121. data/app/views/admin/interviews/_wrapper_question_fields.html.haml +0 -2
  122. data/app/views/admin/interviews/numeric_question/_fields.html.haml +0 -7
  123. data/app/views/admin/interviews/one_correct_question/_answer_fields.html.haml +0 -6
  124. data/app/views/admin/interviews/one_correct_question/_fields.html.haml +0 -18
  125. data/app/views/admin/interviews/scale_question/_fields.html.haml +0 -7
  126. data/app/views/admin/interviews/scale_question/_start_end_values.html.haml +0 -6
  127. data/app/views/admin/interviews/yes_no_question/_fields.html.haml +0 -3
  128. data/app/views/attachments/_form.html.haml +0 -5
  129. data/app/views/attachments/_interesting_facts.html.haml +0 -11
  130. data/app/views/attachments/_resource.html.haml +0 -13
  131. data/app/views/attachments/buttons/_delete.html.haml +0 -3
  132. data/app/views/attachments/index.html.haml +0 -28
  133. data/app/views/attachments/new.html.haml +0 -1
  134. data/app/views/attachments/show.html.haml +0 -1
  135. data/app/views/campaigns/_form.html.haml +0 -7
  136. data/app/views/campaigns/_form_actions.html.haml +0 -4
  137. data/app/views/campaigns/edit.html.haml +0 -7
  138. data/app/views/campaigns/index.html.haml +0 -14
  139. data/app/views/campaigns/new.html.haml +0 -7
  140. data/app/views/campaigns/show.html.haml +0 -15
  141. data/app/views/contacts/_list.html.haml +0 -17
  142. data/app/views/contacts/_table.html.haml +0 -8
  143. data/app/views/contacts/search.html.haml +0 -1
  144. data/app/views/interesting_facts/_fact.html.haml +0 -4
  145. data/app/views/interview_result_invitations/new.html.haml +0 -29
  146. data/app/views/interview_results/_answer_choice.html.haml +0 -11
  147. data/app/views/interview_results/_form.html.haml +0 -16
  148. data/app/views/interview_results/_list.html.haml +0 -3
  149. data/app/views/interview_results/_numeric_question.html.haml +0 -3
  150. data/app/views/interview_results/_one_correct_question.html.haml +0 -3
  151. data/app/views/interview_results/_scale_question.html.haml +0 -6
  152. data/app/views/interview_results/_yes_no_question.html.haml +0 -6
  153. data/app/views/interview_results/index.html.haml +0 -2
  154. data/app/views/interview_results/new.html.haml +0 -4
  155. data/app/views/interview_results/numeric/_price.html.haml +0 -2
  156. data/app/views/interview_results/numeric/_simple_number.html.haml +0 -2
  157. data/app/views/interview_results/one_correct/_dropdown.html.haml +0 -1
  158. data/app/views/interview_results/one_correct/_radio.html.haml +0 -2
  159. data/app/views/interview_results/one_correct/_slider.html.haml +0 -2
  160. data/app/views/interview_results/show.html.haml +0 -24
  161. data/app/views/interview_templates/index.json.rabl +0 -6
  162. data/app/views/interview_templates/show.html.haml +0 -1
  163. data/app/views/layouts/_footer.haml +0 -9
  164. data/app/views/layouts/_header.haml +0 -21
  165. data/app/views/layouts/application.html.haml +0 -29
  166. data/app/views/pages/home.html.haml +0 -10
  167. data/app/views/questions/show.json.rabl +0 -2
  168. data/app/views/recommendations/new.html.haml +0 -19
  169. data/app/views/shared/_ask_facebook_friends.html.haml +0 -11
  170. data/app/views/shared/_ask_twitter_followers.html.haml +0 -13
  171. data/app/views/shared/_conditional_html_tags.html.haml +0 -8
  172. data/app/views/shared/_errors.html.haml +0 -2
  173. data/app/views/shared/_friends_recommendations.html.haml +0 -12
  174. data/app/views/shared/_import_contacts_links.html.haml +0 -10
  175. data/app/views/shared/_interview_widget.html.haml +0 -1
  176. data/app/views/shared/_login_social_buttons.html.haml +0 -19
  177. data/app/views/shared/_sign_in_modal.html.haml +0 -22
  178. data/app/views/shared/buttons/_create.html.haml +0 -3
  179. data/app/views/shared/buttons/_delete.html.haml +0 -3
  180. data/app/views/shared/buttons/_edit.html.haml +0 -3
  181. data/app/views/users/confirmations/new.html.haml +0 -11
  182. data/app/views/users/mailer/confirmation_instructions.html.haml +0 -4
  183. data/app/views/users/mailer/reset_password_instructions.html.haml +0 -6
  184. data/app/views/users/mailer/unlock_instructions.html.haml +0 -5
  185. data/app/views/users/passwords/edit.html.haml +0 -16
  186. data/app/views/users/passwords/new.html.haml +0 -9
  187. data/app/views/users/registrations/edit.html.haml +0 -27
  188. data/app/views/users/registrations/new.html.haml +0 -17
  189. data/app/views/users/sessions/new.html.haml +0 -14
  190. data/app/views/users/shared/_links.haml +0 -14
  191. data/app/views/users/unlocks/new.html.haml +0 -11
  192. data/config.ru +0 -4
  193. data/config/application.rb +0 -86
  194. data/config/boot.rb +0 -6
  195. data/config/bottom_navigation.rb +0 -13
  196. data/config/cucumber.yml +0 -8
  197. data/config/database.yml +0 -20
  198. data/config/environment.rb +0 -5
  199. data/config/environments/development.rb +0 -38
  200. data/config/environments/production.rb +0 -71
  201. data/config/environments/test.rb +0 -39
  202. data/config/exceptional.yml +0 -7
  203. data/config/initializers/active_admin.rb +0 -129
  204. data/config/initializers/backtrace_silencers.rb +0 -7
  205. data/config/initializers/contacts_monkey_patch.rb +0 -8
  206. data/config/initializers/core_extensions.rb +0 -1
  207. data/config/initializers/delayed_job_config.rb +0 -6
  208. data/config/initializers/devise.rb +0 -236
  209. data/config/initializers/formtastic.rb +0 -1
  210. data/config/initializers/generators.rb +0 -2
  211. data/config/initializers/inflections.rb +0 -15
  212. data/config/initializers/mime_types.rb +0 -5
  213. data/config/initializers/net_ssl_monkey_patch.rb +0 -22
  214. data/config/initializers/secret_token.rb +0 -7
  215. data/config/initializers/session_store.rb +0 -8
  216. data/config/initializers/settings.rb +0 -20
  217. data/config/initializers/setup_mailer.rb +0 -1
  218. data/config/initializers/wrap_parameters.rb +0 -14
  219. data/config/locales/devise.en.yml +0 -57
  220. data/config/locales/en.yml +0 -131
  221. data/config/navigation.rb +0 -25
  222. data/config/omniauth.yml +0 -54
  223. data/config/routes.rb +0 -41
  224. data/config/sendgrid.yml +0 -18
  225. data/config/sendgrid.yml.example +0 -18
  226. data/config/top_navigation.rb +0 -28
  227. data/data/.gitkeep +0 -0
  228. data/db/migrate/20120615102902_create_users.rb +0 -10
  229. data/db/migrate/20120615103611_add_devise_to_users.rb +0 -53
  230. data/db/migrate/20120615104044_add_facebook_id_to_users.rb +0 -5
  231. data/db/migrate/20120618051144_add_twitter_id_to_users.rb +0 -5
  232. data/db/migrate/20120618051522_add_google_id_to_users.rb +0 -5
  233. data/db/migrate/20120618083140_add_linkedin_id_to_users.rb +0 -5
  234. data/db/migrate/20120618094240_add_yahoo_id_to_users.rb +0 -5
  235. data/db/migrate/20120618102303_add_windowslive_id_to_users.rb +0 -5
  236. data/db/migrate/20120618121959_create_survey_templates.rb +0 -9
  237. data/db/migrate/20120618122120_create_survey_results.rb +0 -10
  238. data/db/migrate/20120618122346_create_questions.rb +0 -12
  239. data/db/migrate/20120618122442_create_answers.rb +0 -11
  240. data/db/migrate/20120618122551_create_question_results.rb +0 -10
  241. data/db/migrate/20120618123137_create_question_choices.rb +0 -10
  242. data/db/migrate/20120619142239_create_admin_notes.rb +0 -17
  243. data/db/migrate/20120619142255_move_admin_notes_to_comments.rb +0 -25
  244. data/db/migrate/20120619142315_add_fields_to_survey_template.rb +0 -6
  245. data/db/migrate/20120621124117_add_role_to_users.rb +0 -5
  246. data/db/migrate/20120625115344_rename_surveys_to_interviews.rb +0 -5
  247. data/db/migrate/20120625120613_rename_survey_relation_field.rb +0 -7
  248. data/db/migrate/20120625121230_rename_survey_results_to_interview_results.rb +0 -5
  249. data/db/migrate/20120625134119_add_type_field_to_interview_templates.rb +0 -5
  250. data/db/migrate/20120627104823_add_display_as_field_to_question.rb +0 -5
  251. data/db/migrate/20120628115724_rename_question_choices_to_answer_choices.rb +0 -5
  252. data/db/migrate/20120628124041_rename_answers_to_possible_answers.rb +0 -5
  253. data/db/migrate/20120628125515_rename_question_results_to_answers.rb +0 -5
  254. data/db/migrate/20120628125728_rename_questions_body_to_text.rb +0 -5
  255. data/db/migrate/20120628125839_rename_possible_answers_body_to_text.rb +0 -5
  256. data/db/migrate/20120628131944_fix_answer_choice_fields.rb +0 -6
  257. data/db/migrate/20120704144442_add_text_to_answer_choices.rb +0 -5
  258. data/db/migrate/20120706065743_add_body_from3rd_point_view_to_possible_answers.rb +0 -5
  259. data/db/migrate/20120706125136_change_facebook_id_and_twitter_id_type.rb +0 -11
  260. data/db/migrate/20120710070940_create_invitations.rb +0 -10
  261. data/db/migrate/20120710105054_create_delayed_jobs.rb +0 -22
  262. data/db/migrate/20120711084512_create_recommendations.rb +0 -14
  263. data/db/migrate/20120712092224_create_invitation_identifiers.rb +0 -8
  264. data/db/migrate/20120712130638_remove_user_id_from_recommendations.rb +0 -9
  265. data/db/migrate/20120712130711_remove_interview_template_id_from_recommendations.rb +0 -9
  266. data/db/migrate/20120712130744_add_invitation_id_to_recommendations.rb +0 -5
  267. data/db/migrate/20120716113646_create_contacts.rb +0 -12
  268. data/db/migrate/20120718135613_add_secret_to_interview_results.rb +0 -5
  269. data/db/migrate/20120718162312_fix_recommendation_relation.rb +0 -5
  270. data/db/migrate/20120724095308_add_state_to_interview_results.rb +0 -5
  271. data/db/migrate/20120724142439_create_carriers.rb +0 -11
  272. data/db/migrate/20120725071947_create_campaigns.rb +0 -11
  273. data/db/migrate/20120725083605_add_last_visited_path_to_users.rb +0 -5
  274. data/db/migrate/20120725085526_create_interesting_facts.rb +0 -13
  275. data/db/migrate/20120725131809_add_attachment_to_campaigns.rb +0 -5
  276. data/db/migrate/20120726115141_create_attachments.rb +0 -10
  277. data/db/migrate/20120726115644_extract_attachment_from_campaign.rb +0 -11
  278. data/db/migrate/20120726135706_create_buying_attempts.rb +0 -11
  279. data/db/migrate/20120727104402_add_campaign_id_to_interview_result.rb +0 -5
  280. data/db/migrate/20120730064404_change_interesting_facts.rb +0 -6
  281. data/db/migrate/20120730114402_add_attachment_id_to_interesting_facts.rb +0 -5
  282. data/db/migrate/20120730115758_remove_campaign_id_from_interesting_facts.rb +0 -9
  283. data/db/schema.rb +0 -201
  284. data/db/seeds.rb +0 -86
  285. data/doc/Ability.html +0 -221
  286. data/doc/Admin/InterviewHelper.html +0 -292
  287. data/doc/Answer.html +0 -241
  288. data/doc/AnswerChoice.html +0 -296
  289. data/doc/AnswersHelper.html +0 -194
  290. data/doc/ApplicationController.html +0 -318
  291. data/doc/ApplicationHelper.html +0 -119
  292. data/doc/CellPhoneInsuranceInterview.html +0 -192
  293. data/doc/Contact.html +0 -186
  294. data/doc/ContactsController.html +0 -283
  295. data/doc/CoreExtensions.html +0 -129
  296. data/doc/CoreExtensions/Object.html +0 -210
  297. data/doc/DefaultInterview.html +0 -192
  298. data/doc/DevelopmentMailInterceptor.html +0 -203
  299. data/doc/EmailValidator.html +0 -210
  300. data/doc/InterviewResult.html +0 -251
  301. data/doc/InterviewResultInvitationsController.html +0 -218
  302. data/doc/InterviewResultsController.html +0 -280
  303. data/doc/InterviewTemplate.html +0 -330
  304. data/doc/InterviewTemplatesController.html +0 -145
  305. data/doc/Invitation.html +0 -362
  306. data/doc/InvitationIdentifier.html +0 -287
  307. data/doc/InvitationMailer.html +0 -218
  308. data/doc/LayoutHelper.html +0 -188
  309. data/doc/NavLinksRenderer.html +0 -214
  310. data/doc/NumericQuestion.html +0 -196
  311. data/doc/OneCorrectQuestion.html +0 -269
  312. data/doc/PagesController.html +0 -206
  313. data/doc/PossibleAnswer.html +0 -627
  314. data/doc/Question.html +0 -620
  315. data/doc/Recommendation.html +0 -186
  316. data/doc/RecommendationHelper.html +0 -292
  317. data/doc/RecommendationsController.html +0 -230
  318. data/doc/ResourcesController.html +0 -141
  319. data/doc/ScaleQuestion.html +0 -525
  320. data/doc/SocialProvidersConfig.html +0 -240
  321. data/doc/User.html +0 -677
  322. data/doc/Users/OmniauthCallbacksController.html +0 -542
  323. data/doc/Wisemuv/Contacts.html +0 -188
  324. data/doc/Wisemuv/Contacts/Google/ControllerConcerns.html +0 -204
  325. data/doc/Wisemuv/Contacts/Google/ModelConcerns.html +0 -128
  326. data/doc/Wisemuv/Contacts/WindowsLive/ControllerConcerns.html +0 -204
  327. data/doc/Wisemuv/Contacts/WindowsLive/Grabber.html +0 -307
  328. data/doc/Wisemuv/Contacts/WindowsLive/ModelConcerns.html +0 -128
  329. data/doc/Wisemuv/Contacts/Yahoo/ControllerConcerns.html +0 -206
  330. data/doc/Wisemuv/Contacts/Yahoo/Grabber.html +0 -526
  331. data/doc/Wisemuv/Contacts/Yahoo/ModelConcerns.html +0 -128
  332. data/doc/YesNoQuestion.html +0 -209
  333. data/doc/_index.html +0 -509
  334. data/doc/carriers-campaigns-interviews-relationships.png +0 -0
  335. data/doc/class_list.html +0 -61
  336. data/doc/css/common.css +0 -1
  337. data/doc/css/cucumber.css +0 -222
  338. data/doc/css/full_list.css +0 -57
  339. data/doc/css/style.css +0 -328
  340. data/doc/feature_list.html +0 -513
  341. data/doc/file.README.html +0 -152
  342. data/doc/file_list.html +0 -63
  343. data/doc/frames.html +0 -28
  344. data/doc/index.html +0 -152
  345. data/doc/js/app.js +0 -214
  346. data/doc/js/cucumber.js +0 -305
  347. data/doc/js/full_list.js +0 -173
  348. data/doc/js/jquery.js +0 -4
  349. data/doc/method_list.html +0 -740
  350. data/doc/requirements.html +0 -196
  351. data/doc/requirements/features.html +0 -180
  352. data/doc/requirements/features/admin_manages_users.html +0 -1260
  353. data/doc/requirements/features/ask_friends_and_family.html +0 -918
  354. data/doc/requirements/features/create_interview.html +0 -1734
  355. data/doc/requirements/features/edit_interview.html +0 -832
  356. data/doc/requirements/features/pass_interview.html +0 -757
  357. data/doc/requirements/features/pulling_contacts.html +0 -718
  358. data/doc/requirements/features/questions_order_during_creating_interview.html +0 -126
  359. data/doc/requirements/features/sign_in.html +0 -1035
  360. data/doc/requirements/features/sign_up.html +0 -1948
  361. data/doc/requirements/step_transformers.html +0 -10401
  362. data/doc/requirements/tags.html +0 -670
  363. data/doc/requirements/tags/javascript.html +0 -245
  364. data/doc/requirements/tags/omniauth.html +0 -165
  365. data/doc/requirements/tags/users.html +0 -227
  366. data/doc/tag_list.html +0 -82
  367. data/doc/top-level-namespace.html +0 -128
  368. data/features/admin_manages_users.feature +0 -57
  369. data/features/ask_friends_and_family.feature +0 -39
  370. data/features/buying_tracking_code.feature +0 -11
  371. data/features/campaign_management.feature +0 -42
  372. data/features/create_interview.feature +0 -74
  373. data/features/edit_interview.feature +0 -40
  374. data/features/interesting_facts_parser.feature +0 -11
  375. data/features/interview_completion.feature +0 -6
  376. data/features/pass_interview.feature +0 -31
  377. data/features/pulling_contacts.feature +0 -21
  378. data/features/questions_order_during_creating_interview.feature +0 -2
  379. data/features/redirecting_after_signing_in.feature +0 -19
  380. data/features/sign_in.feature +0 -51
  381. data/features/sign_up.feature +0 -43
  382. data/features/step_definitions/admin_manages_users_steps.rb +0 -91
  383. data/features/step_definitions/ask_friends_and_family_steps.rb +0 -41
  384. data/features/step_definitions/buying_tracking_code_steps.rb +0 -15
  385. data/features/step_definitions/campaign_management_steps.rb +0 -50
  386. data/features/step_definitions/create_interview_steps.rb +0 -130
  387. data/features/step_definitions/edit_interview_steps.rb +0 -35
  388. data/features/step_definitions/interesting_facts_parser_steps.rb +0 -34
  389. data/features/step_definitions/interview_completion_steps.rb +0 -8
  390. data/features/step_definitions/interview_results_steps.rb +0 -7
  391. data/features/step_definitions/interview_steps.rb +0 -11
  392. data/features/step_definitions/pass_interview_steps.rb +0 -52
  393. data/features/step_definitions/pulling_contacts_steps.rb +0 -24
  394. data/features/step_definitions/redirecting_after_sign_in_steps.rb +0 -19
  395. data/features/step_definitions/sign_in_steps.rb +0 -110
  396. data/features/step_definitions/sign_up_steps.rb +0 -56
  397. data/features/support/env.rb +0 -23
  398. data/features/support/omniauth.rb +0 -69
  399. data/features/support/pickle.rb +0 -26
  400. data/features/support/uploading.rb +0 -6
  401. data/features/support/users.rb +0 -18
  402. data/features/upload-files/Life Insurance Facts-Final.xls +0 -0
  403. data/lib/assets/.gitkeep +0 -0
  404. data/lib/core_extensions/object.rb +0 -9
  405. data/lib/interceptors/development_mail_interceptor.rb +0 -5
  406. data/lib/social_providers_config.rb +0 -10
  407. data/lib/tasks/auto_annotate_models.rake +0 -22
  408. data/lib/tasks/cucumber.rake +0 -65
  409. data/lib/tasks/db/reseed.rake +0 -12
  410. data/lib/tasks/db/seed/interviews.rake +0 -14
  411. data/lib/tasks/db/truncate.rake +0 -19
  412. data/lib/tasks/yardoc.rake +0 -19
  413. data/lib/validators/email_validator.rb +0 -7
  414. data/lib/wisemuv/contacts.rb +0 -5
  415. data/lib/wisemuv/contacts/google/controller_concerns.rb +0 -19
  416. data/lib/wisemuv/contacts/google/model_concerns.rb +0 -17
  417. data/lib/wisemuv/contacts/windows_live/controller_concerns.rb +0 -23
  418. data/lib/wisemuv/contacts/windows_live/grabber.rb +0 -22
  419. data/lib/wisemuv/contacts/windows_live/model_concerns.rb +0 -17
  420. data/lib/wisemuv/contacts/yahoo/controller_concerns.rb +0 -29
  421. data/lib/wisemuv/contacts/yahoo/grabber.rb +0 -55
  422. data/lib/wisemuv/contacts/yahoo/model_concerns.rb +0 -17
  423. data/lib/wisemuv/interesting_facts_parser.rb +0 -65
  424. data/log/.gitkeep +0 -0
  425. data/public/403.html +0 -26
  426. data/public/404.html +0 -26
  427. data/public/422.html +0 -26
  428. data/public/500.html +0 -25
  429. data/public/ZeroClipboard10.swf +0 -0
  430. data/public/favicon.ico +0 -0
  431. data/public/robots.txt +0 -5
  432. data/script/cucumber +0 -10
  433. data/script/delayed_job +0 -5
  434. data/script/rails +0 -6
  435. data/spec/factories/answer.rb +0 -6
  436. data/spec/factories/answer_choice.rb +0 -6
  437. data/spec/factories/attachment.rb +0 -11
  438. data/spec/factories/buying_attempts.rb +0 -8
  439. data/spec/factories/campaign.rb +0 -8
  440. data/spec/factories/carrier.rb +0 -6
  441. data/spec/factories/contact.rb +0 -8
  442. data/spec/factories/interesting_facts.rb +0 -10
  443. data/spec/factories/interview_result.rb +0 -27
  444. data/spec/factories/interview_template.rb +0 -46
  445. data/spec/factories/invitation_identifier.rb +0 -8
  446. data/spec/factories/possible_answer.rb +0 -23
  447. data/spec/factories/question.rb +0 -55
  448. data/spec/factories/recommendation.rb +0 -10
  449. data/spec/factories/user.rb +0 -21
  450. data/spec/mailers/invitation_mailer_spec.rb +0 -5
  451. data/spec/models/answer_spec.rb +0 -5
  452. data/spec/models/attachment_spec.rb +0 -5
  453. data/spec/models/buying_attempt_spec.rb +0 -5
  454. data/spec/models/campaign_spec.rb +0 -5
  455. data/spec/models/carrier_spec.rb +0 -5
  456. data/spec/models/contact_spec.rb +0 -5
  457. data/spec/models/interesting_fact_spec.rb +0 -5
  458. data/spec/models/invitation_identifier_spec.rb +0 -5
  459. data/spec/models/question_choice_spec.rb +0 -5
  460. data/spec/models/question_result_spec.rb +0 -5
  461. data/spec/models/question_spec.rb +0 -5
  462. data/spec/models/recommendation_spec.rb +0 -5
  463. data/spec/models/survey_result_spec.rb +0 -5
  464. data/spec/models/survey_template_spec.rb +0 -5
  465. data/spec/spec_helper.rb +0 -32
  466. data/vendor/.rvmrc +0 -53
  467. data/vendor/Gemfile +0 -60
  468. data/vendor/Gemfile.lock +0 -166
  469. data/vendor/README.rdoc +0 -261
  470. data/vendor/Rakefile +0 -7
  471. data/vendor/assets/javascripts/ZeroClipboard.js +0 -316
  472. data/vendor/assets/javascripts/selectToUISlider.js +0 -240
  473. data/vendor/assets/javascripts/underscore.string.js +0 -566
  474. data/vendor/assets/stylesheets/.gitkeep +0 -0
  475. data/vendor/config.ru +0 -4
  476. data/vendor/plugins/.gitkeep +0 -0
@@ -1,240 +0,0 @@
1
- /*
2
- * --------------------------------------------------------------------
3
- * jQuery-Plugin - selectToUISlider - creates a UI slider component from a select element(s)
4
- * by Scott Jehl, scott@filamentgroup.com
5
- * http://www.filamentgroup.com
6
- * reference article: http://www.filamentgroup.com/lab/update_jquery_ui_16_slider_from_a_select_element/
7
- * demo page: http://www.filamentgroup.com/examples/slider_v2/index.html
8
- *
9
- * Copyright (c) 2008 Filament Group, Inc
10
- * Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
11
- *
12
- * Usage Notes: please refer to our article above for documentation
13
- *
14
- * --------------------------------------------------------------------
15
- */
16
-
17
-
18
- jQuery.fn.selectToUISlider = function(settings){
19
- var selects = jQuery(this);
20
-
21
- //accessible slider options
22
- var options = jQuery.extend({
23
- labels: 3, //number of visible labels
24
- tooltip: true, //show tooltips, boolean
25
- tooltipSrc: 'text',//accepts 'value' as well
26
- labelSrc: 'value',//accepts 'value' as well ,
27
- sliderOptions: null
28
- }, settings);
29
-
30
-
31
- //handle ID attrs - selects each need IDs for handles to find them
32
- var handleIds = (function(){
33
- var tempArr = [];
34
- selects.each(function(){
35
- tempArr.push('handle_'+jQuery(this).attr('id'));
36
- });
37
- return tempArr;
38
- })();
39
-
40
- //array of all option elements in select element (ignores optgroups)
41
- var selectOptions = (function(){
42
- var opts = [];
43
- selects.eq(0).find('option').each(function(){
44
- opts.push({
45
- value: jQuery(this).attr('value'),
46
- text: jQuery(this).text()
47
- });
48
- });
49
- return opts;
50
- })();
51
-
52
- //array of opt groups if present
53
- var groups = (function(){
54
- if(selects.eq(0).find('optgroup').size()>0){
55
- var groupedData = [];
56
- selects.eq(0).find('optgroup').each(function(i){
57
- groupedData[i] = {};
58
- groupedData[i].label = jQuery(this).attr('label');
59
- groupedData[i].options = [];
60
- jQuery(this).find('option').each(function(){
61
- groupedData[i].options.push({text: jQuery(this).text(), value: jQuery(this).attr('value')});
62
- });
63
- });
64
- return groupedData;
65
- }
66
- else return null;
67
- })();
68
-
69
- //check if obj is array
70
- function isArray(obj) {
71
- return obj.constructor == Array;
72
- }
73
- //return tooltip text from option index
74
- function ttText(optIndex){
75
- return (options.tooltipSrc == 'text') ? selectOptions[optIndex].text : selectOptions[optIndex].value;
76
- }
77
-
78
- //plugin-generated slider options (can be overridden)
79
- var sliderOptions = {
80
- step: 1,
81
- min: 0,
82
- orientation: 'horizontal',
83
- max: selectOptions.length-1,
84
- range: selects.length > 1,//multiple select elements = true
85
- slide: function(e, ui) {//slide function
86
- var thisHandle = jQuery(ui.handle);
87
- //handle feedback
88
- var textval = ttText(ui.value);
89
- thisHandle
90
- .attr('aria-valuetext', textval)
91
- .attr('aria-valuenow', ui.value)
92
- .find('.ui-slider-tooltip .ttContent')
93
- .text( textval );
94
-
95
- //control original select menu
96
- var currSelect = jQuery('#' + thisHandle.attr('id').split('handle_')[1]);
97
- currSelect.find('option').eq(ui.value).attr('selected', 'selected');
98
- },
99
- values: (function(){
100
- var values = [];
101
- selects.each(function(){
102
- values.push( jQuery(this).get(0).selectedIndex );
103
- });
104
- return values;
105
- })()
106
- };
107
-
108
- //slider options from settings
109
- options.sliderOptions = (settings) ? jQuery.extend(sliderOptions, settings.sliderOptions) : sliderOptions;
110
-
111
- //select element change event
112
- selects.bind('change keyup click', function(){
113
- var thisIndex = jQuery(this).get(0).selectedIndex;
114
- var thisHandle = jQuery('#handle_'+ jQuery(this).attr('id'));
115
- var handleIndex = thisHandle.data('handleNum');
116
- thisHandle.parents('.ui-slider:eq(0)').slider("values", handleIndex, thisIndex);
117
- });
118
-
119
-
120
- //create slider component div
121
- var sliderComponent = jQuery('<div></div>');
122
-
123
- //CREATE HANDLES
124
- selects.each(function(i){
125
- var hidett = '';
126
-
127
- //associate label for ARIA
128
- var thisLabel = jQuery('label[for=' + jQuery(this).attr('id') +']');
129
- //labelled by aria doesn't seem to work on slider handle. Using title attr as backup
130
- var labelText = (thisLabel.size()>0) ? 'Slider control for '+ thisLabel.text()+'' : '';
131
- var thisLabelId = thisLabel.attr('id') || thisLabel.attr('id', 'label_'+handleIds[i]).attr('id');
132
-
133
-
134
- if( options.tooltip == false ){hidett = ' style="display: none;"';}
135
- jQuery('<a '+
136
- 'href="#" tabindex="0" '+
137
- 'id="'+handleIds[i]+'" '+
138
- 'class="ui-slider-handle" '+
139
- 'role="slider" '+
140
- 'aria-labelledby="'+thisLabelId+'" '+
141
- 'aria-valuemin="'+options.sliderOptions.min+'" '+
142
- 'aria-valuemax="'+options.sliderOptions.max+'" '+
143
- 'aria-valuenow="'+options.sliderOptions.values[i]+'" '+
144
- 'aria-valuetext="'+ttText(options.sliderOptions.values[i])+'" '+
145
- '><span class="screenReaderContext">'+labelText+'</span>'+
146
- '<span class="ui-slider-tooltip ui-widget-content ui-corner-all"'+ hidett +'><span class="ttContent"></span>'+
147
- '<span class="ui-tooltip-pointer-down ui-widget-content"><span class="ui-tooltip-pointer-down-inner"></span></span>'+
148
- '</span></a>')
149
- .data('handleNum',i)
150
- .appendTo(sliderComponent);
151
- });
152
-
153
- //CREATE SCALE AND TICS
154
-
155
- //write dl if there are optgroups
156
- if(groups) {
157
- var inc = 0;
158
- var scale = sliderComponent.append('<dl class="ui-slider-scale ui-helper-reset" role="presentation"></dl>').find('.ui-slider-scale:eq(0)');
159
- jQuery(groups).each(function(h){
160
- scale.append('<dt style="width: '+ (100/groups.length).toFixed(2) +'%' +'; left:'+ (h/(groups.length-1) * 100).toFixed(2) +'%' +'"><span>'+this.label+'</span></dt>');//class name becomes camelCased label
161
- var groupOpts = this.options;
162
- jQuery(this.options).each(function(i){
163
- var style = (inc == selectOptions.length-1 || inc == 0) ? 'style="display: none;"' : '' ;
164
- var labelText = (options.labelSrc == 'text') ? groupOpts[i].text : groupOpts[i].value;
165
- scale.append('<dd style="left:'+ leftVal(inc) +'"><span class="ui-slider-label">'+ labelText +'</span><span class="ui-slider-tic ui-widget-content"'+ style +'></span></dd>');
166
- inc++;
167
- });
168
- });
169
- }
170
- //write ol
171
- else {
172
- var scale = sliderComponent.append('<ol class="ui-slider-scale ui-helper-reset" role="presentation"></ol>').find('.ui-slider-scale:eq(0)');
173
- jQuery(selectOptions).each(function(i){
174
- var style = (i == selectOptions.length-1 || i == 0) ? 'style="display: none;"' : '' ;
175
- var labelText = (options.labelSrc == 'text') ? this.text : this.value;
176
- scale.append('<li style="left:'+ leftVal(i) +'"><span class="ui-slider-label">'+ labelText +'</span><span class="ui-slider-tic ui-widget-content"'+ style +'></span></li>');
177
- });
178
- }
179
-
180
- function leftVal(i){
181
- return (i/(selectOptions.length-1) * 100).toFixed(2) +'%';
182
-
183
- }
184
-
185
-
186
-
187
-
188
- //show and hide labels depending on labels pref
189
- //show the last one if there are more than 1 specified
190
- if(options.labels > 1) sliderComponent.find('.ui-slider-scale li:last span.ui-slider-label, .ui-slider-scale dd:last span.ui-slider-label').addClass('ui-slider-label-show');
191
-
192
- //set increment
193
- var increm = Math.max(1, Math.round(selectOptions.length / options.labels));
194
- //show em based on inc
195
- for(var j=0; j<selectOptions.length; j+=increm){
196
- if((selectOptions.length - j) > increm){//don't show if it's too close to the end label
197
- sliderComponent.find('.ui-slider-scale li:eq('+ j +') span.ui-slider-label, .ui-slider-scale dd:eq('+ j +') span.ui-slider-label').addClass('ui-slider-label-show');
198
- }
199
- }
200
-
201
- //style the dt's
202
- sliderComponent.find('.ui-slider-scale dt').each(function(i){
203
- jQuery(this).css({
204
- 'left': ((100 /( groups.length))*i).toFixed(2) + '%'
205
- });
206
- });
207
-
208
-
209
- //inject and return
210
- sliderComponent
211
- .insertAfter(jQuery(this).eq(this.length-1))
212
- .slider(options.sliderOptions)
213
- .attr('role','application')
214
- .find('.ui-slider-label')
215
- .each(function(){
216
- jQuery(this).css('marginLeft', -jQuery(this).width()/2);
217
- });
218
-
219
- //update tooltip arrow inner color
220
- sliderComponent.find('.ui-tooltip-pointer-down-inner').each(function(){
221
- var bWidth = jQuery('.ui-tooltip-pointer-down-inner').css('borderTopWidth');
222
- var bColor = jQuery(this).parents('.ui-slider-tooltip').css('backgroundColor')
223
- jQuery(this).css('border-top', bWidth+' solid '+bColor);
224
- });
225
-
226
- var values = sliderComponent.slider('values');
227
-
228
- if(isArray(values)){
229
- jQuery(values).each(function(i){
230
- sliderComponent.find('.ui-slider-tooltip .ttContent').eq(i).text( ttText(this) );
231
- });
232
- }
233
- else {
234
- sliderComponent.find('.ui-slider-tooltip .ttContent').eq(0).text( ttText(values) );
235
- }
236
-
237
- return this;
238
- }
239
-
240
-
@@ -1,566 +0,0 @@
1
- // Underscore.string
2
- // (c) 2010 Esa-Matti Suuronen <esa-matti aet suuronen dot org>
3
- // Underscore.strings is freely distributable under the terms of the MIT license.
4
- // Documentation: https://github.com/epeli/underscore.string
5
- // Some code is borrowed from MooTools and Alexandru Marasteanu.
6
-
7
- // Version 2.2.0rc
8
-
9
- !function(root){
10
- 'use strict';
11
-
12
- // Defining helper functions.
13
-
14
- var nativeTrim = String.prototype.trim;
15
- var nativeTrimRight = String.prototype.trimRight;
16
- var nativeTrimLeft = String.prototype.trimLeft;
17
-
18
- var parseNumber = function(source) { return source * 1 || 0; };
19
-
20
- var strRepeat = function(str, qty){
21
- if (qty < 1) return '';
22
- var result = '';
23
- while (qty > 0) {
24
- if (qty & 1) result += str;
25
- qty >>= 1, str += str;
26
- }
27
- return result;
28
- };
29
-
30
- var slice = [].slice;
31
-
32
- var replace = function(str, pattern, something){
33
- return (''+str).replace(pattern, something);
34
- }
35
-
36
- var defaultToWhiteSpace = function(characters){
37
- if (characters != null) {
38
- return '[' + _s.escapeRegExp(characters) + ']';
39
- }
40
- return '\\s';
41
- };
42
-
43
- var levenshtein = function(str1, str2) {
44
- str1 += ''; str2 += '';
45
-
46
- var current = [], prev, value;
47
-
48
- for (var i = 0; i <= str2.length; i++)
49
- for (var j = 0; j <= str1.length; j++) {
50
- if (i && j)
51
- if (str1.charAt(j - 1) === str2.charAt(i - 1))
52
- value = prev;
53
- else
54
- value = Math.min(current[j], current[j - 1], prev) + 1;
55
- else
56
- value = i + j;
57
-
58
- prev = current[j];
59
- current[j] = value;
60
- }
61
-
62
- return current.pop();
63
- };
64
-
65
- var escapeChars = {
66
- lt: '<',
67
- gt: '>',
68
- quot: '"',
69
- apos: "'",
70
- amp: '&'
71
- };
72
-
73
- var reversedEscapeChars = {};
74
- for(var key in escapeChars){ reversedEscapeChars[escapeChars[key]] = key; }
75
-
76
- // sprintf() for JavaScript 0.7-beta1
77
- // http://www.diveintojavascript.com/projects/javascript-sprintf
78
- //
79
- // Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>
80
- // All rights reserved.
81
-
82
- var sprintf = (function() {
83
- function get_type(variable) {
84
- return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
85
- }
86
-
87
- var str_repeat = strRepeat;
88
-
89
- var str_format = function() {
90
- if (!str_format.cache.hasOwnProperty(arguments[0])) {
91
- str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
92
- }
93
- return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
94
- };
95
-
96
- str_format.format = function(parse_tree, argv) {
97
- var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
98
- for (i = 0; i < tree_length; i++) {
99
- node_type = get_type(parse_tree[i]);
100
- if (node_type === 'string') {
101
- output.push(parse_tree[i]);
102
- }
103
- else if (node_type === 'array') {
104
- match = parse_tree[i]; // convenience purposes only
105
- if (match[2]) { // keyword argument
106
- arg = argv[cursor];
107
- for (k = 0; k < match[2].length; k++) {
108
- if (!arg.hasOwnProperty(match[2][k])) {
109
- throw new Error(sprintf('[_.sprintf] property "%s" does not exist', match[2][k]));
110
- }
111
- arg = arg[match[2][k]];
112
- }
113
- } else if (match[1]) { // positional argument (explicit)
114
- arg = argv[match[1]];
115
- }
116
- else { // positional argument (implicit)
117
- arg = argv[cursor++];
118
- }
119
-
120
- if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
121
- throw new Error(sprintf('[_.sprintf] expecting number but found %s', get_type(arg)));
122
- }
123
- switch (match[8]) {
124
- case 'b': arg = arg.toString(2); break;
125
- case 'c': arg = String.fromCharCode(arg); break;
126
- case 'd': arg = parseInt(arg, 10); break;
127
- case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
128
- case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
129
- case 'o': arg = arg.toString(8); break;
130
- case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
131
- case 'u': arg = Math.abs(arg); break;
132
- case 'x': arg = arg.toString(16); break;
133
- case 'X': arg = arg.toString(16).toUpperCase(); break;
134
- }
135
- arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
136
- pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
137
- pad_length = match[6] - String(arg).length;
138
- pad = match[6] ? str_repeat(pad_character, pad_length) : '';
139
- output.push(match[5] ? arg + pad : pad + arg);
140
- }
141
- }
142
- return output.join('');
143
- };
144
-
145
- str_format.cache = {};
146
-
147
- str_format.parse = function(fmt) {
148
- var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
149
- while (_fmt) {
150
- if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
151
- parse_tree.push(match[0]);
152
- }
153
- else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
154
- parse_tree.push('%');
155
- }
156
- else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
157
- if (match[2]) {
158
- arg_names |= 1;
159
- var field_list = [], replacement_field = match[2], field_match = [];
160
- if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
161
- field_list.push(field_match[1]);
162
- while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
163
- if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
164
- field_list.push(field_match[1]);
165
- }
166
- else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
167
- field_list.push(field_match[1]);
168
- }
169
- else {
170
- throw new Error('[_.sprintf] huh?');
171
- }
172
- }
173
- }
174
- else {
175
- throw new Error('[_.sprintf] huh?');
176
- }
177
- match[2] = field_list;
178
- }
179
- else {
180
- arg_names |= 2;
181
- }
182
- if (arg_names === 3) {
183
- throw new Error('[_.sprintf] mixing positional and named placeholders is not (yet) supported');
184
- }
185
- parse_tree.push(match);
186
- }
187
- else {
188
- throw new Error('[_.sprintf] huh?');
189
- }
190
- _fmt = _fmt.substring(match[0].length);
191
- }
192
- return parse_tree;
193
- };
194
-
195
- return str_format;
196
- })();
197
-
198
-
199
-
200
- // Defining underscore.string
201
-
202
- var _s = {
203
-
204
- VERSION: '2.2.0rc',
205
-
206
- isBlank: function(str){
207
- return (/^\s*$/).test(str);
208
- },
209
-
210
- stripTags: function(str){
211
- return replace(str, /<\/?[^>]+>/g, '');
212
- },
213
-
214
- capitalize : function(str) {
215
- str += '';
216
- return str.charAt(0).toUpperCase() + str.slice(1);
217
- },
218
-
219
- chop: function(str, step){
220
- str += ''; step = ~~step;
221
- return step > 0 ? str.match(new RegExp('.{1,' + step + '}', 'g')) : [str];
222
- },
223
-
224
- clean: function(str){
225
- return _s.strip(str).replace(/\s+/g, ' ');
226
- },
227
-
228
- count: function(str, substr){
229
- str += ''; substr += '';
230
- return str.split(substr).length - 1;
231
- },
232
-
233
- chars: function(str) {
234
- return (''+str).split('');
235
- },
236
-
237
- swapCase: function(str) {
238
- return replace(str, /\S/g, function(ch){
239
- return ch === ch.toUpperCase() ? ch.toLowerCase() : ch.toUpperCase();
240
- });
241
- },
242
-
243
- escapeHTML: function(str) {
244
- return replace(str, /[&<>"']/g, function(match){ return '&' + reversedEscapeChars[match] + ';'; });
245
- },
246
-
247
- unescapeHTML: function(str) {
248
- return replace(str, /\&([^;]+);/g, function(entity, entityCode){
249
- var match;
250
-
251
- if (entityCode in escapeChars) {
252
- return escapeChars[entityCode];
253
- } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
254
- return String.fromCharCode(parseInt(match[1], 16));
255
- } else if (match = entityCode.match(/^#(\d+)$/)) {
256
- return String.fromCharCode(~~match[1]);
257
- } else {
258
- return entity;
259
- }
260
- });
261
- },
262
-
263
- escapeRegExp: function(str){
264
- // From MooTools core 1.2.4
265
- return replace(str, /([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
266
- },
267
-
268
- insert: function(str, i, substr){
269
- var arr = _s.chars(str);
270
- arr.splice(~~i, 0, ''+substr);
271
- return arr.join('');
272
- },
273
-
274
- include: function(str, needle){
275
- return !!~(''+str).indexOf(needle);
276
- },
277
-
278
- join: function() {
279
- var args = slice.call(arguments);
280
- return args.join(args.shift());
281
- },
282
-
283
- lines: function(str) {
284
- return (''+str).split("\n");
285
- },
286
-
287
- reverse: function(str){
288
- return _s.chars(str).reverse().join('');
289
- },
290
-
291
- splice: function(str, i, howmany, substr){
292
- var arr = _s.chars(str);
293
- arr.splice(~~i, ~~howmany, substr);
294
- return arr.join('');
295
- },
296
-
297
- startsWith: function(str, starts){
298
- str += ''; starts += '';
299
- return str.length >= starts.length && str.slice(0, starts.length) === starts;
300
- },
301
-
302
- endsWith: function(str, ends){
303
- str += ''; ends += '';
304
- return str.length >= ends.length && str.slice(str.length - ends.length) === ends;
305
- },
306
-
307
- succ: function(str){
308
- str += '';
309
- var arr = _s.chars(str);
310
- arr.splice(str.length-1, 1, String.fromCharCode(str.charCodeAt(str.length-1) + 1));
311
- return arr.join('');
312
- },
313
-
314
- titleize: function(str){
315
- return replace(str, /(?:^|\s)\S/g, function(ch){ return ch.toUpperCase(); });
316
- },
317
-
318
- camelize: function(str){
319
- return _s.trim(str).replace(/[-_\s]+(.)?/g, function(match, ch){ return ch.toUpperCase(); });
320
- },
321
-
322
- underscored: function(str){
323
- return _s.trim(str).replace(/([a-z\d])([A-Z]+)/g, '$1_$2').replace(/[-\s]+/g, '_').toLowerCase();
324
- },
325
-
326
- dasherize: function(str){
327
- return _s.trim(str).replace(/([A-Z])/g, '-$1').replace(/[-_\s]+/g, '-').toLowerCase();
328
- },
329
-
330
- classify: function(str){
331
- return _s.titleize(replace(str, /_/g, ' ')).replace(/\s/g, '');
332
- },
333
-
334
- humanize: function(str){
335
- return _s.capitalize(_s.underscored(str).replace(/_id$/,'').replace(/_/g, ' '));
336
- },
337
-
338
- trim: function(str, characters){
339
- str += '';
340
- if (!characters && nativeTrim) return nativeTrim.call(str);
341
- characters = defaultToWhiteSpace(characters);
342
- return str.replace(new RegExp('\^' + characters + '+|' + characters + '+$', 'g'), '');
343
- },
344
-
345
- ltrim: function(str, characters){
346
- str += '';
347
- if (!characters && nativeTrimLeft) {
348
- return nativeTrimLeft.call(str);
349
- }
350
- characters = defaultToWhiteSpace(characters);
351
- return str.replace(new RegExp('^' + characters + '+'), '');
352
- },
353
-
354
- rtrim: function(str, characters){
355
- str += '';
356
- if (!characters && nativeTrimRight) {
357
- return nativeTrimRight.call(str);
358
- }
359
- characters = defaultToWhiteSpace(characters);
360
- return str.replace(new RegExp(characters + '+$'), '');
361
- },
362
-
363
- truncate: function(str, length, truncateStr){
364
- str += ''; truncateStr = truncateStr || '...';
365
- length = ~~length;
366
- return str.length > length ? str.slice(0, length) + truncateStr : str;
367
- },
368
-
369
- /**
370
- * _s.prune: a more elegant version of truncate
371
- * prune extra chars, never leaving a half-chopped word.
372
- * @author github.com/rwz
373
- */
374
- prune: function(str, length, pruneStr){
375
- str += ''; length = ~~length;
376
- pruneStr = pruneStr != null ? ''+pruneStr : '...';
377
-
378
- if (str.length <= length) return str;
379
-
380
- var tmpl = function(c){ return c.toUpperCase() !== c.toLowerCase() ? 'A' : ' '; },
381
- template = str.slice(0, length+1).replace(/.(?=\W*\w*$)/g, tmpl); // 'Hello, world' -> 'HellAA AAAAA'
382
-
383
- if (template.slice(template.length-2).match(/\w\w/))
384
- template = template.replace(/\s*\S+$/, '');
385
- else
386
- template = _s.rtrim(template.slice(0, template.length-1));
387
-
388
- return (template+pruneStr).length > str.length ? str : str.slice(0, template.length)+pruneStr;
389
- },
390
-
391
- words: function(str, delimiter) {
392
- return _s.trim(str, delimiter).split(delimiter || /\s+/);
393
- },
394
-
395
- pad: function(str, length, padStr, type) {
396
- str += '';
397
-
398
- var padlen = 0;
399
-
400
- length = ~~length;
401
-
402
- if (!padStr) {
403
- padStr = ' ';
404
- } else if (padStr.length > 1) {
405
- padStr = padStr.charAt(0);
406
- }
407
-
408
- switch(type) {
409
- case 'right':
410
- padlen = (length - str.length);
411
- return str + strRepeat(padStr, padlen);
412
- case 'both':
413
- padlen = (length - str.length);
414
- return strRepeat(padStr, Math.ceil(padlen/2)) +
415
- str +
416
- strRepeat(padStr, Math.floor(padlen/2));
417
- default: // 'left'
418
- padlen = (length - str.length);
419
- return strRepeat(padStr, padlen) + str;
420
- }
421
- },
422
-
423
- lpad: function(str, length, padStr) {
424
- return _s.pad(str, length, padStr);
425
- },
426
-
427
- rpad: function(str, length, padStr) {
428
- return _s.pad(str, length, padStr, 'right');
429
- },
430
-
431
- lrpad: function(str, length, padStr) {
432
- return _s.pad(str, length, padStr, 'both');
433
- },
434
-
435
- sprintf: sprintf,
436
-
437
- vsprintf: function(fmt, argv){
438
- argv.unshift(fmt);
439
- return sprintf.apply(null, argv);
440
- },
441
-
442
- toNumber: function(str, decimals) {
443
- str += '';
444
- var num = parseNumber(parseNumber(str).toFixed(~~decimals));
445
- return num === 0 && !str.match(/^0+$/) ? Number.NaN : num;
446
- },
447
-
448
- strRight: function(str, sep){
449
- str += ''; sep = sep != null ? ''+sep : sep;
450
- var pos = !sep ? -1 : str.indexOf(sep);
451
- return ~pos ? str.slice(pos+sep.length, str.length) : str;
452
- },
453
-
454
- strRightBack: function(str, sep){
455
- str += ''; sep = sep != null ? ''+sep : sep;
456
- var pos = !sep ? -1 : str.lastIndexOf(sep);
457
- return ~pos ? str.slice(pos+sep.length, str.length) : str;
458
- },
459
-
460
- strLeft: function(str, sep){
461
- str += ''; sep = sep != null ? ''+sep : sep;
462
- var pos = !sep ? -1 : str.indexOf(sep);
463
- return ~pos ? str.slice(0, pos) : str;
464
- },
465
-
466
- strLeftBack: function(str, sep){
467
- str += ''; sep = sep != null ? ''+sep : sep;
468
- var pos = str.lastIndexOf(sep);
469
- return ~pos ? str.slice(0, pos) : str;
470
- },
471
-
472
- toSentence: function(array, separator, lastSeparator) {
473
- separator || (separator = ', ');
474
- lastSeparator || (lastSeparator = ' and ');
475
- var length = array.length, str = '';
476
-
477
- for (var i = 0; i < length; i++) {
478
- str += array[i];
479
- if (i === (length - 2)) { str += lastSeparator; }
480
- else if (i < (length - 1)) { str += separator; }
481
- }
482
-
483
- return str;
484
- },
485
-
486
- slugify: function(str) {
487
- var from = "ąàáäâãćęèéëêìíïîłńòóöôõùúüûñçżź",
488
- to = "aaaaaaceeeeeiiiilnooooouuuunczz",
489
- regex = new RegExp(defaultToWhiteSpace(from), 'g');
490
-
491
- str = (''+str).toLowerCase();
492
-
493
- str = str.replace(regex, function(ch){
494
- var index = from.indexOf(ch);
495
- return to.charAt(index) || '-';
496
- });
497
-
498
- return _s.dasherize(str.replace(/[^\w\s-]/g, ''));
499
- },
500
-
501
- surround: function(str, wrapper) {
502
- return [wrapper, str, wrapper].join('');
503
- },
504
-
505
- quote: function(str) {
506
- return _s.surround(str, '"');
507
- },
508
-
509
- exports: function() {
510
- var result = {};
511
-
512
- for (var prop in this) {
513
- if (!this.hasOwnProperty(prop) || prop.match(/^(?:include|contains|reverse)$/)) continue;
514
- result[prop] = this[prop];
515
- }
516
-
517
- return result;
518
- },
519
-
520
- repeat: function(str, qty, separator){
521
- qty = ~~qty;
522
-
523
- // using faster implementation if separator is not needed;
524
- if (separator == null) return strRepeat(str+'', qty);
525
-
526
- // this one is about 300x slower in Google Chrome
527
- for (var repeat = []; qty > 0; repeat[--qty] = str) {}
528
- return repeat.join(separator);
529
- },
530
-
531
- levenshtein: levenshtein
532
- };
533
-
534
- // Aliases
535
-
536
- _s.strip = _s.trim;
537
- _s.lstrip = _s.ltrim;
538
- _s.rstrip = _s.rtrim;
539
- _s.center = _s.lrpad;
540
- _s.rjust = _s.lpad;
541
- _s.ljust = _s.rpad;
542
- _s.contains = _s.include;
543
- _s.q = _s.quote;
544
-
545
- // CommonJS module is defined
546
- if (typeof exports !== 'undefined') {
547
- if (typeof module !== 'undefined' && module.exports) {
548
- // Export module
549
- module.exports = _s;
550
- }
551
- exports._s = _s;
552
-
553
- } else if (typeof define === 'function' && define.amd) {
554
- // Register as a named module with AMD.
555
- define('underscore.string', [], function() {
556
- return _s;
557
- });
558
-
559
- } else {
560
- // Integrate with Underscore.js if defined
561
- // or create our own underscore object.
562
- root._ = root._ || {};
563
- root._.string = root._.str = _s;
564
- }
565
-
566
- }(this);