calagator 0.0.1.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (384) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +23 -0
  3. data/README.md +75 -0
  4. data/Rakefile +12 -0
  5. data/app/assets/images/confused-alligator-sm.png +0 -0
  6. data/app/assets/images/disk.png +0 -0
  7. data/app/assets/images/edit.png +0 -0
  8. data/app/assets/images/external_sites/epdx.png +0 -0
  9. data/app/assets/images/external_sites/external.gif +0 -0
  10. data/app/assets/images/external_sites/facebook.png +0 -0
  11. data/app/assets/images/external_sites/foursquare.png +0 -0
  12. data/app/assets/images/external_sites/gowalla.png +0 -0
  13. data/app/assets/images/external_sites/lanyrd.png +0 -0
  14. data/app/assets/images/external_sites/meetup.png +0 -0
  15. data/app/assets/images/external_sites/plancast.png +0 -0
  16. data/app/assets/images/external_sites/shizzow.png +0 -0
  17. data/app/assets/images/external_sites/upcoming.png +0 -0
  18. data/app/assets/images/external_sites/yelp.png +0 -0
  19. data/app/assets/images/feed.png +0 -0
  20. data/app/assets/images/heart.png +0 -0
  21. data/app/assets/images/icon_ical.gif +0 -0
  22. data/app/assets/images/information.png +0 -0
  23. data/app/assets/images/nav_marker.gif +0 -0
  24. data/app/assets/images/nav_marker.png +0 -0
  25. data/app/assets/images/plus.png +0 -0
  26. data/app/assets/images/redx.png +0 -0
  27. data/app/assets/images/site-icon.png +0 -0
  28. data/app/assets/images/spinner.gif +0 -0
  29. data/app/assets/images/star.png +0 -0
  30. data/app/assets/images/subnav_marker.gif +0 -0
  31. data/app/assets/images/subnav_marker.png +0 -0
  32. data/app/assets/images/tag_blue.png +0 -0
  33. data/app/assets/images/tag_icons/angular.png +0 -0
  34. data/app/assets/images/tag_icons/beer.png +0 -0
  35. data/app/assets/images/tag_icons/bitcoin.png +0 -0
  36. data/app/assets/images/tag_icons/free.png +0 -0
  37. data/app/assets/images/tag_icons/golang.png +0 -0
  38. data/app/assets/images/tag_icons/html.png +0 -0
  39. data/app/assets/images/tag_icons/javascript.png +0 -0
  40. data/app/assets/images/tag_icons/linux.png +0 -0
  41. data/app/assets/images/tag_icons/php.png +0 -0
  42. data/app/assets/images/tag_icons/pizza.png +0 -0
  43. data/app/assets/images/tag_icons/python.png +0 -0
  44. data/app/assets/images/tag_icons/rails.png +0 -0
  45. data/app/assets/images/tag_icons/ruby.png +0 -0
  46. data/app/assets/images/tag_icons/sass.png +0 -0
  47. data/app/assets/images/tag_icons/swift.png +0 -0
  48. data/app/assets/images/transmit_blue.png +0 -0
  49. data/app/assets/images/weekday_background.gif +0 -0
  50. data/app/assets/javascripts/calagator.js +18 -0
  51. data/app/assets/javascripts/calagator/forms.js +60 -0
  52. data/app/assets/stylesheets/calagator.scss +8 -0
  53. data/app/assets/stylesheets/calagator/common.scss +14 -0
  54. data/app/assets/stylesheets/calagator/datepicker.scss +177 -0
  55. data/app/assets/stylesheets/calagator/errors.css +110 -0
  56. data/app/assets/stylesheets/calagator/forms.scss +4 -0
  57. data/app/assets/stylesheets/calagator/reset.css +40 -0
  58. data/app/assets/stylesheets/calagator/theme.css +0 -0
  59. data/app/controllers/calagator/admin_controller.rb +27 -0
  60. data/app/controllers/calagator/application_controller.rb +82 -0
  61. data/app/controllers/calagator/events_controller.rb +171 -0
  62. data/app/controllers/calagator/site_controller.rb +35 -0
  63. data/app/controllers/calagator/sources_controller.rb +94 -0
  64. data/app/controllers/calagator/venues_controller.rb +133 -0
  65. data/app/controllers/calagator/versions_controller.rb +20 -0
  66. data/app/helpers/calagator/application_helper.rb +128 -0
  67. data/app/helpers/calagator/events_helper.rb +184 -0
  68. data/app/helpers/calagator/google_event_export_helper.rb +67 -0
  69. data/app/helpers/calagator/mapping_helper.rb +103 -0
  70. data/app/helpers/calagator/sources_helper.rb +10 -0
  71. data/app/helpers/calagator/tags_helper.rb +42 -0
  72. data/app/helpers/calagator/time_range_helper.rb +166 -0
  73. data/app/models/calagator/event.rb +246 -0
  74. data/app/models/calagator/event/cloner.rb +39 -0
  75. data/app/models/calagator/event/ical_renderer.rb +155 -0
  76. data/app/models/calagator/event/overview.rb +45 -0
  77. data/app/models/calagator/event/saver.rb +58 -0
  78. data/app/models/calagator/event/search.rb +72 -0
  79. data/app/models/calagator/event/search_engine.rb +28 -0
  80. data/app/models/calagator/event/search_engine/apache_sunspot.rb +106 -0
  81. data/app/models/calagator/event/search_engine/sql.rb +107 -0
  82. data/app/models/calagator/source.rb +115 -0
  83. data/app/models/calagator/source/importer.rb +46 -0
  84. data/app/models/calagator/source/parser.rb +128 -0
  85. data/app/models/calagator/source/parser/facebook.rb +67 -0
  86. data/app/models/calagator/source/parser/hcal.rb +108 -0
  87. data/app/models/calagator/source/parser/http_authentication_required_error.rb +6 -0
  88. data/app/models/calagator/source/parser/ical.rb +186 -0
  89. data/app/models/calagator/source/parser/meetup.rb +72 -0
  90. data/app/models/calagator/source/parser/not_found.rb +9 -0
  91. data/app/models/calagator/source/parser/plancast.rb +59 -0
  92. data/app/models/calagator/venue.rb +161 -0
  93. data/app/models/calagator/venue/geocoder.rb +51 -0
  94. data/app/models/calagator/venue/search.rb +63 -0
  95. data/app/models/calagator/venue/search_engine.rb +24 -0
  96. data/app/models/calagator/venue/search_engine/apache_sunspot.rb +85 -0
  97. data/app/models/calagator/venue/search_engine/sql.rb +68 -0
  98. data/app/models/event/search_engine/base.rb +0 -0
  99. data/app/observers/calagator/cache_observer.rb +37 -0
  100. data/app/views/calagator/admin/events.html.erb +28 -0
  101. data/app/views/calagator/admin/index.html.erb +8 -0
  102. data/app/views/calagator/events/_feed_item.html.erb +62 -0
  103. data/app/views/calagator/events/_form.html.erb +63 -0
  104. data/app/views/calagator/events/_gcal_reminder.html.erb +1 -0
  105. data/app/views/calagator/events/_hcal.html.erb +41 -0
  106. data/app/views/calagator/events/_item.html.erb +120 -0
  107. data/app/views/calagator/events/_list.html.erb +30 -0
  108. data/app/views/calagator/events/_list_item.html.erb +37 -0
  109. data/app/views/calagator/events/_search_section.html.erb +15 -0
  110. data/app/views/calagator/events/_subnav.html.erb +13 -0
  111. data/app/views/calagator/events/_table.html.erb +74 -0
  112. data/app/views/calagator/events/duplicates.html.erb +58 -0
  113. data/app/views/calagator/events/edit.html.erb +3 -0
  114. data/app/views/calagator/events/index.atom.builder +32 -0
  115. data/app/views/calagator/events/index.html.erb +51 -0
  116. data/app/views/calagator/events/index.kml.erb +20 -0
  117. data/app/views/calagator/events/new.html.erb +7 -0
  118. data/app/views/calagator/events/search.html.erb +25 -0
  119. data/app/views/calagator/events/show.html.erb +81 -0
  120. data/app/views/calagator/site/_appropriateness_message.html.erb +15 -0
  121. data/app/views/calagator/site/_description.html.erb +3 -0
  122. data/app/views/calagator/site/about.html.erb +7 -0
  123. data/app/views/calagator/site/defunct.html.erb +15 -0
  124. data/app/views/calagator/site/export.html.erb +4 -0
  125. data/app/views/calagator/site/index.html.erb +40 -0
  126. data/app/views/calagator/site/opensearch.xml.builder +8 -0
  127. data/app/views/calagator/sources/_subnav.html.erb +0 -0
  128. data/app/views/calagator/sources/edit.html.erb +12 -0
  129. data/app/views/calagator/sources/import.html.erb +10 -0
  130. data/app/views/calagator/sources/index.html.erb +22 -0
  131. data/app/views/calagator/sources/new.html.erb +32 -0
  132. data/app/views/calagator/sources/show.html.erb +16 -0
  133. data/app/views/calagator/venues/_form.html.erb +57 -0
  134. data/app/views/calagator/venues/_subnav.html.erb +10 -0
  135. data/app/views/calagator/venues/duplicates.html.erb +65 -0
  136. data/app/views/calagator/venues/edit.html.erb +3 -0
  137. data/app/views/calagator/venues/index.html.erb +93 -0
  138. data/app/views/calagator/venues/index.kml.erb +15 -0
  139. data/app/views/calagator/venues/map.html.erb +4 -0
  140. data/app/views/calagator/venues/new.html.erb +5 -0
  141. data/app/views/calagator/venues/show.html.erb +113 -0
  142. data/app/views/calagator/versions/_chooser.html.erb +28 -0
  143. data/app/views/calagator/versions/_edit_with_chooser.html.erb +16 -0
  144. data/app/views/layouts/calagator/application.html.erb +110 -0
  145. data/config/deploy/local.rb +37 -0
  146. data/config/deploy/lucca.rb +33 -0
  147. data/config/initializers/dates.rb +7 -0
  148. data/config/initializers/formtastic.rb +82 -0
  149. data/config/initializers/geokit.rb +74 -0
  150. data/config/initializers/ics_renderer.rb +6 -0
  151. data/config/initializers/load_tag_model_extensions.rb +3 -0
  152. data/config/initializers/mime_types.rb +9 -0
  153. data/config/initializers/observers.rb +1 -0
  154. data/config/initializers/search_engine.rb +4 -0
  155. data/config/initializers/set_default_url_host.rb +5 -0
  156. data/config/initializers/time_get_zone.rb +8 -0
  157. data/config/locales/en.yml +5 -0
  158. data/config/routes.rb +55 -0
  159. data/config/secrets.yml.blag +75 -0
  160. data/config/sunspot.yml +23 -0
  161. data/db/development.sqlite3 +0 -0
  162. data/db/development.sqlite3.bak +0 -0
  163. data/db/development.sqlite3.old +0 -0
  164. data/db/development~20111112@110950.sqlite3 +0 -0
  165. data/db/migrate/001_create_events.rb +17 -0
  166. data/db/migrate/002_create_venues.rb +17 -0
  167. data/db/migrate/003_create_sources.rb +16 -0
  168. data/db/migrate/004_add_detailed_fields_to_venue.rb +19 -0
  169. data/db/migrate/005_add_end_time_to_events.rb +9 -0
  170. data/db/migrate/006_add_source_id_to_events.rb +9 -0
  171. data/db/migrate/008_add_source_id_to_venues.rb +10 -0
  172. data/db/migrate/009_add_duplicate_of_column_to_venues.rb +9 -0
  173. data/db/migrate/010_add_duplicate_of_column_to_events.rb +9 -0
  174. data/db/migrate/011_change_lat_long_type.rb +12 -0
  175. data/db/migrate/012_add_source_reimport.rb +9 -0
  176. data/db/migrate/013_change_end_time_to_duration.rb +11 -0
  177. data/db/migrate/014_remove_format_type_from_source.rb +9 -0
  178. data/db/migrate/015_create_updates.rb +15 -0
  179. data/db/migrate/016_remove_next_update_from_source.rb +9 -0
  180. data/db/migrate/20080705163959_change_duration_to_end_time.rb +11 -0
  181. data/db/migrate/20080705164959_create_tags_and_taggings.rb +28 -0
  182. data/db/migrate/20081011181519_create_versioned_events.rb +25 -0
  183. data/db/migrate/20081011193124_create_versioned_venues.rb +32 -0
  184. data/db/migrate/20081115190515_add_rrule_to_events.rb +15 -0
  185. data/db/migrate/20090912082129_create_versions.rb +18 -0
  186. data/db/migrate/20110219205156_add_closed_flag_to_venues.rb +9 -0
  187. data/db/migrate/20110220001008_add_wifi_flag_to_venues.rb +9 -0
  188. data/db/migrate/20110220011427_add_access_notes_to_venues.rb +9 -0
  189. data/db/migrate/20110220031117_add_events_count_to_venues.rb +8 -0
  190. data/db/migrate/20110604174521_add_venue_details_to_events.rb +9 -0
  191. data/db/migrate/20110717231316_acts_as_taggable_on_migration.rb +50 -0
  192. data/db/migrate/20120709092821_cleanup.rb +14 -0
  193. data/db/migrate/20120831234448_specify_venues_latitude_and_longitude_precision.rb +11 -0
  194. data/db/migrate/20150206085809_remove_updates.rb +13 -0
  195. data/db/migrate/20150207231355_add_locked_status_to_events.rb +5 -0
  196. data/db/production.sqlite3 +0 -0
  197. data/db/schema.rb +102 -0
  198. data/db/seeds.rb +16 -0
  199. data/db/test.sqlite3 +0 -0
  200. data/db/test2.sqlite3 +0 -0
  201. data/lib/calagator.rb +30 -0
  202. data/lib/calagator/blacklist_validator.rb +69 -0
  203. data/lib/calagator/decode_html_entities_hack.rb +33 -0
  204. data/lib/calagator/duplicate_checking.rb +133 -0
  205. data/lib/calagator/duplicate_checking/controller_actions.rb +38 -0
  206. data/lib/calagator/duplicate_checking/duplicate_finder.rb +83 -0
  207. data/lib/calagator/duplicate_checking/duplicate_squasher.rb +74 -0
  208. data/lib/calagator/engine.rb +30 -0
  209. data/lib/calagator/strip_whitespace.rb +19 -0
  210. data/lib/calagator/tag_model_extensions.rb +104 -0
  211. data/lib/calagator/url_prefixer.rb +9 -0
  212. data/lib/calagator/version.rb +3 -0
  213. data/lib/generators/calagator/install_generator.rb +39 -0
  214. data/lib/generators/calagator/templates/config/calagator.rb +26 -0
  215. data/lib/generators/calagator/templates/config/secrets.yml.sample +83 -0
  216. data/lib/secrets_reader.rb +76 -0
  217. data/lib/tasks/spec_db.rake +53 -0
  218. data/lib/tasks/sunspot_reindex_calagator.rake +6 -0
  219. data/lib/tasks/sunspot_solr_restart_enhancements.rake +19 -0
  220. data/lib/tasks/update_counter_caches.rake +13 -0
  221. data/lib/templates/erb/scaffold/_form.html.erb +11 -0
  222. data/lib/theme_reader.rb +17 -0
  223. data/lib/wait_for_solr.rb +25 -0
  224. data/spec/controllers/calagator/application_controller_spec.rb +47 -0
  225. data/spec/controllers/calagator/events_controller_spec.rb +794 -0
  226. data/spec/controllers/calagator/site_controller_spec.rb +59 -0
  227. data/spec/controllers/calagator/sources_controller_spec.rb +439 -0
  228. data/spec/controllers/calagator/venues_controller_spec.rb +319 -0
  229. data/spec/controllers/calagator/versions_controller_spec.rb +82 -0
  230. data/spec/controllers/squash_many_duplicates_examples.rb +49 -0
  231. data/spec/dummy/Gemfile +39 -0
  232. data/spec/dummy/Gemfile.lock +195 -0
  233. data/spec/dummy/README.rdoc +261 -0
  234. data/spec/dummy/Rakefile +7 -0
  235. data/spec/dummy/app/assets/images/rails.png +0 -0
  236. data/spec/dummy/app/assets/javascripts/application.js +16 -0
  237. data/spec/dummy/app/assets/stylesheets/application.css +14 -0
  238. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  239. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  240. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  241. data/spec/dummy/config.ru +4 -0
  242. data/spec/dummy/config/application.rb +62 -0
  243. data/spec/dummy/config/boot.rb +6 -0
  244. data/spec/dummy/config/database.yml +25 -0
  245. data/spec/dummy/config/environment.rb +5 -0
  246. data/spec/dummy/config/environments/development.rb +37 -0
  247. data/spec/dummy/config/environments/production.rb +67 -0
  248. data/spec/dummy/config/environments/test.rb +37 -0
  249. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  250. data/spec/dummy/config/initializers/calagator.rb +26 -0
  251. data/spec/dummy/config/initializers/inflections.rb +15 -0
  252. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  253. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  254. data/spec/dummy/config/initializers/session_store.rb +8 -0
  255. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  256. data/spec/dummy/config/locales/en.yml +5 -0
  257. data/spec/dummy/config/routes.rb +59 -0
  258. data/spec/dummy/config/secrets.yml +83 -0
  259. data/spec/dummy/db/development.sqlite3 +0 -0
  260. data/spec/dummy/db/migrate/20150309023304_create_events.calagator.rb +18 -0
  261. data/spec/dummy/db/migrate/20150309023305_create_venues.calagator.rb +18 -0
  262. data/spec/dummy/db/migrate/20150309023306_create_sources.calagator.rb +17 -0
  263. data/spec/dummy/db/migrate/20150309023307_add_detailed_fields_to_venue.calagator.rb +20 -0
  264. data/spec/dummy/db/migrate/20150309023308_add_end_time_to_events.calagator.rb +10 -0
  265. data/spec/dummy/db/migrate/20150309023309_add_source_id_to_events.calagator.rb +10 -0
  266. data/spec/dummy/db/migrate/20150309023310_add_source_id_to_venues.calagator.rb +11 -0
  267. data/spec/dummy/db/migrate/20150309023311_add_duplicate_of_column_to_venues.calagator.rb +10 -0
  268. data/spec/dummy/db/migrate/20150309023312_add_duplicate_of_column_to_events.calagator.rb +10 -0
  269. data/spec/dummy/db/migrate/20150309023313_change_lat_long_type.calagator.rb +13 -0
  270. data/spec/dummy/db/migrate/20150309023314_add_source_reimport.calagator.rb +10 -0
  271. data/spec/dummy/db/migrate/20150309023315_change_end_time_to_duration.calagator.rb +12 -0
  272. data/spec/dummy/db/migrate/20150309023316_remove_format_type_from_source.calagator.rb +10 -0
  273. data/spec/dummy/db/migrate/20150309023317_create_updates.calagator.rb +16 -0
  274. data/spec/dummy/db/migrate/20150309023318_remove_next_update_from_source.calagator.rb +10 -0
  275. data/spec/dummy/db/migrate/20150309023319_change_duration_to_end_time.calagator.rb +12 -0
  276. data/spec/dummy/db/migrate/20150309023320_create_tags_and_taggings.calagator.rb +29 -0
  277. data/spec/dummy/db/migrate/20150309023321_create_versioned_events.calagator.rb +26 -0
  278. data/spec/dummy/db/migrate/20150309023322_create_versioned_venues.calagator.rb +33 -0
  279. data/spec/dummy/db/migrate/20150309023323_add_rrule_to_events.calagator.rb +16 -0
  280. data/spec/dummy/db/migrate/20150309023324_create_versions.calagator.rb +19 -0
  281. data/spec/dummy/db/migrate/20150309023325_add_closed_flag_to_venues.calagator.rb +10 -0
  282. data/spec/dummy/db/migrate/20150309023326_add_wifi_flag_to_venues.calagator.rb +10 -0
  283. data/spec/dummy/db/migrate/20150309023327_add_access_notes_to_venues.calagator.rb +10 -0
  284. data/spec/dummy/db/migrate/20150309023328_add_events_count_to_venues.calagator.rb +9 -0
  285. data/spec/dummy/db/migrate/20150309023329_add_venue_details_to_events.calagator.rb +10 -0
  286. data/spec/dummy/db/migrate/20150309023330_acts_as_taggable_on_migration.calagator.rb +51 -0
  287. data/spec/dummy/db/migrate/20150309023331_cleanup.calagator.rb +15 -0
  288. data/spec/dummy/db/migrate/20150309023332_specify_venues_latitude_and_longitude_precision.calagator.rb +12 -0
  289. data/spec/dummy/db/migrate/20150309023333_remove_updates.calagator.rb +14 -0
  290. data/spec/dummy/db/migrate/20150309023334_add_locked_status_to_events.calagator.rb +6 -0
  291. data/spec/dummy/db/schema.rb +95 -0
  292. data/spec/dummy/db/seeds.rb +7 -0
  293. data/spec/dummy/db/test.sqlite3 +0 -0
  294. data/spec/dummy/doc/README_FOR_APP +2 -0
  295. data/spec/dummy/log/development.log +273 -0
  296. data/spec/dummy/public/404.html +26 -0
  297. data/spec/dummy/public/422.html +26 -0
  298. data/spec/dummy/public/500.html +25 -0
  299. data/spec/dummy/public/favicon.ico +0 -0
  300. data/spec/dummy/public/robots.txt +5 -0
  301. data/spec/dummy/script/rails +6 -0
  302. data/spec/dummy/test/performance/browsing_test.rb +12 -0
  303. data/spec/dummy/test/test_helper.rb +13 -0
  304. data/spec/factories.rb +93 -0
  305. data/spec/features/add_event_spec.rb +99 -0
  306. data/spec/features/add_venue_spec.rb +34 -0
  307. data/spec/features/admin_auth_spec.rb +22 -0
  308. data/spec/features/admin_lock_event_spec.rb +41 -0
  309. data/spec/features/import_events_from_feed_spec.rb +43 -0
  310. data/spec/features/managing_event_spec.rb +111 -0
  311. data/spec/features/managing_venue_spec.rb +71 -0
  312. data/spec/features/search_event_spec.rb +27 -0
  313. data/spec/helpers/calagator/application_helper_spec.rb +82 -0
  314. data/spec/helpers/calagator/events_helper_spec.rb +172 -0
  315. data/spec/helpers/calagator/google_event_export_helper_spec.rb +70 -0
  316. data/spec/helpers/calagator/sources_helper_spec.rb +12 -0
  317. data/spec/helpers/calagator/tags_helper_spec.rb +85 -0
  318. data/spec/helpers/calagator/time_range_helper_spec.rb +59 -0
  319. data/spec/lib/calagator/blacklist_validator_spec.rb +65 -0
  320. data/spec/lib/calagator/decode_html_entities_hack_spec.rb +54 -0
  321. data/spec/lib/calagator/settings_spec.rb +20 -0
  322. data/spec/lib/calagator/url_prefixer_spec.rb +33 -0
  323. data/spec/lib/secrets_reader_spec.rb +65 -0
  324. data/spec/models/calagator/event/cloner_spec.rb +43 -0
  325. data/spec/models/calagator/event/overview_spec.rb +79 -0
  326. data/spec/models/calagator/event/search_spec.rb +103 -0
  327. data/spec/models/calagator/event_search_spec.rb +149 -0
  328. data/spec/models/calagator/event_spec.rb +859 -0
  329. data/spec/models/calagator/source/parser_facebook_spec.rb +73 -0
  330. data/spec/models/calagator/source/parser_hcal_spec.rb +69 -0
  331. data/spec/models/calagator/source/parser_ical_non_standard_spec.rb +91 -0
  332. data/spec/models/calagator/source/parser_ical_spec.rb +322 -0
  333. data/spec/models/calagator/source/parser_meetup_spec.rb +69 -0
  334. data/spec/models/calagator/source/parser_plancast_spec.rb +53 -0
  335. data/spec/models/calagator/source/parser_spec.rb +238 -0
  336. data/spec/models/calagator/source_spec.rb +135 -0
  337. data/spec/models/calagator/venue/search_spec.rb +92 -0
  338. data/spec/models/calagator/venue_search_spec.rb +124 -0
  339. data/spec/models/calagator/venue_spec.rb +346 -0
  340. data/spec/models/tag_spec.rb +35 -0
  341. data/spec/rails_helper.rb +39 -0
  342. data/spec/spec_helper.rb +140 -0
  343. data/spec/support/disable_geocoding.rb +1 -0
  344. data/spec/support/http_samples.rb +5 -0
  345. data/spec/support/samples/facebook.json +23 -0
  346. data/spec/support/samples/hcal_basic.xml +6 -0
  347. data/spec/support/samples/hcal_dup_event_dup_venue.xml +13 -0
  348. data/spec/support/samples/hcal_event_duplicates_fixture.xml +13 -0
  349. data/spec/support/samples/hcal_event_wo_lat_and_long.xml +14 -0
  350. data/spec/support/samples/hcal_multiple.xml +16 -0
  351. data/spec/support/samples/hcal_same_event_twice_with_different_venues.xml +12 -0
  352. data/spec/support/samples/hcal_single.xml +8 -0
  353. data/spec/support/samples/hcal_two_identical_events.xml +14 -0
  354. data/spec/support/samples/hcal_upcoming_v1.html +412 -0
  355. data/spec/support/samples/hcal_upcoming_v2.html +749 -0
  356. data/spec/support/samples/hcal_upcoming_v3.html +685 -0
  357. data/spec/support/samples/hcal_upcoming_v4.html +761 -0
  358. data/spec/support/samples/ical_apple.ics +22 -0
  359. data/spec/support/samples/ical_apple_v3.ics +37 -0
  360. data/spec/support/samples/ical_basic.ics +15 -0
  361. data/spec/support/samples/ical_basic_with_duration.ics +16 -0
  362. data/spec/support/samples/ical_event_with_squashed_venue.ics +12 -0
  363. data/spec/support/samples/ical_eventful_many.ics +504 -0
  364. data/spec/support/samples/ical_gmt.ics +12 -0
  365. data/spec/support/samples/ical_google.ics +786 -0
  366. data/spec/support/samples/ical_multiple_calendars.ics +111 -0
  367. data/spec/support/samples/ical_upcoming.ics +36 -0
  368. data/spec/support/samples/ical_upcoming_many.ics +682 -0
  369. data/spec/support/samples/ical_upcoming_v2.ics +43 -0
  370. data/spec/support/samples/ical_z.ics +10 -0
  371. data/spec/support/samples/meetup.ics +16 -0
  372. data/spec/support/samples/meetup.json +31 -0
  373. data/spec/support/samples/plancast.ics +59 -0
  374. data/spec/support/samples/plancast.json +51 -0
  375. data/spec/support/samples/plancast_with_missing_venue.json +39 -0
  376. data/spec/support/samples/upcoming_v1.xml +8 -0
  377. data/spec/support/samples/upcoming_v2_with_invalid_utc_dates.xml +8 -0
  378. data/spec/support/time_convenience_methods.rb +8 -0
  379. data/spec/support/time_zones.rb +12 -0
  380. data/spec/support/url_helpers.rb +5 -0
  381. data/spec/support/wait_for_ajax.rb +15 -0
  382. data/spec/support/webmock.rb +8 -0
  383. data/spec/travis_spec.rb +7 -0
  384. metadata +1194 -0
