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,685 @@
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 5 at Bagdad Theater and Pub (Thursday February 19, 2009) - 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 5 at Bagdad Theater and Pub (Thursday February 19, 2009)">
17
+ <meta name="keywords" content="upcoming Ignite Portland 5 at Bagdad Theater and Pub (Thursday February 19, 2009)">
18
+ <meta http-equiv="X-UA-Compatible" content="IE=7"/>
19
+ <meta name="verify-v1" content="S6riHTy4aqQhYzxbTmxrbL229QqGndjohgo6wDpIuao=" />
20
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.1/build/reset-fonts-grids/reset-fonts-grids.css" />
21
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.1/build/autocomplete/assets/skins/sam/autocomplete.css" />
22
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.1/build/calendar/assets/skins/sam/calendar.css" />
23
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.1/build/container/assets/skins/sam/container.css" />
24
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.1/build/menu/assets/skins/sam/menu.css" />
25
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.1/build/tabview/assets/skins/sam/tabview.css" />
26
+ <link rel="stylesheet" type="text/css" href="http://l.yimg.com/ycs.upcoming.yahoo.com/css/default_e8018f768ea8b5a945ea3fc866914e23.css" /><link rel="stylesheet" type="text/css" href="http://l.yimg.com/ycs.upcoming.yahoo.com/css/base_eaec10ba83c4e113647c44da65980800.css" /><link rel="stylesheet" type="text/css" href="http://l.yimg.com/ycs.upcoming.yahoo.com/css/home_cf683e509ad1ef1a154c2f58c6602d92.css" /> </head>
27
+ <body>
28
+ <div id="doc4">
29
+ <div id="up-hd">
30
+ <div id="up-hd-user-websearch">
31
+ <div id="up-hd-user">
32
+ <span>
33
+ Welcome, <a href="/user/122240/">igal</a>
34
+ <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>
35
+ <a href="/logout/">Sign Out</a> |
36
+ <a href="/user/122240/">My Account</a> |
37
+ <a href="/help/">Help</a>
38
+ </div> <div id="up-hd-websearch">
39
+ <form id="up-hd-websearch-form" action="http://search.yahoo.com/search">
40
+ <div class="up-inline">
41
+ <label for="up-hd-websearch-q">Web search query term</label>
42
+ <input id="up-hd-websearch-q" name="p" type="text">
43
+ <button id="up-hd-websearch-button-go" class="up-palette2">Web Search</button>
44
+ </div>
45
+ </form>
46
+ </div> </div> <div id="up-hd-logo-search-nav" class="up-palette1">
47
+ <div id="up-hd-search">
48
+ <a id="up-hd-search-logo" class="up-palette1" href="/">Upcoming</a>
49
+ <form id="up-hd-search-form" action="/search/">
50
+ <input type="hidden" id="up-hd-search-action-type" name="type" value="events">
51
+ <input type="hidden" id="up-hd-search-radius-toggle" name="rt" value="1">
52
+
53
+ <span id="search-form-body">
54
+ <label for="up-hd-search-query">Search <span id="up-hd-search-query-label">Events</span></label>
55
+ <input id="up-hd-search-query" class="up-palette1 up-hd-search-query-notwide" name="q" type="text" value=""/>
56
+ <label for="up-hd-search-location" id="up-hd-search-location-label">City, State or Zip</label>
57
+ <input id="up-hd-search-location" class="up-palette1 up-hd-search-query-notwide " name="loc" type="text" value="San Francisco Bay Area" />
58
+ <div id="up-hd-search-buttons">
59
+ <button id="up-hd-search-button-go" class="up-palette1">Search <span id="up-hd-search-button-label">Events</span></button>
60
+ <button id="up-hd-search-button-change" class="up-palette1">Change Search Type</button>
61
+ </div>
62
+ <div id="up-hd-search-change" class="yuimenu">
63
+ <div class="bd">
64
+ <ul class="first-of-type">
65
+ <li class="yuimenuitem"><a class="yuimenuitemlabel up-palette2 up-hd-search-change-current" title="events" href="/event/">Events</a></li>
66
+ <li class="yuimenuitem"><a class="yuimenuitemlabel up-palette2 " title="venues" href="/venue/">Venues</a></li>
67
+ <!-- <li class="yuimenuitem"><a class="yuimenuitemlabel up-palette2 " title="performers" href="/performer/">Performers</a></li> -->
68
+ <li class="yuimenuitem"><a class="yuimenuitemlabel up-palette2 " title="users" href="/friend/">Upcoming Users</a></li>
69
+ </ul>
70
+ </div>
71
+ </div>
72
+ </span>
73
+ </form>
74
+ </div> <ul id="up-hd-nav">
75
+ <li id="home"><a id="up-hd-nav-home" href="/">Home</a></li>
76
+ <li id="events">
77
+ <a href="/myevents/" id="up-hd-nav-events-link" class="up-hd-nav-menu-link">My Events</a>
78
+ <a href="/myevents/" id="up-hd-nav-events" class="up-hd-nav-menubtn up-palette2">More Events Links</a>
79
+ <div class="up-hd-nav-menu-container">
80
+ <div id="up-hd-nav-events-menu" class="yuimenu">
81
+ <div class="bd">
82
+ <ul class="first-of-type">
83
+ <li class="yuimenuitem"><a href="/myevents/">My Events</a></li>
84
+ <li class="yuimenuitem"><a href="/friend/">My Friends</a></li>
85
+ <li class="yuimenuitem"><a href="/user/122240/">My Account</a></li>
86
+ <li class="yuimenuitem"><a href="/group/">My Groups</a></li>
87
+ <li class="yuimenuitem"><a href="/history/myevents/">My Scrapbook</a></li>
88
+ <li class="yuimenuitem"><a href="/activity/">What's New For You</a></li>
89
+ </ul>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </li>
94
+ <li id="friends">
95
+ <a href="/friend/" id="up-hd-nav-friends-link" class="up-hd-nav-menu-link">Friends</a>
96
+ <a href="/friend/" id="up-hd-nav-friends" class="up-hd-nav-menubtn up-palette2">More Friends Links</a>
97
+ <div class="up-hd-nav-menu-container">
98
+ <div id="up-hd-nav-friends-menu" class="yuimenu">
99
+ <div class="bd">
100
+ <ul class="first-of-type">
101
+ <li class="yuimenuitem"><a href="/friend/event/">Friends' Events</a></li>
102
+ <li class="yuimenuitem"><a href="/friend/">Friends List</a></li>
103
+ <li class="yuimenuitem"><a href="/site_invite/">Invite Friends</a></li>
104
+ </ul>
105
+ </div>
106
+ </div>
107
+ </div>
108
+ </li>
109
+ <li id="more">
110
+ <a href="/more/" id="up-hd-nav-more-link" class="up-hd-nav-menu-link">More</a>
111
+ <a href="/more/" id="up-hd-nav-more" class="up-hd-nav-menubtn up-palette2">More Helpful Links</a>
112
+ <div class="up-hd-nav-menu-container">
113
+ <div id="up-hd-nav-more-menu" class="yuimenu">
114
+ <div class="bd">
115
+ <ul class="first-of-type">
116
+ <li class="yuimenuitem"><a href="/group/">Groups</a></li>
117
+ <li class="yuimenuitem"><a href="/place/">Places</a></li>
118
+ <li class="yuimenuitem"><a href="/news/">News Blog</a></li>
119
+ <li class="yuimenuitem"><a href="/badge/">Upcoming Badges</a></li>
120
+ <li class="yuimenuitem"><a href="/services/api/">Developers API</a></li>
121
+ <li class="yuimenuitem"><a href="http://suggestions.yahoo.com/?prop=upcoming">Suggestion Board</a></li>
122
+ </ul>
123
+ </div>
124
+ </div>
125
+ </div>
126
+ </li>
127
+ <li id="add"><a id="up-hd-nav-add" class="up-palette2" href="/event/add/">Add An Event</a></li>
128
+ <li id="up-hd-nav-logo-container"><a id="up-hd-nav-logo" class="up-palette1" href="http://www.yahoo.com/">Yahoo!</a></li>
129
+ </ul> </div> </div> <div id="up-bd">
130
+
131
+
132
+ <div id="calendarContainer" class="vcalendar"> <!-- Begin vCalendar -->
133
+
134
+
135
+
136
+ <div id="event" class="vevent" about="#event" typeof="cal:Vevent">
137
+
138
+ <h1>
139
+ <div class="name summary" property="cal:summary">
140
+ Ignite Portland 5 </div>
141
+ </h1>
142
+ <div id="up-detail-tabs">
143
+ <ul>
144
+ <li class="selected"><div class="body">DETAILS &amp; PHOTOS</div></li>
145
+ <li><div class="body"><span class="map-icon">&nbsp;</span><a href="/maps/1363102">MAPS & WHAT'S NEARBY</a></div></li>
146
+ </ul>
147
+ </div>
148
+
149
+
150
+ <div id="eventMain">
151
+ <div id="add_photo_container" class="clicker_menu">
152
+ <a href="/event/1363102/" id="add_photo_close_link">(close)</a>
153
+ <ul>
154
+ <li>
155
+ <form method="post" action="/photos/upload/1363102/" enctype="multipart/form-data">
156
+ <label for="image">Select photo file to upload:</label>
157
+ <input type="file" id="image" name="image" />
158
+ <label for="caption">Add a title:</label>
159
+ <input type="text" id="caption" name="caption" maxlength="200" />
160
+ <input id="up-evt-photoup-btn" type="submit" value="Upload Photo" />
161
+ </form>
162
+ </li>
163
+ <li id="up-evt-photoup-flickr">
164
+ <p>Add Photos from <span class="up-flickr-logo">Flick<strong>r</strong></span></p>
165
+ <label for="up-evt-photoup-flickr-tag">Tag a public <a rel="nofollow" href="http://flickr.com/">Flickr</a> photo with:</label>
166
+ <input type="text" id="up-evt-photoup-flickr-tag" onFocus="this.select();" value="upcoming:event=1363102" />
167
+ <p id="up-evt-photoup-flickr-note">Your photos will appear on this event page automagically in a little while!</p>
168
+ </li>
169
+ </ul>
170
+ <a name="add_photo_anchor" id="add_photo_anchor"></a>
171
+ </div>
172
+ <div id="eventMetadata">
173
+ <div class="additionalInfo">
174
+
175
+ <div id="phototitle" class="phototext" style="visibility:hidden;display:none">Event Photos</div>
176
+ <div id="addphotos">
177
+ Have a photo?
178
+ <a id="add_photo_link" name="add_photo_link" href="/event/1363102">Add it here</a>
179
+ </div>
180
+ <div id="eventPhotos">
181
+ <div id="photo_container"></div>
182
+
183
+ <div class="photolink">
184
+ <span class="small" id="photos_loading_msg">
185
+ <div id="photolink_see">
186
+ <a href="/photos/event/1363102" id="photos_see_all_link">loading...</a>
187
+ </div>
188
+ <div id="photolink_add">
189
+ <a id="add_photo_link2" name="add_photo_link2" href="/event/1363102">Add Photos</a>
190
+ </div>
191
+ </span>
192
+ </div>
193
+ </div>
194
+
195
+
196
+
197
+
198
+
199
+ </div>
200
+ <!-- toolbar - top -->
201
+
202
+ <ul id="event-toolbar">
203
+ <li> <div id="addToCalendar_1363102_" class="export_button ">
204
+ <a rel="upcoming:addToCalendar" href="/event/1363102/export">Add to calendar</a>
205
+ </div></li>
206
+ <li><a id="invite" rel="upcoming:inviteFriends" href="/tools/invite/1363102">Invite Friends</a></li>
207
+ <li><a id="print" href="javascript:void(0)" onclick="window.print()">Print</a></li>
208
+ </ul>
209
+
210
+ <!-- end of toolbar -top -->
211
+
212
+ <div class="datetime">
213
+ <abbr class="dtstart" property="cal:dtstart" content="2009-02-19" title="20090219T190000">
214
+ Thursday February 19, 2009 </abbr>
215
+ at
216
+ 7:00pm </div> <!-- /.time -->
217
+
218
+ <div class="venue location vcard" class="vcard" about="#venue">
219
+ <span class="fn org"><a rel="vcard:url" property="vcard:fn" href="/venue/61559/">Bagdad Theater and Pub</a></span><br />
220
+ <div class="address adr" rel="vcard:adr"><div typeof="vcard:Address">
221
+ <span class="street-address" property="vcard:street-address">3702 S.E. Hawthorne Blvd</span><br />
222
+ <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>
223
+ </div></div>
224
+
225
+ </div> <!-- /.venue -->
226
+
227
+ <div class="small">Category:
228
+ <span id="category">Social</span>
229
+ </div>
230
+ <div class="small">Website: <a rel="nofollow" href="http://www.igniteportland.com" class="url">http://www.igniteportland.com</a></div>
231
+
232
+
233
+ <div class="description"></div>
234
+ Save the date! Ignite Portland 5 will happen on Thursday, February 19, 2009, at the Bagdad Theater. Stay tuned to <a rel="nofollow" href="http://www.igniteportland.com/">http://www.igniteportland.com/</a> for more details, and submit YOUR talk idea now!<br />
235
+
236
+
237
+
238
+
239
+
240
+
241
+ &nbsp;
242
+ <div class="clearb"></div>
243
+ <div class="bylineReport">
244
+ <div class="byline">
245
+ Added by
246
+
247
+ <a href="/user/21062/"><img src="http://static.flickr.com/8/buddyicons/44124452748@N01.jpg" height="12" width="12" border="0" /></a>
248
+ <span><a class="" id="user_21062" title="" href="http://upcoming.yahoo.com/user/21062/">jabancroft</a></span>
249
+ on November 13, 2008 <span id="event-toolbar"><a id="report" href="/flag/event/1363102">Report a problem </a></span>
250
+
251
+ </div>
252
+ <div style="height: 0px; clear: both;"></div>
253
+
254
+ </div>
255
+ </div>
256
+
257
+
258
+
259
+
260
+
261
+ <table class="mediatable">
262
+ <tr>
263
+
264
+ </tr>
265
+ </table>
266
+
267
+ <!-- /#eventMetadata -->
268
+
269
+ <div id="eventComments">
270
+
271
+ <div class="event-heading">Comments</div>
272
+ <div id="event-addcomments">
273
+ <form method="post" action="/add/comment/">
274
+ <input type="hidden" name="_ucrumb" value="WQqdM22/soy" />
275
+ <div class="heading">Add a comment:</div>
276
+ <textarea name="comment" id="comment" rows="5" cols="80" class="smarttext"></textarea>
277
+ <p id="comment-limit" title="4000" style="font-size: 10px; float: right;">Limit 4000 characters.</p>
278
+
279
+ <input type="hidden" name="event_id" value="1363102" />
280
+ <input type="submit" name="submit" class="button blue-button" value="Post Comment" />
281
+ </form>
282
+ </div><!-- end addcomments -->
283
+
284
+ </div> <!-- /#eventComments -->
285
+
286
+ </div> <!-- /#eventMain -->
287
+
288
+
289
+ <!--
290
+
291
+ ##########################################################################
292
+ Sidebar
293
+ ##########################################################################
294
+
295
+ -->
296
+
297
+
298
+ <div id="eventSidebar">
299
+
300
+
301
+ <div id="sidebarTopContainer">
302
+ <div id="sidebarTop">
303
+
304
+
305
+ <div id="attendWidget1363102" class="attendWidget">
306
+ <div id="watchlistCta" class="eventSidebarTitle" style="float: left;">
307
+ Let the community know:
308
+ </div>
309
+ <span class="undo"><a class="undo" href="javascript:void(0)">(undo)</a></span>
310
+ <div style="clear: both;"></div>
311
+
312
+ <div class="watchlistStatuses"> <form id="watchlistForm" onSubmit="return false;" method="GET" action="/watchlist">
313
+ <table>
314
+ <td class="buttonContainer">
315
+ <span id="attendButton" class="normal">
316
+ <div class="container">
317
+ <div class="front">
318
+ <div class="face">
319
+ <button name="status" value="attend" >
320
+ <div class="check">I'm Going</div>
321
+ <div class="busynotice">Saving to My Events</div>
322
+ </button>
323
+ </div>
324
+ </div>
325
+ <div class="back"></div>
326
+ </div>
327
+ </span>
328
+ </td>
329
+ <td>or</td>
330
+ <td class="buttonContainer">
331
+ <span id="watchButton" class="normal">
332
+ <div class="container">
333
+ <div class="front">
334
+ <div class="face">
335
+ <button name="status" value="watch">
336
+ <div class="check">I'm Interested</div>
337
+ <div class="busynotice">Saving to My Events</div>
338
+ </button>
339
+ </div>
340
+ </div>
341
+ <div class="back"></div>
342
+ </div>
343
+ </span>
344
+ </td>
345
+ </table>
346
+ <input type="hidden" name="redirect" value="/event/1363102"/>
347
+ <input type="hidden" name="event_id" value="1363102"/>
348
+ <input type="hidden" name="_ucrumb" value=""/>
349
+ </form>
350
+ </div>
351
+
352
+ <div style="clear: both;"></div>
353
+
354
+ <div class="guestCount" style="display:none">
355
+ <form id="attendWidget1363102.guestForm" method="POST" action="/watchlist/index.php">
356
+ <input type="hidden" name="_ucrumb" value="WQqdM22/soy" />
357
+ <input type="hidden" name="event_id" value="1363102" />
358
+
359
+ Bring Some Friends?:
360
+ <select name="num_guests"><option value="0" selected>0</option>
361
+ </select>
362
+
363
+ <noscript>
364
+ <input type="submit" value="Change"/>
365
+ </noscript>
366
+
367
+ </form>
368
+ </div>
369
+ </div>
370
+
371
+
372
+ <div id="friendlist1363102" 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 Dec 8, 2008 03:17 AM" href="http://upcoming.yahoo.com/user/128987/">reidab</a></span></div></div></div></div>
373
+ <div style="clear:both"></div>
374
+ <div id="userlist1363102" class="userlist"><div style="clear:both"></div><div id="userlistContainer1"><div id="userlistContainer2"> <div id="userlistExpand">
375
+ <span id="userlistsummary" style="float:left"><strong style="color:#8F0000" property="upcoming:numAttendees">38 People </strong>saved this event. </span>
376
+ <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>
377
+ <a id="expand_attendees" href="javascript:void(0);" style="display:none;float:left" class="up-palette2 tab">Show me</a>
378
+ <a id="placeholder_attendees" href="javascript:void(0);" style="float:left" class="tab">...</a>
379
+ <img id="userlistExpandBusy" src="/images/indicator.gif" border="0" style="visibility: hidden;"/>
380
+ </div><div id="userlistContents"><div id='userlistAttend'><div class='listTitle'>25 Going</div><div class='hideable'></div></div><div id='userlistWatch'><div class='listTitle'>13 Interested</div><div class='hideable'></div></div></div></div></div></div> <div style="clear: both;"></div>
381
+
382
+ </div> <!-- sidebarTop -->
383
+ </div> <!-- sidebarTopContainer -->
384
+
385
+
386
+ <div class="eventRelated">
387
+ <div class="inset" id="insetContent">
388
+ <div class="insetTitle">Other Events Like This</div>
389
+ <div class="insetBody">
390
+ <table>
391
+ <tr id="first">
392
+ <td width="70" valign="top" id="date">Tue, Dec 9</td>
393
+ <td><b><a href="/event/1369765/">Winter Coders' Social II</a></b></td>
394
+ </tr>
395
+ <tr>
396
+ <td width="70" valign="top" id="date">Wed, Dec 10</td>
397
+ <td><b><a href="/event/1384481/">ThrivePDX</a></b></td>
398
+ </tr>
399
+ <tr>
400
+ <td width="70" valign="top" id="date">Thu, Dec 11</td>
401
+ <td><b><a href="/event/1274705/">CubeSpace Holiday Party</a></b></td>
402
+ </tr>
403
+ <tr>
404
+ <td width="70" valign="top" id="date">Wed, Jan 7</td>
405
+ <td><b><a href="/event/1406483/">Demolicious! - Portland Web Innovators</a></b></td>
406
+ </tr>
407
+ <tr>
408
+ <td width="70" valign="top" id="date">Sat, Jan 17</td>
409
+ <td><b><a href="/event/1313754/">Masterbacon: A day for bacon lovers</a></b></td>
410
+ </tr>
411
+ <tr>
412
+ <td width="70" valign="top" id="date">Wed, Feb 11</td>
413
+ <td><b><a href="/event/1326795/">Lunch 2.0 at AboutUs</a></b></td>
414
+ </tr>
415
+ </table>
416
+ </div>
417
+ </div>
418
+ </div>
419
+
420
+ <div id="eventTags">
421
+ <div class="insetTitle">
422
+ Tags
423
+ </div><!-- end insetTitle -->
424
+ <div class="insetBody categories">
425
+ <div id="tag_list">
426
+ <a href="/tag/pdx/" rel="tag" class="category">pdx</a>
427
+ <br />
428
+ <a href="/tag/ignite/" rel="tag" class="category">ignite</a>
429
+ <br />
430
+ <a href="/tag/igniteportland/" rel="tag" class="category">igniteportland</a>
431
+ <br />
432
+ <a href="/tag/oregon/" rel="tag" class="category">oregon</a>
433
+ <br />
434
+ <a href="/tag/portland/" rel="tag" class="category">portland</a>
435
+ <br />
436
+ <a href="/tag/ip5/" rel="tag" class="category">ip5</a>
437
+ <br />
438
+ <a href="/tag/mcmenamins/" rel="tag" class="category">mcmenamins</a>
439
+ <br />
440
+ </div>
441
+ <div id="add_tag">
442
+ <a id="add_tag_link" href="javascript:void(0);"><b>Add a tag?</b></a>
443
+ <form id="add_tag_form" method="post" style="display:none;">
444
+ <input type="hidden" name="_ucrumb" value="WQqdM22/soy" />
445
+ <input id="add_tag_field" type="text" name="tag" value="" />
446
+ <input type="hidden" name="event_id" value="1363102" />
447
+ <input id="add_tag_submit" type="submit" name="submit" value="Add Tag" />
448
+ <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>
449
+ </form>
450
+ </div>
451
+ </div><!-- /.insetBody -->
452
+ </div> <!-- /#eventTags -->
453
+
454
+ <div id="eventGroups">
455
+ <div class="insetTitle">Related Groups</div>
456
+ <div class="insetBody">
457
+ <div><ul id="group_list"><a href="/group/4025/">Legion Of Tech</a></ul></div> <div id="send_to_group">
458
+ <a id="send_to_group_link" href="javascript:void(0);"><b>+ Send to group?</b></a>
459
+ <form id="send_to_group_form" method="post" style="display:none;">
460
+ <input type="hidden" name="_ucrumb" value="WQqdM22/soy" />
461
+ <input type="hidden" name="action" value="sendToGroup" />
462
+ <input type="hidden" name="event_id" value="1363102" />
463
+ <select id="send_to_group_select" name="group_id" style="width: 120px;margin-top:4px;display:inline;">
464
+ <option id="null_option">Select Group:</option>
465
+ </select>
466
+ <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>
467
+
468
+ </form>
469
+
470
+ </div>
471
+ </div> <!-- /.insetBody -->
472
+ </div> <!-- /#eventGroups -->
473
+
474
+ </div> <!-- /#eventSidebar -->
475
+
476
+ <div id="hidden_event_id" style="visibility:hidden;">1363102</div>
477
+
478
+ </div> <!-- /#event -->
479
+
480
+ <br style="clear: both">
481
+
482
+
483
+ <style type="text/css">
484
+ <!--
485
+ #performerFormContainer {
486
+ background-color: #f4f4f4;
487
+ padding: 10px 10px 10px 30px;
488
+ margin-top:15px;
489
+ width:898px;
490
+ }
491
+
492
+ #performerFormContainer .tblTitle {
493
+ font-size: 18px;
494
+ font-weight: bold;
495
+ }
496
+
497
+ -->
498
+ </style>
499
+ <div id="performerFormContainer" style="visibility:hidden">
500
+ <div class="tblTitle">Add a new performer</div>
501
+
502
+ <style type="text/css">
503
+ #performerFormDiv table td {
504
+ font-size: 12px;
505
+ padding: 5px;
506
+ }
507
+
508
+ #performerFormDiv .required {
509
+ color: #ad0b0a;
510
+ }
511
+
512
+ #performerFormDiv .optional {
513
+ color: #000000;
514
+ }
515
+
516
+ #performerFormDiv .questionTip {
517
+ font-size: 10px;
518
+ }
519
+
520
+ #performerFormDiv .fieldName {
521
+ width: 120px;
522
+ text-align: right;
523
+ vertical-align: top;
524
+ padding-top: 8px;
525
+ }
526
+
527
+ #performerFormDiv #performer_submit {
528
+ font-size: 16px;
529
+ }
530
+
531
+ #performerFormDiv tr#performer_submit td {
532
+ padding-top: 16px;
533
+ }
534
+
535
+ #performerFormDiv .longwidth {
536
+ width: 360px;
537
+ }
538
+
539
+ #performerFormDiv .shortwidth {
540
+ width: 240px;
541
+ }
542
+
543
+
544
+
545
+
546
+ -->
547
+ </style>
548
+
549
+
550
+ <div id="performerFormDiv" class="bd">
551
+
552
+ <div id="performerFormErrorDiv" class="error" style="visibility:hidden"></div>
553
+ <div id="performerFormDuplicateDiv" class="dupe" style="visibility:hidden"></div>
554
+
555
+ <!-- method="post" action="#" -->
556
+ <form id="performerForm" onsubmit="">
557
+ <input type="hidden" name="_ucrumb" value="WQqdM22/soy" />
558
+ <input type="hidden" name="mode" value="add" />
559
+ <input type="hidden" name="force" id="forcePerformerElement" value="0" />
560
+
561
+
562
+ <table cellspacing="0" cellpadding="10" border="0">
563
+ <tr>
564
+ <td class="fieldName required">Performer name</td>
565
+ <td><input id="performerForm.name" class="longwidth" type="text" name="name" value="" size="60" /></td>
566
+ </tr>
567
+ <tr>
568
+
569
+ <tr>
570
+ <td colspan="2">
571
+ <span class="tblTitle">More details</span> (optional, but nice)
572
+ </td>
573
+ </tr>
574
+ <tr>
575
+ <td class="fieldName optional">Performer homepage</td>
576
+ <td><input id="performerForm.url" type="text" name="url" value="http://" class="longwidth" size="60" /></td>
577
+ </tr>
578
+ <tr>
579
+ <td class="fieldName optional">Short description</td>
580
+ <td>
581
+ <textarea class="longwidth" id="performerForm.description" name="description" rows="5" cols="50"></textarea>
582
+ </td>
583
+ </tr>
584
+ <tr>
585
+ <tr id="performer_submit">
586
+ <td class="fieldName"></td>
587
+ <td>
588
+ <input id="performer_submit" type="submit" name="submit" value="Submit" class="submit" />
589
+ <span id="performerFormProgressArea" style="visibility:hidden;"><img src="/images/indicator.gif" border="0" /></span>
590
+
591
+ </td>
592
+ </tr>
593
+ </table>
594
+ </form>
595
+ </div><!-- end class="bd" -->
596
+
597
+ <div id="performerDupeCheckContainer" style="visibility: hidden">
598
+ <div class="hd">Hmm...</div>
599
+ <div class="bd">
600
+ <form method="post" name="dlgForm_performerDupeForm" id="performerDupeForm" action="/ajax/select.performer.php" onsubmit="">
601
+ <input type="hidden" name="type" value="performer" />
602
+ <div class="">We might have that performer already. Help us keep our database clean by looking to see if it's already here!</div>
603
+ <table border="0" id="performer_dupe_check_table">
604
+ <tr>
605
+ <td colspan="2">(Please select one)</td>
606
+ </tr>
607
+ <tr id="use_my_performer_tr">
608
+ <td><input id="use_my_performer" name="use_performer" type="radio" checked="checked" value="mine" /></td>
609
+ <td><label for="use_my_performer">Please just use the one I entered.</label></td>
610
+ </tr>
611
+ </table>
612
+ </form>
613
+ </div>
614
+ <div class="ft"></div>
615
+ </div>
616
+
617
+ </div><!-- end id="performerFormContainer" -->
618
+
619
+
620
+
621
+ </div> <!-- End vCalendar -->
622
+
623
+ <form onsubmit="javascript: return false;">
624
+ <input type="hidden" id="_cmb" name="_cmb" value="WQqdM22/soy" />
625
+ </form>
626
+ <div class="up-clearb"></div>
627
+ </div> <dl id="up-ft">
628
+ <dt>Me</dt>
629
+ <dd>
630
+ <a href="/myevents/">My Events</a> |
631
+ <a href="/history/myevents/">My Scrapbook</a> |
632
+ <a href="/friend/event/">My Friend's Events</a> |
633
+ <a href="/activity/">What's New For You</a> |
634
+ <a href="/user/122240">My Account</a>
635
+ </dd>
636
+ <dt>Tools</dt>
637
+ <dd>
638
+ <a href="/badge/">Upcoming Badges for Your Blog/Website</a> |
639
+ <a href="/site_invite/">Invite Friends</a> |
640
+ <a href="/group/">Groups</a> |
641
+ <a href="/services/api/">Developers API</a>
642
+ </dd>
643
+ <dt>Help</dt>
644
+ <dd>
645
+ <a href="/news/">News Blog</a> |
646
+ <a href="/help/guidelines/">Community Guidelines</a> |
647
+ <a href="/help/faq/;_ylt=AnJp1N2sKwVEPEMhmQyi0PfPa80F">FAQ</a> |
648
+ <a href="/contact/">Contact Us</a> |
649
+ <a href="http://suggestions.yahoo.com/?prop=upcoming">Suggestion Board</a>
650
+ </dd>
651
+ <dt class="up-ft-copyright">Copyright &copy; 2008 Yahoo! Inc. All rights reserved.</dt>
652
+ <dd class="up-ft-copyright">
653
+ - <a href="http://docs.yahoo.com/info/copyright/copyright.html">Copyright/IP Policy</a> -
654
+ <a href="http://docs.yahoo.com/info/terms/">Terms of Service</a> -
655
+ <a href="http://privacy.yahoo.com/privacy/us/upcoming/">Privacy Policy</a>
656
+ </dd>
657
+ </dl>
658
+ </div> <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/utilities/utilities.js"></script>
659
+ <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/autocomplete/autocomplete-min.js"></script>
660
+ <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/calendar/calendar-min.js"></script>
661
+ <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/container/container-min.js"></script>
662
+ <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/menu/menu-min.js"></script>
663
+ <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/tabview/tabview-min.js"></script>
664
+ <script type="text/javascript" src="http://yui.yahooapis.com/2.5.1/build/cookie/cookie-beta-min.js"></script>
665
+ <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"><!--
666
+ var AW = new AttendWidgetEventPage(1363102,null,null,0,1,0,0,0,0,'attendWidget1363102','WQqdM22/soy');
667
+ -->
668
+ </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>
669
+ if(window.yzq_d==null)window.yzq_d=new Object();
670
+ window.yzq_d['PA7EPNj8el0-']='&U=13gq1oodp%2fN%3dPA7EPNj8el0-%2fC%3d289534.10399734.11039816.10073328%2fD%3dFOOT%2fB%3d4466047%2fV%3d1';
671
+ </script><noscript><img width=1 height=1 alt="" src="http://us.bc.yahoo.com/b?P=CCVRemKIPI9hPwLmQI9UsAOrGBYoPEk9pyYACCVl&T=1425gmkrk%2fX%3d1228777254%2fE%3d97348559%2fR%3dupcoming%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO%2fF%3d4101591957%2fQ%3d-1%2fS%3d1%2fJ%3d8C3C8862&U=13gq1oodp%2fN%3dPA7EPNj8el0-%2fC%3d289534.10399734.11039816.10073328%2fD%3dFOOT%2fB%3d4466047%2fV%3d1"></noscript><!-- SpaceID=97348559 loc=FSRVY noad -->
672
+ <script language=javascript>
673
+ if(window.yzq_d==null)window.yzq_d=new Object();
674
+ window.yzq_d['PQ7EPNj8el0-']='&U=12dbqce00%2fN%3dPQ7EPNj8el0-%2fC%3d-1%2fD%3dFSRVY%2fB%3d-1%2fV%3d0';
675
+ </script><noscript><img width=1 height=1 alt="" src="http://us.bc.yahoo.com/b?P=CCVRemKIPI9hPwLmQI9UsAOrGBYoPEk9pyYACCVl&T=142bdq7og%2fX%3d1228777254%2fE%3d97348559%2fR%3dupcoming%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO%2fF%3d2487689334%2fQ%3d-1%2fS%3d1%2fJ%3d8C3C8862&U=12dbqce00%2fN%3dPQ7EPNj8el0-%2fC%3d-1%2fD%3dFSRVY%2fB%3d-1%2fV%3d0"></noscript> </body>
676
+ </html>
677
+
678
+ <!-- spaceid = -->
679
+ <script language=javascript>
680
+ 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>");
681
+ </script><script language=javascript>
682
+ if(window.yzq_p)yzq_p('P=CCVRemKIPI9hPwLmQI9UsAOrGBYoPEk9pyYACCVl&T=13tvvb72o%2fX%3d1228777254%2fE%3d97348559%2fR%3dupcoming%2fK%3d5%2fV%3d1.1%2fW%3dJ%2fY%3dYAHOO%2fF%3d1465937063%2fS%3d1%2fJ%3d8C3C8862');
683
+ if(window.yzq_s)yzq_s();
684
+ </script><noscript><img width=1 height=1 alt="" src="http://us.bc.yahoo.com/b?P=CCVRemKIPI9hPwLmQI9UsAOrGBYoPEk9pyYACCVl&T=14249jfa7%2fX%3d1228777254%2fE%3d97348559%2fR%3dupcoming%2fK%3d5%2fV%3d3.1%2fW%3dJ%2fY%3dYAHOO%2fF%3d1416311146%2fQ%3d-1%2fS%3d1%2fJ%3d8C3C8862"></noscript>
685
+ <!-- w2.up.sp1.yahoo.com compressed/chunked Mon Dec 8 15:00:54 PST 2008 -->