calagator 0.0.1.pre1

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 (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 -->