@@ -0,0 +1,749 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml"
3
+ xmlns:cal="http://www.w3.org/2002/12/cal/cal#"
4
+ xmlns:vcard="http://www.w3.org/2006/vcard/ns#"
5
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
6
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
7
+ xmlns:upcoming="http://www.upcoming.org/vocab/"
8
+ xmlns:foaf="http://xmlns.com/foaf/0.1/">
9
+
10
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
11
+ <html>
12
+ <head>
13
+ <title>Ignite Portland 4 at Bagdad Theater and Pub (Thursday November 13, 2008) - Upcoming</title>
14
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
15
+ <meta http-equiv="Content-Language" content="en-us">
16
+ <meta name="description" content="Upcoming Ignite Portland 4 at Bagdad Theater and Pub (Thursday November 13, 2008)">
17
+ <meta name="keywords" content="upcoming Ignite Portland 4 at Bagdad Theater and Pub (Thursday November 13, 2008)">
18
+ <link rel="shortcut icon" type="image/vnd.microsoft.icon" href="/favicon.ico">
19
+ <meta http-equiv="X-UA-Compatible" content="IE=7"/>
20
+ <meta name="verify-v1" content="S6riHTy4aqQhYzxbTmxrbL229QqGndjohgo6wDpIuao=" />
21
+ <link rel="shortcut icon" type="image/vnd.microsoft.icon" href="/favicon.ico"/>
22
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.1/build/reset-fonts-grids/reset-fonts-grids.css" />
23
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.1/build/autocomplete/assets/skins/sam/autocomplete.css" />
24
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.1/build/calendar/assets/skins/sam/calendar.css" />
25
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.1/build/container/assets/skins/sam/container.css" />
26
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.1/build/menu/assets/skins/sam/menu.css" />
27
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.1/build/tabview/assets/skins/sam/tabview.css" />
28
+ <link rel="stylesheet" type="text/css" href="http://l.yimg.com/ycs.upcoming.yahoo.com/css/default_0c96d4c69184561e54b970b0e16e369e.css" /><link rel="stylesheet" type="text/css" href="http://l.yimg.com/ycs.upcoming.yahoo.com/css/base_403d19c4bca36e43f1312b985c82156a.css" /><link rel="stylesheet" type="text/css" href="http://l.yimg.com/ycs.upcoming.yahoo.com/css/home_8819933806dcfb465edb31c116ecdcbf.css" /> </head>
29
+ <body>
30
+ <div id="doc4">
31
+ <div id="up-hd">
32
+ <div id="up-hd-user-websearch">
33
+ <div id="up-hd-user">
34
+ <span>
35
+ Welcome, <a href="/user/122240/">igal</a>
36
+ <a href="/notes/" title="Notes"><img src="http://us.i1.yimg.com/us.yimg.com/i/nt/ic/ut/alt3/mail12_1.gif" border="0" title="Notes" height="12" width="12" style="vertical-align: middle;" /></a> </span>
37
+ <a href="/logout/">Sign Out</a> |
38
+ <a href="/user/122240/">My Account</a> |
39
+ <a href="/help/">Help</a>
40
+ </div> <div id="up-hd-websearch">
41
+ <form id="up-hd-websearch-form" action="http://search.yahoo.com/search">
42
+ <div class="up-inline">
43
+ <label for="up-hd-websearch-q">Web search query term</label>
44
+ <input id="up-hd-websearch-q" name="p" type="text">
45
+ <button id="up-hd-websearch-button-go" class="up-palette2">Web Search</button>
46
+ </div>
47
+ </form>
48
+ </div> </div> <div id="up-hd-logo-search-nav" class="up-palette1">
49
+ <div id="up-hd-search">
50
+ <a id="up-hd-search-logo" class="up-palette1" href="/">Upcoming</a>
51
+ <form id="up-hd-search-form" action="/search/">
52
+ <input type="hidden" id="up-hd-search-action-type" name="type" value="events">
53
+ <input type="hidden" id="up-hd-search-radius-toggle" name="rt" value="1">
54
+
55
+ <span id="search-form-body">
56
+ <label for="up-hd-search-query">Search <span id="up-hd-search-query-label">Events</span></label>
57
+ <input id="up-hd-search-query" class="up-palette1 up-hd-search-query-notwide" name="q" type="text" value=""/>
58
+ <label for="up-hd-search-location" id="up-hd-search-location-label">City, State or Zip</label>
59
+ <input id="up-hd-search-location" class="up-palette1 up-hd-search-query-notwide " name="loc" type="text" value="San Francisco Bay Area" />
60
+ <div id="up-hd-search-buttons">
61
+ <button id="up-hd-search-button-go" class="up-palette1">Search <span id="up-hd-search-button-label">Events</span></button>
62
+ <button id="up-hd-search-button-change" class="up-palette1">Change Search Type</button>
63
+ </div>
64
+ <div id="up-hd-search-change" class="yuimenu">
65
+ <div class="bd">
66
+ <ul class="first-of-type">
67
+ <li class="yuimenuitem"><a class="yuimenuitemlabel up-palette2 up-hd-search-change-current" title="events" href="/event/">Events</a></li>
68
+ <li class="yuimenuitem"><a class="yuimenuitemlabel up-palette2 " title="venues" href="/venue/">Venues</a></li>
69
+ <!-- <li class="yuimenuitem"><a class="yuimenuitemlabel up-palette2 " title="performers" href="/performer/">Performers</a></li> -->
70
+ <li class="yuimenuitem"><a class="yuimenuitemlabel up-palette2 " title="users" href="/friend/">Upcoming Users</a></li>
71
+ </ul>
72
+ </div>
73
+ </div>
74
+ </span>
75
+ </form>
76
+ </div> <ul id="up-hd-nav">
77
+ <li id="home"><a id="up-hd-nav-home" href="/">Home</a></li>
78
+ <li id="events">
79
+ <a href="/myevents/" id="up-hd-nav-events-link" class="up-hd-nav-menu-link">My Events</a>
80
+ <a href="/myevents/" id="up-hd-nav-events" class="up-hd-nav-menubtn up-palette2">More Events Links</a>
81
+ <div class="up-hd-nav-menu-container">
82
+ <div id="up-hd-nav-events-menu" class="yuimenu">
83
+ <div class="bd">
84
+ <ul class="first-of-type">
85
+ <li class="yuimenuitem"><a href="/myevents/">My Events</a></li>
86
+ <li class="yuimenuitem"><a href="/friend/">My Friends</a></li>
87
+ <li class="yuimenuitem"><a href="/user/122240/">My Account</a></li>
88
+ <li class="yuimenuitem"><a href="/group/">My Groups</a></li>
89
+ <li class="yuimenuitem"><a href="/history/myevents/">My Scrapbook</a></li>
90
+ <li class="yuimenuitem"><a href="/activity/">What's New For You</a></li>
91
+ </ul>
92
+ </div>
93
+ </div>
94
+ </div>
95
+ </li>
96
+ <li id="friends">
97
+ <a href="/friend/" id="up-hd-nav-friends-link" class="up-hd-nav-menu-link">Friends</a>
98
+ <a href="/friend/" id="up-hd-nav-friends" class="up-hd-nav-menubtn up-palette2">More Friends Links</a>
99
+ <div class="up-hd-nav-menu-container">
100
+ <div id="up-hd-nav-friends-menu" class="yuimenu">
101
+ <div class="bd">
102
+ <ul class="first-of-type">
103
+ <li class="yuimenuitem"><a href="/friend/event/">Friends' Events</a></li>
104
+ <li class="yuimenuitem"><a href="/friend/">Friends List</a></li>
105
+ <li class="yuimenuitem"><a href="/site_invite/">Invite Friends</a></li>
106
+ </ul>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ </li>
111
+ <li id="more">
112
+ <a href="/more/" id="up-hd-nav-more-link" class="up-hd-nav-menu-link">More</a>
113
+ <a href="/more/" id="up-hd-nav-more" class="up-hd-nav-menubtn up-palette2">More Helpful Links</a>
114
+ <div class="up-hd-nav-menu-container">
115
+ <div id="up-hd-nav-more-menu" class="yuimenu">
116
+ <div class="bd">
117
+ <ul class="first-of-type">
118
+ <li class="yuimenuitem"><a href="/group/">Groups</a></li>
119
+ <li class="yuimenuitem"><a href="/place/">Places</a></li>
120
+ <li class="yuimenuitem"><a href="/news/">News Blog</a></li>
121
+ <li class="yuimenuitem"><a href="/badge/">Upcoming Badges</a></li>
122
+ <li class="yuimenuitem"><a href="/services/api/">Developers API</a></li>
123
+ <li class="yuimenuitem"><a href="http://suggestions.yahoo.com/?prop=upcoming">Suggestion Board</a></li>
124
+ </ul>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ </li>
129
+ <li id="add"><a id="up-hd-nav-add" class="up-palette2" href="/event/add/">Add An Event</a></li>
130
+ <li id="up-hd-nav-logo-container"><a id="up-hd-nav-logo" class="up-palette1" href="http://www.yahoo.com/">Yahoo!</a></li>
131
+ </ul> </div> </div> <div id="up-bd">
132
+
133
+
134
+ <div id="calendarContainer" class="vcalendar"> <!-- Begin vCalendar -->
135
+
136
+
137
+
138
+ <div id="event" class="vevent" about="#event" typeof="cal:Vevent">
139
+
140
+ <h1>
141
+ <div class="name summary" property="cal:summary">
142
+ Ignite Portland 4 </div>
143
+ </h1>
144
+ <div id="up-detail-tabs">
145
+ <ul>
146
+ <li class="selected"><div class="body">DETAILS &amp; PHOTOS</div></li>
147
+ <li><div class="body"><span class="map-icon">&nbsp;</span><a href="/maps/872418">MAPS & WHAT'S NEARBY</a></div></li>
148
+ </ul>
149
+ </div>
150
+
151
+
152
+ <div id="eventMain">
153
+ <div id="add_photo_container" class="clicker_menu">
154
+ <a href="/event/872418/" id="add_photo_close_link">(close)</a>
155
+ <ul>
156
+ <li>
157
+ <form method="post" action="/photos/upload/872418/" enctype="multipart/form-data">
158
+ <label for="image">Select photo file to upload:</label>
159
+ <input type="file" id="image" name="image" />
160
+ <label for="caption">Add a title:</label>
161
+ <input type="text" id="caption" name="caption" maxlength="200" />
162
+ <input id="up-evt-photoup-btn" type="submit" value="Upload Photo" />
163
+ </form>
164
+ </li>
165
+ <li id="up-evt-photoup-flickr">
166
+ <p>Add Photos from <span class="up-flickr-logo">Flick<strong>r</strong></span></p>
167
+ <label for="up-evt-photoup-flickr-tag">Tag a public <a rel="nofollow" href="http://flickr.com/">Flickr</a> photo with:</label>
168
+ <input type="text" id="up-evt-photoup-flickr-tag" onFocus="this.select();" value="upcoming:event=872418" />
169
+ <p id="up-evt-photoup-flickr-note">Your photos will appear on this event page automagically in a little while!</p>
170
+ </li>
171
+ </ul>
172
+ <a id="add_photo_anchor"></a>
173
+ </div>
174
+ <div id="eventMetadata">
175
+ <div class="additionalInfo">
176
+
177
+ <div id="phototitle" class="phototext" style="visibility:hidden;display:none">Event Photos</div>
178
+ <div id="addphotos">
179
+ Have a photo?
180
+ <a id="add_photo_link" href="/event/872418">Add it here</a>
181
+ </div>
182
+ <div id="eventPhotos">
183
+ <div id="photo_container"></div>
184
+
185
+ <div class="photolink">
186
+ <span class="small" id="photos_loading_msg">
187
+ <div id="photolink_see">
188
+ <a href="/photos/event/872418" id="photos_see_all_link">loading...</a>
189
+ </div>
190
+ <div id="photolink_add">
191
+ <a id="add_photo_link2" href="/event/872418">Add Photos</a>
192
+ </div>
193
+ </span>
194
+ </div>
195
+ </div>
196
+
197
+
198
+
199
+
200
+
201
+ </div>
202
+ <!-- toolbar - top -->
203
+
204
+ <ul id="event-toolbar">
205
+ <li> <div id="addToCalendar_872418_" class="export_button ">
206
+ <a rel="upcoming:addToCalendar" href="/event/872418/export">Add to calendar</a>
207
+ </div></li>
208
+ <li><a id="invite" rel="upcoming:inviteFriends" href="/tools/invite/872418">Invite Friends</a></li>
209
+ <li><a id="print" href="javascript:void(0)" onclick="window.print()">Print</a></li>
210
+ </ul>
211
+
212
+ <!-- end of toolbar -top -->
213
+
214
+ <div class="datetime">
215
+ <abbr class="dtstart" property="cal:dtstart" content="2008-11-13" title="20081113T190000">
216
+ Thursday November 13, 2008 </abbr>
217
+ from
218
+ 7:00pm - <abbr class="dtend" title="20081113T210000">9:00pm</abbr>
219
+ </div> <!-- /.time -->
220
+
221
+ <div class="venue location vcard" class="vcard" about="#venue">
222
+ <span class="fn org"><a rel="vcard:url" property="vcard:fn" href="/venue/61559/">Bagdad Theater and Pub</a></span><br />
223
+ <div class="address adr" rel="vcard:adr"><div typeof="vcard:Address">
224
+ <span class="street-address" property="vcard:street-address">3702 S.E. Hawthorne Blvd</span><br />
225
+ <span class="locality" property="vcard:locality">Portland</span>, <span class="region" property="vcard:region">Oregon</span> <span class="postal-code" property="vcard:postal-code">97214</span>
226
+ </div></div>
227
+
228
+ </div> <!-- /.venue -->
229
+
230
+ <div class="small">Category:
231
+ <span id="category">Social</span>
232
+ </div>
233
+ <div class="small">Website: <a rel="nofollow" href="http://www.igniteportland.com" class="url">http://www.igniteportland.com</a></div>
234
+
235
+
236
+ <div class="description">
237
+ Save the date! Ignite Portland 4 will happen on Thursday November 13, 2008, at the Bagdad. Same venue. Same format. Even more burning ideas.<br /><br />
238
+ More details to come - stay tuned!<br /><br />
239
+ <a rel="nofollow" href="http://www.igniteportland.com">http://www.igniteportland.com</a><br /><br />
240
+ <a rel="nofollow" href="http://twitter.com/igniteportland">http://twitter.com/igniteportland</a><br /><br />
241
+ <a rel="nofollow" href="http://friendfeed.com/rooms/igniteportland">http://friendfeed.com/rooms/igniteportland</a><br />
242
+ </div>
243
+
244
+
245
+
246
+
247
+
248
+
249
+ &nbsp;
250
+ <div class="clearb"></div>
251
+ <div class="bylineReport">
252
+ <div class="byline">
253
+ Added by
254
+
255
+ <a href="/user/21062/"><img src="http://static.flickr.com/8/buddyicons/44124452748@N01.jpg" height="12" width="12" border="0" /></a>
256
+ <span><a class="" id="user_21062" title="" href="http://upcoming.yahoo.com/user/21062/">jabancroft</a></span>
257
+ on July 10, 2008 <span id="event-toolbar"><a id="report" href="/flag/event/872418">Report a problem </a></span>
258
+
259
+ </div>
260
+ <div style="height: 0px; clear: both;"></div>
261
+
262
+ </div>
263
+ </div>
264
+
265
+
266
+
267
+ <table class="mediatable">
268
+ <tr>
269
+
270
+
271
+ </tr>
272
+ </table>
273
+
274
+ <!-- /#eventMetadata -->
275
+
276
+ <div id="eventComments">
277
+
278
+ <div class="event-heading">Comments</div>
279
+ <a href="/user/207129/"><img src="http://static.flickr.com/2207/buddyicons/22527601@N04.jpg" class="event-avatar" align="left" /></a>
280
+
281
+ <div class="event-comment">
282
+ <div class="byline">
283
+ <a id="71111"></a>
284
+
285
+ <span><a class="" id="user_207129" title="" href="http://upcoming.yahoo.com/user/207129/">gwalter</a></span> wrote:
286
+
287
+ </div><!-- end byline -->
288
+
289
+ <div class="commentBody">
290
+ Please give us more time and prep to sign up this time. Thanks<br />
291
+ </div><!-- end comment -->
292
+
293
+ <div class="date">
294
+ Posted 8 weeks ago </div> <!-- /.date -->
295
+ </div> <!-- /.comment -->
296
+ <div id="event-addcomments">
297
+ <form method="post" action="/add/comment/">
298
+ <input type="hidden" name="_ucrumb" value="9y7hUiSbKo1" />
299
+ <div class="heading">Add a comment:</div>
300
+ <textarea name="comment" id="comment" rows="5" cols="80" class="smarttext"></textarea>
301
+ <p id="comment-limit" title="4000" style="font-size: 10px; float: right;">Limit 4000 characters.</p>
302
+
303
+ <input type="hidden" name="event_id" value="872418" />
304
+ <input type="submit" name="submit" class="button" value="Post Comment" />
305
+ </form>
306
+ </div><!-- end addcomments -->
307
+
308
+ </div> <!-- /#eventComments -->
309
+
310
+ </div> <!-- /#eventMain -->
311
+
312
+
313
+ <!--
314
+
315
+ ##########################################################################
316
+ Sidebar
317
+ ##########################################################################
318
+
319
+ -->
320
+
321
+
322
+ <div id="eventSidebar">
323
+
324
+
325
+ <div id="sidebarTopContainer">
326
+ <div id="sidebarTop">
327
+
328
+
329
+ <div id="attendWidget872418" class="attendWidget">
330
+ <div id="watchlistCta" class="eventSidebarTitle" style="float: left;">
331
+ You said you're going
332
+ </div>
333
+ <span class="undo"><a class="undo" href="javascript:void(0)">(undo)</a></span>
334
+ <div style="clear: both;"></div>
335
+
336
+ <div class="watchlistStatuses"> <form id="watchlistForm" onSubmit="return false;" method="GET" action="/watchlist">
337
+ <table>
338
+ <td class="buttonContainer">
339
+ <span id="attendButton" class="on">
340
+ <div class="container">
341
+ <div class="front">
342
+ <div class="face">
343
+ <button name="status" value="delete" >
344
+ <div class="check">I'm Going</div>
345
+ <div class="busynotice">Saving to My Events</div>
346
+ </button>
347
+ </div>
348
+ </div>
349
+ <div class="back"></div>
350
+ </div>
351
+ </span>
352
+ </td>
353
+ <td>or</td>
354
+ <td class="buttonContainer">
355
+ <span id="watchButton" class="off">
356
+ <div class="container">
357
+ <div class="front">
358
+ <div class="face">
359
+ <button name="status" value="watch">
360
+ <div class="check">I'm Interested</div>
361
+ <div class="busynotice">Saving to My Events</div>
362
+ </button>
363
+ </div>
364
+ </div>
365
+ <div class="back"></div>
366
+ </div>
367
+ </span>
368
+ </td>
369
+ </table>
370
+ <input type="hidden" name="redirect" value="/event/872418"/>
371
+ <input type="hidden" name="event_id" value="872418"/>
372
+ <input type="hidden" name="_ucrumb" value=""/>
373
+ </form>
374
+ </div>
375
+
376
+ <div style="clear: both;"></div>
377
+
378
+ <div class="guestCount" style="display:block">
379
+ <form id="attendWidget872418.guestForm" method="POST" action="/watchlist/index.php">
380
+ <input type="hidden" name="_ucrumb" value="9y7hUiSbKo1" />
381
+ <input type="hidden" name="event_id" value="872418" />
382
+
383
+ Bring Some Friends?:
384
+ <select name="num_guests"><option value="0" selected>0</option>
385
+ <option value="1">1</option>
386
+ <option value="2">2</option>
387
+ <option value="3">3</option>
388
+ <option value="4">4</option>
389
+ <option value="5">5</option>
390
+ <option value="6">6</option>
391
+ <option value="7">7</option>
392
+ <option value="8">8</option>
393
+ <option value="9">9</option>
394
+ <option value="10">10</option>
395
+ </select>
396
+
397
+ <noscript>
398
+ <input type="submit" value="Change"/>
399
+ </noscript>
400
+
401
+ </form>
402
+ </div>
403
+ </div>
404
+
405
+
406
+ <div id="friendlist872418" class="friendlist"><div id="friendlistContainer1"><div id="friendlistContainer2"><div id='friendlistAttend'><div class='listTitle'>Friends Going</div><a href="/user/128987/"><img src="http://static.flickr.com/123/buddyicons/17194335@N00.jpg" class="avatar" height="45" width="45" border="1" /></a><span><a class="friendLink" id="user_128987" title="Watching since Sep 12, 2008 01:39 PM" href="http://upcoming.yahoo.com/user/128987/">reidab</a></span></div></div></div></div>
407
+ <div style="clear:both"></div>
408
+ <div id="userlist872418" class="userlist"><div style="clear:both"></div><div id="userlistContainer1"><div id="userlistContainer2"> <div id="userlistExpand">
409
+ <span id="userlistsummary" style="float:left"><strong style="color:#8F0000" property="upcoming:numAttendees">188 People </strong>saved this event. </span>
410
+ <a id="hide_attendees" href="javascript:void(0);" style="display:none;float:left" class="up-palette2 tab">Hide this<span class="userlistExpandTriangle up-palette2"></span></a>
411
+ <a id="expand_attendees" href="javascript:void(0);" style="display:none;float:left" class="up-palette2 tab">Show me</a>
412
+ <a id="placeholder_attendees" href="javascript:void(0);" style="float:left" class="tab">...</a>
413
+ <img id="userlistExpandBusy" src="/images/indicator.gif" border="0" style="visibility: hidden;"/>
414
+ </div><div id="userlistContents"><div id='userlistAttend'><div class='listTitle'>178 Going</div><div class='hideable'></div></div><div id='userlistWatch'><div class='listTitle'>40 Interested</div><div class='hideable'></div></div></div></div></div></div> <div style="clear: both;"></div>
415
+
416
+ </div> <!-- sidebarTop -->
417
+ </div> <!-- sidebarTopContainer -->
418
+
419
+
420
+ <div class="eventRelated">
421
+ <div class="inset" id="insetContent">
422
+ <div class="insetTitle">Other Events Like This</div>
423
+ <div class="insetBody">
424
+ <table>
425
+ <tr id="first">
426
+ <td width="70" valign="top" id="date">Mon, Nov 10</td>
427
+ <td><b><a href="/event/1168203/">The semi-un-not-so-official Wordpress Upgrade Part...</a></b></td>
428
+ </tr>
429
+ <tr>
430
+ <td width="70" valign="top" id="date">Tue, Nov 11</td>
431
+ <td><b><a href="/event/1304605/">Thrive - PDX</a></b></td>
432
+ </tr>
433
+ <tr>
434
+ <td width="70" valign="top" id="date">Wed, Nov 12</td>
435
+ <td><b><a href="/event/1107612/">Refresh Portland November: John Weiss on Changing ...</a></b></td>
436
+ </tr>
437
+ <tr>
438
+ <td width="70" valign="top" id="date">Fri, Nov 14</td>
439
+ <td><b><a href="/event/1268959/">Gettin' down in Old Town</a></b></td>
440
+ </tr>
441
+ <tr>
442
+ <td width="70" valign="top" id="date">Sat, Dec 6</td>
443
+ <td><b><a href="/event/1098808/">CyborgCamp 2008</a></b></td>
444
+ </tr>
445
+ <tr>
446
+ <td width="70" valign="top" id="date">Sat, Jan 17</td>
447
+ <td><b><a href="/event/1313754/">Masterbacon: A day for bacon lovers</a></b></td>
448
+ </tr>
449
+ </table>
450
+ </div>
451
+ </div>
452
+ </div>
453
+ <div class="venueRelated">
454
+ <div class="inset" id="insetContent">
455
+ <div class="insetTitle">
456
+ Also at Bagdad Theater and Pub </div><!-- end insetTitle -->
457
+ <div class="insetBody">
458
+ <table>
459
+ <tr id="first">
460
+ <td width="70" valign="top" id="date">Sat, Nov 8</td>
461
+ <td><b><a href="/event/1244001/">Coexist Comedy Tour</a></b></td>
462
+ </tr>
463
+ </table>
464
+ </div><!-- end insetBody -->
465
+ </div><!-- end insetContent -->
466
+ </div> <!-- end insetContainer -->
467
+
468
+ <div id="eventTags">
469
+ <div class="insetTitle">
470
+ Tags
471
+ </div><!-- end insetTitle -->
472
+ <div class="insetBody categories">
473
+ <div id="tag_list">
474
+ <a href="/tag/igniteportland/" rel="tag" class="category">igniteportland</a>
475
+ <br />
476
+ <a href="/tag/ignite/" rel="tag" class="category">ignite</a>
477
+ <br />
478
+ <a href="/tag/portland/" rel="tag" class="category">portland</a>
479
+ <br />
480
+ <a href="/tag/pdx/" rel="tag" class="category">pdx</a>
481
+ <br />
482
+ <a href="/tag/oregon/" rel="tag" class="category">oregon</a>
483
+ <br />
484
+ <a href="/tag/ip4/" rel="tag" class="category">ip4</a>
485
+ <br />
486
+ <a href="/tag/bagdad/" rel="tag" class="category">bagdad</a>
487
+ <br />
488
+ <a href="/tag/mcmennamins/" rel="tag" class="category">mcmennamins</a>
489
+ <br />
490
+ <a href="/tag/mcmenamins/" rel="tag" class="category">mcmenamins</a>
491
+ <br />
492
+ <a href="/tag/beer/" rel="tag" class="category">beer</a>
493
+ <br />
494
+ </div>
495
+ <div id="add_tag">
496
+ <a id="add_tag_link" href="javascript:void(0);"><b>Add a tag?</b></a>
497
+ <form id="add_tag_form" method="post" style="display:none;">
498
+ <input type="hidden" name="_ucrumb" value="9y7hUiSbKo1" />
499
+ <input id="add_tag_field" type="text" name="tag" value="" />
500
+ <input type="hidden" name="event_id" value="872418" />
501
+ <input id="add_tag_submit" type="submit" name="submit" value="Add Tag" />
502
+ <span id="add_tag_status_img" style="display:none;"><img src="http://l.yimg.com/ycs.upcoming.yahoo.com/images/indicator_03ce3dcc84af110e9da8699a841e5200.gif" border="0" /></span>
503
+ </form>
504
+ </div>
505
+ </div><!-- /.insetBody -->
506
+ </div> <!-- /#eventTags -->
507
+
508
+ <div id="eventGroups">
509
+ <div class="insetTitle">Related Groups</div>
510
+ <div class="insetBody">
511
+ <div><ul id="group_list"><a href="/group/3643/">appslab</a></li><li><a href="/group/3644/">Ignite Portland</a></li><li><a href="/group/4070/">Silicon Florist</a></li><li><a href="/group/4830/">Hazelnut Tech News</a></ul></div> <div id="send_to_group">
512
+ <a id="send_to_group_link" href="javascript:void(0);"><b>+ Send to group?</b></a>
513
+ <form id="send_to_group_form" method="post" style="display:none;">
514
+ <input type="hidden" name="_ucrumb" value="9y7hUiSbKo1" />
515
+ <input type="hidden" name="action" value="sendToGroup" />
516
+ <input type="hidden" name="event_id" value="872418" />
517
+ <select id="send_to_group_select" name="group_id" style="width: 120px;margin-top:4px;display:inline;">
518
+ <option id="null_option">Select Group:</option>
519
+ </select>
520
+ <span id="send_to_group_status_img" style="display:none;"><img src="http://l.yimg.com/ycs.upcoming.yahoo.com/images/indicator_03ce3dcc84af110e9da8699a841e5200.gif" border="0" /></span>
521
+
522
+ </form>
523
+
524
+ </div>
525
+ </div> <!-- /.insetBody -->
526
+ </div> <!-- /#eventGroups -->
527
+
528
+ </div> <!-- /#eventSidebar -->
529
+
530
+ <div id="hidden_event_id" style="visibility:hidden;">872418</div>
531
+
532
+ </div> <!-- /#event -->
533
+
534
+ <br style="clear: both">
535
+
536
+
537
+ <style type="text/css">
538
+ <!--
539
+ #performerFormContainer {
540
+ background-color: #f4f4f4;
541
+ padding: 10px 10px 10px 30px;
542
+ margin-top:15px;
543
+ width:898px;
544
+ }
545
+
546
+ #performerFormContainer .tblTitle {
547
+ font-size: 18px;
548
+ font-weight: bold;
549
+ }
550
+
551
+ -->
552
+ </style>
553
+ <div id="performerFormContainer" style="visibility:hidden">
554
+ <div class="tblTitle">Add a new performer</div>
555
+
556
+ <style type="text/css">
557
+ #performerFormDiv table td {
558
+ font-size: 12px;
559
+ padding: 5px;
560
+ }
561
+
562
+ #performerFormDiv .required {
563
+ color: #ad0b0a;
564
+ }
565
+
566
+ #performerFormDiv .optional {
567
+ color: #000000;
568
+ }
569
+
570
+ #performerFormDiv .questionTip {
571
+ font-size: 10px;
572
+ }
573
+
574
+ #performerFormDiv .fieldName {
575
+ width: 120px;
576
+ text-align: right;
577
+ vertical-align: top;
578
+ padding-top: 8px;
579
+ }
580
+
581
+ #performerFormDiv #performer_submit {
582
+ font-size: 16px;
583
+ }
584
+
585
+ #performerFormDiv tr#performer_submit td {
586
+ padding-top: 16px;
587
+ }
588
+
589
+ #performerFormDiv .longwidth {
590
+ width: 360px;
591
+ }
592
+
593
+ #performerFormDiv .shortwidth {
594
+ width: 240px;
595
+ }
596
+
597
+
598
+
599
+
600
+ -->
601
+ </style>
602
+
603
+ <noscript>
604
+ <div class="hi-visibility">
605
+ <p>Editing or adding a performer in this way requires Javascript. Please turn scripting on in your browser.</p>
606
+
607
+ <p>Or, you can try the <a href="/edit/performer/">non-Javascript edit performer form</a>.</p>
608
+
609
+ <p>If neither of these are a viable option for you, please <a href="/contact">contact us</a>.</p>
610
+ </div>
611
+ </noscript>
612
+
613
+ <div id="performerFormDiv" class="bd">
614
+
615
+ <div id="performerFormErrorDiv" class="error" style="visibility:hidden"></div>
616
+ <div id="performerFormDuplicateDiv" class="dupe" style="visibility:hidden"></div>
617
+
618
+ <!-- method="post" action="#" -->
619
+ <form id="performerForm"
620
+ onsubmit="" >
621
+ <input type="hidden" name="_ucrumb" value="9y7hUiSbKo1" />
622
+ <input type="hidden" name="mode" value="add" />
623
+ <input type="hidden" name="force" id="forcePerformerElement" value="0" />
624
+
625
+
626
+ <table cellspacing="0" cellpadding="10" border="0">
627
+ <tr>
628
+ <td class="fieldName required">Performer name</td>
629
+ <td><input id="performerForm.name" class="longwidth" type="text" name="name" value="" size="60" /></td>
630
+ </tr>
631
+ <tr>
632
+
633
+ <tr>
634
+ <td colspan="2">
635
+ <span class="tblTitle">More details</span> (optional, but nice)
636
+ </td>
637
+ </tr>
638
+ <tr>
639
+ <td class="fieldName optional">Performer homepage</td>
640
+ <td><input id="performerForm.url" type="text" name="url" value="http://" class="longwidth" size="60" /></td>
641
+ </tr>
642
+ <tr>
643
+ <td class="fieldName optional">Short description</td>
644
+ <td>
645
+ <textarea class="longwidth" id="performerForm.description" name="description" rows="5" cols="50"></textarea>
646
+ </td>
647
+ </tr>
648
+ <tr>
649
+ <tr id="performer_submit">
650
+ <td class="fieldName"></td>
651
+ <td>
652
+ <input id="performer_submit" type="submit" name="submit" value="Submit" class="submit" />
653
+ <span id="performerFormProgressArea" style="visibility:hidden;"><img src="/images/indicator.gif" border="0" /></span>
654
+
655
+ </td>
656
+ </tr>
657
+ </table>
658
+ </form>
659
+ </div><!-- end class="bd" -->
660
+
661
+ <div id="performerDupeCheckContainer" style="visibility: hidden">
662
+ <div class="hd">Hmm...</div>
663
+ <div class="bd">
664
+ <form method="post" name="dlgForm_performerDupeForm" id="performerDupeForm" action="/ajax/select.performer.php" onsubmit="">
665
+ <input type="hidden" name="type" value="performer" />
666
+ <div class="">We might have that performer already. Help us keep our database clean by looking to see if it's already here!</div>
667
+ <table border="0" id="performer_dupe_check_table">
668
+ <tr>
669
+ <td colspan="2">(Please select one)</td>
670
+ </tr>
671
+ <tr id="use_my_performer_tr">
672
+ <td><input id="use_my_performer" name="use_performer" type="radio" checked="checked" value="mine" /></td>
673
+ <td><label for="use_my_performer">Please just use the one I entered.</label></td>
674
+ </tr>
675
+ </table>
676
+ </form>
677
+ </div>
678
+ <div class="ft"></div>
679
+ </div>
680
+
681
+ </div><!-- end id="performerFormContainer" -->
682
+
683
+
684
+
685
+ </div> <!-- End vCalendar -->
686
+
687
+ <form onsubmit="javascript: return false;">
688
+ <input type="hidden" id="_cmb" name="_cmb" value="9y7hUiSbKo1" />
689
+ </form>
690
+ <div class="up-clearb"></div>
691
+ </div> <dl id="up-ft">
692
+ <dt>Me</dt>
693
+ <dd>
694
+ <a href="/myevents/">My Events</a> |
695
+ <a href="/history/myevents/">My Scrapbook</a> |
696
+ <a href="/friend/event/">My Friend's Events</a> |
697
+ <a href="/activity/">What's New For You</a> |
698
+ <a href="/user/122240">My Account</a>
699
+ </dd>
700
+ <dt>Tools</dt>
701
+ <dd>
702
+ <a href="/badge/">Upcoming Badges for Your Blog/Website</a> |
703
+ <a href="/site_invite/">Invite Friends</a> |
704
+ <a href="/group/">Groups</a> |
705
+ <a href="/services/api/">Developers API</a>
706
+ </dd>
707
+ <dt>Help</dt>
708
+ <dd>
709
+ <a href="/news/">News Blog</a> |
710
+ <a href="/help/guidelines/">Community Guidelines</a> |
711
+ <a href="/help/faq/;_ylt=AnJp1N2sKwVEPEMhmQyi0PfPa80F">FAQ</a> |
712
+ <a href="/contact/">Contact Us</a> |
713
+ <a href="http://suggestions.yahoo.com/?prop=upcoming">Suggestion Board</a>
714
+ </dd>
715
+ <dt class="up-ft-copyright">Copyright &copy; 2008 Yahoo! Inc. All rights reserved.</dt>
716
+ <dd class="up-ft-copyright">
717
+ - <a href="http://docs.yahoo.com/info/copyright/copyright.html">Copyright/IP Policy</a> -
718
+ <a href="http://docs.yahoo.com/info/terms/">Terms of Service</a> -
719
+ <a href="http://privacy.yahoo.com/privacy/us/upcoming/">Privacy Policy</a>
720
+ </dd>
721
+ </dl>
722
+ </div> <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/utilities/utilities.js"></script>
723
+ <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/autocomplete/autocomplete-min.js"></script>
724
+ <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/calendar/calendar-min.js"></script>
725
+ <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/container/container-min.js"></script>
726
+ <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/menu/menu-min.js"></script>
727
+ <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/tabview/tabview-min.js"></script>
728
+ <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/cookie/cookie-beta-min.js"></script>
729
+ <script type="text/javascript" src="http://l.yimg.com/ycs.upcoming.yahoo.com/js/footer.minify_2352565f31dc0a2ca20212dcbdd19346.js"></script><script type="text/javascript" src="http://l.yimg.com/ycs.upcoming.yahoo.com/js/util_af84434aa3d1226ce8474811971a2ac2.js"></script><script type="text/javascript" src="http://l.yimg.com/ycs.upcoming.yahoo.com/js/performerForm_164c0e8cf4af9c00898a700b46b7a04d.js"></script><script type="text/javascript" src="http://l.yimg.com/ycs.upcoming.yahoo.com/js/performerSearchAdd_8371b2fb52cd6c7086e98ab7ecb1bc0d.js"></script><script type="text/javascript" src="http://l.yimg.com/ycs.upcoming.yahoo.com/js/event_page_5670718ff6635d0ed61cc53084b69215.js"></script><script type="text/javascript">YAHOO.up.hd.search.ghostText.setPlainLocation("Portland, Oregon 97214");</script><script type="text/javascript"><!--
730
+ var AW = new AttendWidgetEventPage(872418,null,'attend',0,1,1,0,0,10,'attendWidget872418','9y7hUiSbKo1');
731
+ -->
732
+ </script> <script type="text/javascript" src="http://us.js2.yimg.com/us.js.yimg.com/lib/rt/rto1_78.js"></script><script>var rt_page="97348559:FRTMA"; var rt_ip="24.22.40.60"; if ("function" == typeof(rt_AddVar) ){ rt_AddVar("ys", escape("8C3C8862"));}</script><noscript><img src="http://rtb.pclick.yahoo.com/images/nojs.gif?p=97348559:FRTMA"></noscript><script language=javascript>
733
+ if(window.yzq_d==null)window.yzq_d=new Object();
734
+ window.yzq_d['wupfBtGDJGc-']='&U=13g8m1clq%2fN%3dwupfBtGDJGc-%2fC%3d289534.10399734.11039816.10073328%2fD%3dFOOT%2fB%3d4466047%2fV%3d1';
735
+ </script><noscript><img width=1 height=1 alt="" src="http://us.bc.yahoo.com/b?P=19z8lmKIPI9hPwLmQI9UsADCGBYoPEkU4eoAAwSE&T=1421v78od%2fX%3d1226105322%2fE%3d97348559%2fR%3dupcoming%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO%2fF%3d2774767440%2fQ%3d-1%2fS%3d1%2fJ%3d8C3C8862&U=13g8m1clq%2fN%3dwupfBtGDJGc-%2fC%3d289534.10399734.11039816.10073328%2fD%3dFOOT%2fB%3d4466047%2fV%3d1"></noscript><!-- SpaceID=97348559 loc=FSRVY noad -->
736
+ <script language=javascript>
737
+ if(window.yzq_d==null)window.yzq_d=new Object();
738
+ window.yzq_d['w.pfBtGDJGc-']='&U=12dpsirkq%2fN%3dw.pfBtGDJGc-%2fC%3d-1%2fD%3dFSRVY%2fB%3d-1%2fV%3d0';
739
+ </script><noscript><img width=1 height=1 alt="" src="http://us.bc.yahoo.com/b?P=19z8lmKIPI9hPwLmQI9UsADCGBYoPEkU4eoAAwSE&T=142ri2fkb%2fX%3d1226105322%2fE%3d97348559%2fR%3dupcoming%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO%2fF%3d3051359096%2fQ%3d-1%2fS%3d1%2fJ%3d8C3C8862&U=12dpsirkq%2fN%3dw.pfBtGDJGc-%2fC%3d-1%2fD%3dFSRVY%2fB%3d-1%2fV%3d0"></noscript> </body>
740
+ </html>
741
+
742
+ <!-- spaceid = -->
743
+ <script language=javascript>
744
+ if(window.yzq_p==null)document.write("<scr"+"ipt language=javascript src=http://l.yimg.com/us.js.yimg.com/lib/bc/bc_2.0.4.js></scr"+"ipt>");
745
+ </script><script language=javascript>
746
+ if(window.yzq_p)yzq_p('P=19z8lmKIPI9hPwLmQI9UsADCGBYoPEkU4eoAAwSE&T=13tog0po0%2fX%3d1226105322%2fE%3d97348559%2fR%3dupcoming%2fK%3d5%2fV%3d1.1%2fW%3dJ%2fY%3dYAHOO%2fF%3d3580004441%2fS%3d1%2fJ%3d8C3C8862');
747
+ if(window.yzq_s)yzq_s();
748
+ </script><noscript><img width=1 height=1 alt="" src="http://us.bc.yahoo.com/b?P=19z8lmKIPI9hPwLmQI9UsADCGBYoPEkU4eoAAwSE&T=142ea5nmh%2fX%3d1226105322%2fE%3d97348559%2fR%3dupcoming%2fK%3d5%2fV%3d3.1%2fW%3dJ%2fY%3dYAHOO%2fF%3d2500851373%2fQ%3d-1%2fS%3d1%2fJ%3d8C3C8862"></noscript>
749
+ <!-- w2.up.sp1.yahoo.com compressed/chunked Fri Nov 7 16:48:42 PST 2008 -->