social_engine 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/Gemfile +13 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +340 -0
  4. data/VERSION +1 -0
  5. data/app/controllers/comments_controller.rb +13 -0
  6. data/app/controllers/favorites_controller.rb +21 -0
  7. data/app/controllers/ratings_controller.rb +15 -0
  8. data/app/controllers/reputation_actions_controller.rb +13 -0
  9. data/app/controllers/social_engine_controller.rb +32 -0
  10. data/app/controllers/votes_controller.rb +15 -0
  11. data/app/helpers/social_engine_helper.rb +82 -0
  12. data/app/models/comment.rb +10 -0
  13. data/app/models/favorite.rb +4 -0
  14. data/app/models/friending.rb +21 -0
  15. data/app/models/rating.rb +6 -0
  16. data/app/models/reputation.rb +24 -0
  17. data/app/models/reputation_action.rb +15 -0
  18. data/app/models/social_engine/commentable.rb +14 -0
  19. data/app/models/social_engine/favoriteable.rb +14 -0
  20. data/app/models/social_engine/friendable.rb +56 -0
  21. data/app/models/social_engine/helpers.rb +37 -0
  22. data/app/models/social_engine/rateable.rb +33 -0
  23. data/app/models/social_engine/reputatable.rb +14 -0
  24. data/app/models/social_engine/sociable.rb +17 -0
  25. data/app/models/social_engine/social_user.rb +16 -0
  26. data/app/models/social_engine/voteable.rb +28 -0
  27. data/app/models/vote.rb +13 -0
  28. data/app/views/comments/_comment.haml +11 -0
  29. data/app/views/comments/_form.haml +8 -0
  30. data/app/views/comments/_list.haml +4 -0
  31. data/app/views/comments/new.haml +1 -0
  32. data/app/views/common/_user_attributes.haml +6 -0
  33. data/app/views/favorites/_widget.haml +8 -0
  34. data/app/views/ratings/_form.haml +6 -0
  35. data/app/views/ratings/_rating.haml +3 -0
  36. data/app/views/ratings/new.haml +1 -0
  37. data/app/views/reputation_actions/_form.haml +5 -0
  38. data/app/views/reputation_actions/edit.haml +3 -0
  39. data/app/views/reputation_actions/index.haml +21 -0
  40. data/app/views/reputation_actions/new.haml +9 -0
  41. data/app/views/third_party/_fb_friend_box.html.erb +5 -0
  42. data/app/views/third_party/_fb_javascript_sdk.html.erb +13 -0
  43. data/app/views/third_party/_fb_og_tags.html.erb +10 -0
  44. data/app/views/third_party/_fblike.html.erb +3 -0
  45. data/app/views/third_party/_tweetme.html.erb +6 -0
  46. data/app/views/votes/_widget.haml +13 -0
  47. data/config/routes.rb +3 -0
  48. data/lib/generators/social_engine/install/USAGE +17 -0
  49. data/lib/generators/social_engine/install/install_generator.rb +34 -0
  50. data/lib/generators/social_engine/install/templates/create_comments_table.rb +23 -0
  51. data/lib/generators/social_engine/install/templates/create_favorites_table.rb +19 -0
  52. data/lib/generators/social_engine/install/templates/create_friendings_table.rb +20 -0
  53. data/lib/generators/social_engine/install/templates/create_ratings_table.rb +21 -0
  54. data/lib/generators/social_engine/install/templates/create_reputation_actions_table.rb +14 -0
  55. data/lib/generators/social_engine/install/templates/create_reputations_table.rb +19 -0
  56. data/lib/generators/social_engine/install/templates/create_votes_table.rb +21 -0
  57. data/lib/generators/social_engine/install/templates/formtastic.css +145 -0
  58. data/lib/generators/social_engine/install/templates/social_engine.css +26 -0
  59. data/lib/generators/social_engine/install/templates/social_engine_yetting.yml +89 -0
  60. data/lib/generators/social_engine/user_reputation/templates/add_reputation_to_users_table.rb +9 -0
  61. data/lib/generators/social_engine/user_reputation/user_reputation_generator.rb +22 -0
  62. data/lib/social_engine.rb +11 -0
  63. data/lib/social_engine/core_ext/array.rb +13 -0
  64. data/lib/social_engine/core_ext/hash.rb +26 -0
  65. data/lib/social_engine/engine.rb +44 -0
  66. data/lib/social_engine/railties/tasks.rake +0 -0
  67. data/social_engine.gemspec +126 -0
  68. metadata +211 -0
@@ -0,0 +1,13 @@
1
+ class Vote < ActiveRecord::Base
2
+ belongs_to :voteable, :polymorphic=>true
3
+ validates_uniqueness_of :voteable_type, :scope=> SocialEngine::Helpers::Fingerprint.fingerprint_type(:voteable_id),
4
+ :if => Proc.new { |x| SocialEngineYetting.fingerprint_method != "none" }
5
+
6
+ def up?
7
+ self.value>0
8
+ end
9
+
10
+ def down?
11
+ self.value<0
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ .se-comment{:id=>div_id(comment)}
2
+ .se-comment-body
3
+ =comment.comment
4
+ -if options[:show_posted_by] or options[:date]
5
+ .se-comment-info
6
+ -if options[:show_posted_by]
7
+ .se-comment-posted-by
8
+ \Posted by #{comment.name}
9
+ -if options[:date]
10
+ .se-comment-date
11
+ =comment.created_at.strftime(options[:date])
@@ -0,0 +1,8 @@
1
+ .se-comment-form
2
+ =semantic_form_for [commentable,comment] do |f|
3
+ = f.inputs do
4
+ -unless current_user
5
+ = render "common/user_attributes", options: options, f: f
6
+ = f.input :comment, :label=> options[:comment][:label]
7
+ = f.buttons do
8
+ =f.commit_button options[:comment][:button_text]
@@ -0,0 +1,4 @@
1
+ .se-comments-list
2
+ %ul
3
+ - comments.each do |comment|
4
+ %li= render partial: "comments/comment", locals:{comment: comment, options:options}
@@ -0,0 +1 @@
1
+ =render "comments/form", commentable: @commentable, comment: Comment.new
@@ -0,0 +1,6 @@
1
+ -if options[:name]
2
+ = f.input :unauthenticated_name, :label=> options[:name][:label], :required=>options[:name][:required]
3
+ -if options[:email]
4
+ = f.input :unauthenticated_email, :label=> options[:email][:label], :required=>options[:email][:required]
5
+ -if options[:website]
6
+ = f.input :unauthenticated_website, :label=> options[:website][:label], :required=>options[:website][:required]
@@ -0,0 +1,8 @@
1
+ - if current_user
2
+ .se-favorite{:id=>"favorite-#{div_id(favoriteable)}"}
3
+ - if current_user.favorites.include?(favorite)
4
+ =button_to options[:remove_text], "/#{favoriteable.class.to_s.underscore.pluralize}/#{favoriteable.id}/favorites/#{favorite.id}", :method=>:delete, :class=>"se-favorite-delete"
5
+ - else
6
+ =semantic_form_for [favoriteable,Favorite.new] do |f|
7
+ = f.buttons do
8
+ =f.commit_button options[:add_text], :class=>"se-favorite-add"
@@ -0,0 +1,6 @@
1
+ .se-rating-form
2
+ =semantic_form_for [rateable,rating] do |f|
3
+ = f.inputs do
4
+ = f.input :value, :as=>:radio, :collection=>(1..options[:max_value]).to_a, :label=>""
5
+ = f.buttons do
6
+ =f.commit_button options[:button_text]
@@ -0,0 +1,3 @@
1
+ %div{:id=>div_id(rating),:class=>"se-rating-value#{rating.value}"}
2
+ .se-rating-value-text
3
+ = rating.value
@@ -0,0 +1 @@
1
+ =render "ratings/form", rateable: @rateable, rating: Rating.new
@@ -0,0 +1,5 @@
1
+ #se-reputation-action-form
2
+ =semantic_form_for @reputation_action do |f|
3
+ = f.inputs
4
+ = f.buttons do
5
+ =f.commit_button "Save Reputation Action"
@@ -0,0 +1,3 @@
1
+ #se-edit-reputation-action
2
+ %h1 Edit Reputation Action
3
+ =render "form"
@@ -0,0 +1,21 @@
1
+ #se-reputation-actions-list
2
+ %h1 Reputation Actions
3
+ #se-new-reputation-action-link
4
+ =link_to "Add New Reputation Action", new_reputation_action_url
5
+ %table{:id=>"businesses-table"}
6
+ %thead
7
+ %tr
8
+ %th Name
9
+ %th Value
10
+ %th
11
+ %th
12
+ %tbody
13
+ - @reputation_actions.each do |rep_action|
14
+ %tr
15
+ %td= rep_action.name
16
+ %td= rep_action.value
17
+ %td= link_to "Edit", edit_reputation_action_url(rep_action)
18
+ %td= link_to "Edit", edit_reputation_action_url(rep_action), :method=>"destroy", :confirm=>"Are you sure you want to delete"
19
+
20
+
21
+
@@ -0,0 +1,9 @@
1
+ #se-new-reputation-action
2
+ %h1 New Reputation Action
3
+ =render "form"
4
+ #se-reputation-action-source-list
5
+ %h2 Source Actions
6
+ - ReputationAction.list_from_rails_source.each do |action|
7
+ = action
8
+ ,
9
+
@@ -0,0 +1,5 @@
1
+ <div class="<%=options[:div_class]%>">
2
+ <script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script>
3
+ <fb:like-box href="<%=options[:fb_page_url]%>" width="<%=options[:width]%>" show_faces="<%=options[:faces]%>" stream="<%=options[:stream]%>" header="<%=options[:header]%>">
4
+ </fb:like-box>
5
+ </div>
@@ -0,0 +1,13 @@
1
+ <div id="fb-root"></div>
2
+ <script>
3
+ window.fbAsyncInit = function() {
4
+ FB.init({appId: '<%=options[:app_id]%>', status: true, cookie: true,
5
+ xfbml: true});
6
+ };
7
+ (function() {
8
+ var e = document.createElement('script'); e.async = true;
9
+ e.src = document.location.protocol +
10
+ '//connect.facebook.net/en_US/all.js';
11
+ document.getElementById('fb-root').appendChild(e);
12
+ }());
13
+ </script>
@@ -0,0 +1,10 @@
1
+ <meta property="og:title" content="<%=options[:title]%>" />
2
+ <meta property="og:type" content="<%=options[:type]%>" />
3
+ <meta property="og:url" content="<%=options[:url]%>" />
4
+ <meta property="og:image" content="<%=options[:image]%>" />
5
+ <meta property="og:site_name" content="<%=options[:site_name]%>" />
6
+ <% if options[:app_id] %>
7
+ <meta property="fb:app_id" content="<%=options[:app_id]%>" />
8
+ <% else %>
9
+ <meta property="fb:admins" content="<%=options[:admins]%>" />
10
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <div class="<%=options[:div_class]%>">
2
+ <script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><fb:like href="<%= options[:url] %>" layout="<%=options[:layout]%>" show_faces="<%=options[:faces]%>" width="<%=options[:width]%>" action="<%=options[:action]%>" font="<%=options[:font]%>" colorscheme="<%=options[:colorscheme]%>"></fb:like>
3
+ </div>
@@ -0,0 +1,6 @@
1
+ <div class="<%=options[:div_class]%>">
2
+ <a href="http://twitter.com/share" class="twitter-share-button" data-count="<%=options[:count] %>"
3
+ <% if options[:url] %> data-url="<%=options[:url] %>"<% end %>
4
+ <% if options[:text] %> data-text="<%=options[:text] %>"<% end %>
5
+ <% if options[:via] %> data-via="<%=options[:via]%>"<% end %>
6
+ >Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>
@@ -0,0 +1,13 @@
1
+ .se-vote-widget
2
+ .se-vote-up
3
+ =semantic_form_for [voteable,Vote.new(value:1)] do |f|
4
+ = f.input :value, :as=>:hidden
5
+ = f.buttons do
6
+ =f.commit_button options[:upvote_text]
7
+ .se-vote-score
8
+ =voteable.vote_sum
9
+ .se-vote-down
10
+ =semantic_form_for [voteable,Vote.new(value:-1)] do |f|
11
+ = f.input :value, :as=>:hidden
12
+ = f.buttons do
13
+ =f.commit_button options[:downvote_text]
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ resources :comments, :ratings, :votes, :favorites, :reputation_actions
3
+ end
@@ -0,0 +1,17 @@
1
+ Description:
2
+ This generator creates your db migrations, configuration file and css used by social_engine
3
+
4
+ Example:
5
+ rails generate social_engine
6
+
7
+ This will create:
8
+ db/migrations/create_comments_table.rb
9
+ db/migrations/create_votes_table.rb
10
+ db/migrations/create_ratings_table.rb
11
+ db/migrations/create_favorites_table.rb
12
+ db/migrations/create_reputations_table.rb
13
+ db/migrations/create_reputation_actions_table.rb
14
+ db/migrations/create_friendings_table.rb
15
+ public/stylesheets/social_engine.css
16
+ public/stylesheets/formtastic.css
17
+ config/yettings/social_engine.yml
@@ -0,0 +1,34 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/migration'
3
+
4
+ module SocialEngine
5
+ class InstallGenerator < Rails::Generators::Base
6
+ include Rails::Generators::Migration
7
+ source_root File.join(File.dirname(__FILE__), 'templates')
8
+
9
+ def self.next_migration_number(dirname)
10
+ sleep 1
11
+ if ActiveRecord::Base.timestamped_migrations
12
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
13
+ else
14
+ "%.3d" % (current_migration_number(dirname) + 1)
15
+ end
16
+ end
17
+
18
+ def create_migration_file
19
+ migration_template 'create_comments_table.rb', 'db/migrate/create_comments_table.rb'
20
+ migration_template 'create_votes_table.rb', 'db/migrate/create_votes_table.rb'
21
+ migration_template 'create_ratings_table.rb', 'db/migrate/create_ratings_table.rb'
22
+ migration_template 'create_favorites_table.rb', 'db/migrate/create_favorites_table.rb'
23
+ migration_template 'create_reputations_table.rb', 'db/migrate/create_reputations_table.rb'
24
+ migration_template 'create_reputation_actions_table.rb', 'db/migrate/create_reputation_actions_table.rb'
25
+ migration_template 'create_friendings_table.rb', 'db/migrate/create_friendings_table.rb'
26
+ end
27
+
28
+ def create_static_assets
29
+ copy_file "social_engine_yetting.yml", "config/yettings/social_engine.yml"
30
+ copy_file "social_engine.css", "public/stylesheets/social_engine.css"
31
+ copy_file "formtastic.css", "public/stylesheets/formtastic.css"
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,23 @@
1
+ class CreateCommentsTable < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :comments, :force => true do |t|
4
+ t.string :commentable_type
5
+ t.integer :commentable_id
6
+ t.integer :user_id
7
+ t.text :comment
8
+ t.string :unauthenticated_name
9
+ t.string :unauthenticated_email
10
+ t.string :unauthenticated_website
11
+ t.string :ip_address
12
+ t.string :session_hash
13
+ t.string :browser_fingerprint
14
+ t.timestamps
15
+ end
16
+ add_index :comments, [:commentable_type, :commentable_id, :ip_address, :browser_fingerprint], :name => "comments_index", :unique => false
17
+ end
18
+
19
+ def self.down
20
+ remove_index :comments, :name=> :comments_index
21
+ drop_table :comments
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ class CreateFavoritesTable < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :favorites, :force => true do |t|
4
+ t.string :favoriteable_type
5
+ t.integer :favoriteable_id
6
+ t.integer :user_id
7
+ t.string :ip_address
8
+ t.string :session_hash
9
+ t.string :browser_fingerprint
10
+ t.timestamps
11
+ end
12
+ add_index :favorites, [:favoriteable_type, :favoriteable_id, :ip_address, :browser_fingerprint], :name => "favorites_index", :unique => false
13
+ end
14
+
15
+ def self.down
16
+ remove_index :favorites, :name=> :favorites_index
17
+ drop_table :favorites
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ class CreateFriendingsTable < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :friendings, :force => true do |t|
4
+ t.integer :friendor_id
5
+ t.integer :friendee_id
6
+ t.boolean :confirmed, :default => false
7
+ t.boolean :rejected, :default => false
8
+ t.timestamps
9
+ end
10
+
11
+ add_index :friendings, :friendor_id
12
+ add_index :friendings, :friendee_id
13
+ end
14
+
15
+ def self.down
16
+ remove_index :friendings, :friendor_id
17
+ remove_index :friendings, :friendee_id
18
+ drop_table :friendings
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ class CreateRatingsTable < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :ratings, :force => true do |t|
4
+ t.string :rateable_type
5
+ t.integer :rateable_id
6
+ t.integer :value
7
+ t.integer :user_id
8
+ t.string :ip_address
9
+ t.string :session_hash
10
+ t.string :browser_fingerprint
11
+ t.timestamps
12
+ end
13
+
14
+ add_index :ratings, [:rateable_type, :rateable_id, :ip_address, :browser_fingerprint], :name => "ratings_index", :unique => false
15
+ end
16
+
17
+ def self.down
18
+ remove_index :ratings, :name=> :ratings_index
19
+ drop_table :ratings
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ class CreateReputationActionsTable < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :reputation_actions, :force => true do |t|
4
+ t.string :name
5
+ t.text :description
6
+ t.integer :value
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :reputation_actions
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ class CreateReputationsTable < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :reputations, :force => true do |t|
4
+ t.integer :user_id
5
+ t.integer :reputation_action_id
6
+ t.integer :value
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :reputations, [:user_id,:reputation_action_id], :name => "user_reputation", :unique => false
11
+ add_index :reputations, :reputation_action_id
12
+ end
13
+
14
+ def self.down
15
+ remove_index :reputations, :reputation_action_id
16
+ remove_index :reputations, :name=> :user_reputation
17
+ drop_table :reputations
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ class CreateVotesTable < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :votes, :force => true do |t|
4
+ t.string :voteable_type
5
+ t.integer :voteable_id
6
+ t.integer :user_id
7
+ t.integer :value
8
+ t.string :ip_address
9
+ t.string :session_hash
10
+ t.string :browser_fingerprint
11
+ t.timestamps
12
+ end
13
+
14
+ add_index :votes, [:voteable_type, :voteable_id, :ip_address, :browser_fingerprint], :name => "votes_index", :unique => false
15
+ end
16
+
17
+ def self.down
18
+ remove_index :votes, :name=> :votes_index
19
+ drop_table :votes
20
+ end
21
+ end
@@ -0,0 +1,145 @@
1
+ /* -------------------------------------------------------------------------------------------------
2
+
3
+ It's *strongly* suggested that you don't modify this file. Instead, load a new stylesheet after
4
+ this one in your layouts (eg formtastic_changes.css) and override the styles to suit your needs.
5
+ This will allow you to update formtastic.css with new releases without clobbering your own changes.
6
+
7
+ This stylesheet forms part of the Formtastic Rails Plugin
8
+ (c) 2008 Justin French
9
+
10
+ --------------------------------------------------------------------------------------------------*/
11
+
12
+
13
+ /* NORMALIZE AND RESET - obviously inspired by Yahoo's reset.css, but scoped to just form.formtastic
14
+ --------------------------------------------------------------------------------------------------*/
15
+ form.formtastic, form.formtastic ul, form.formtastic ol, form.formtastic li, form.formtastic fieldset, form.formtastic legend, form.formtastic input, form.formtastic textarea, form.formtastic select, form.formtastic p { margin:0; padding:0; }
16
+ form.formtastic fieldset { border:0; }
17
+ form.formtastic em, form.formtastic strong { font-style:normal; font-weight:normal; }
18
+ form.formtastic ol, form.formtastic ul { list-style:none; }
19
+ form.formtastic abbr, form.formtastic acronym { border:0; font-variant:normal; }
20
+ form.formtastic input, form.formtastic textarea, form.formtastic select { font-family:inherit; font-size:inherit; font-weight:inherit; }
21
+ form.formtastic input, form.formtastic textarea, form.formtastic select { font-size:100%; }
22
+ form.formtastic legend { white-space:normal; color:#000; }
23
+
24
+
25
+ /* SEMANTIC ERRORS
26
+ --------------------------------------------------------------------------------------------------*/
27
+ form.formtastic ul.errors { color:#cc0000; margin:0.5em 0 1.5em 25%; list-style:square; }
28
+ form.formtastic ul.errors li { padding:0; border:none; display:list-item; }
29
+
30
+
31
+ /* FIELDSETS & LISTS
32
+ --------------------------------------------------------------------------------------------------*/
33
+ form.formtastic fieldset { overflow:auto; } /* clearing contained floats */
34
+ form.formtastic fieldset.inputs { }
35
+ form.formtastic fieldset.buttons { padding-left:25%; }
36
+ form.formtastic fieldset ol { }
37
+ form.formtastic fieldset.buttons li { float:left; padding-right:0.5em; }
38
+
39
+ /* INPUT LIs
40
+ --------------------------------------------------------------------------------------------------*/
41
+ form.formtastic fieldset > ol > li { padding:0.5em 0; margin-top:-0.5em; margin-bottom:1em; } /* padding and negative margin juggling is for Firefox */
42
+ form.formtastic fieldset > ol > li { overflow:auto; } /* clearing contained floats */
43
+
44
+ form.formtastic fieldset > ol > li.required { }
45
+ form.formtastic fieldset > ol > li.optional { }
46
+ form.formtastic fieldset > ol > li.error { }
47
+
48
+
49
+ /* LABELS
50
+ --------------------------------------------------------------------------------------------------*/
51
+ form.formtastic fieldset > ol > li label { display:block; width:25%; float:left; padding-top:.2em; }
52
+ form.formtastic fieldset > ol > li > li label { line-height:100%; padding-top:0; }
53
+ form.formtastic fieldset > ol > li > li label input { line-height:100%; vertical-align:middle; margin-top:-0.1em;}
54
+
55
+
56
+ /* NESTED FIELDSETS AND LEGENDS (radio, check boxes and date/time inputs use nested fieldsets)
57
+ --------------------------------------------------------------------------------------------------*/
58
+ form.formtastic fieldset > ol > li fieldset { position:relative; }
59
+ form.formtastic fieldset > ol > li fieldset legend { position:absolute; width:95%; left: 0px; }
60
+ form.formtastic fieldset > ol > li fieldset legend span { position:absolute; }
61
+ form.formtastic fieldset > ol > li fieldset legend.label label { position:absolute; }
62
+ form.formtastic fieldset > ol > li fieldset ol { float:left; width:74%; margin:0; padding:0 0 0 25%; }
63
+ form.formtastic fieldset > ol > li fieldset ol li { padding:0; border:0; }
64
+
65
+
66
+ /* INLINE HINTS
67
+ --------------------------------------------------------------------------------------------------*/
68
+ form.formtastic fieldset > ol > li p.inline-hints { color:#666; margin:0.5em 0 0 25%; }
69
+
70
+
71
+ /* INLINE ERRORS
72
+ --------------------------------------------------------------------------------------------------*/
73
+ form.formtastic fieldset > ol > li p.inline-errors { color:#cc0000; margin:0.5em 0 0 25%; }
74
+ form.formtastic fieldset > ol > li ul.errors { color:#cc0000; margin:0.5em 0 0 25%; list-style:square; }
75
+ form.formtastic fieldset > ol > li ul.errors li { padding:0; border:none; display:list-item; }
76
+
77
+
78
+ /* STRING, NUMERIC, PASSWORD, EMAIL, URL, PHONE & SEARCH OVERRIDES
79
+ --------------------------------------------------------------------------------------------------*/
80
+ form.formtastic fieldset > ol > li.string input,
81
+ form.formtastic fieldset > ol > li.password input,
82
+ form.formtastic fieldset > ol > li.numeric input,
83
+ form.formtastic fieldset > ol > li.email input,
84
+ form.formtastic fieldset > ol > li.url input,
85
+ form.formtastic fieldset > ol > li.phone input,
86
+ form.formtastic fieldset > ol > li.search input { width:72%; }
87
+
88
+ form.formtastic fieldset > ol > li.string input[size],
89
+ form.formtastic fieldset > ol > li.password input[size],
90
+ form.formtastic fieldset > ol > li.numeric input[size],
91
+ form.formtastic fieldset > ol > li.email input[size],
92
+ form.formtastic fieldset > ol > li.url input[size],
93
+ form.formtastic fieldset > ol > li.phone input[size],
94
+ form.formtastic fieldset > ol > li.search input[size] { width:auto; max-width:72%; }
95
+
96
+
97
+ /* TEXTAREA OVERRIDES
98
+ --------------------------------------------------------------------------------------------------*/
99
+ form.formtastic fieldset > ol > li.text textarea { width:72%; }
100
+ form.formtastic fieldset > ol > li.text textarea[cols] { width:auto; max-width:72%; }
101
+
102
+
103
+ /* HIDDEN OVERRIDES
104
+ --------------------------------------------------------------------------------------------------*/
105
+ form.formtastic fieldset ol li.hidden { display:none; }
106
+
107
+ /* BOOLEAN OVERRIDES
108
+ --------------------------------------------------------------------------------------------------*/
109
+ form.formtastic fieldset > ol > li.boolean label { padding-left:25%; width:auto; }
110
+ form.formtastic fieldset > ol > li.boolean label input { margin:0 0.5em 0 0.2em; }
111
+
112
+
113
+ /* RADIO OVERRIDES
114
+ --------------------------------------------------------------------------------------------------*/
115
+ form.formtastic fieldset > ol > li.radio { }
116
+ form.formtastic fieldset > ol > li.radio fieldset { overflow:visible; }
117
+ form.formtastic fieldset > ol > li.radio fieldset ol { margin-bottom:-0.5em; }
118
+ form.formtastic fieldset > ol > li.radio fieldset ol li { margin:0.1em 0 0.5em 0; overflow:visible; }
119
+ form.formtastic fieldset > ol > li.radio fieldset ol li label { float:none; width:100%; }
120
+ form.formtastic fieldset > ol > li.radio fieldset ol li label input { margin-right:0.2em; }
121
+
122
+
123
+ /* CHECK BOXES (COLLECTION) OVERRIDES
124
+ --------------------------------------------------------------------------------------------------*/
125
+ form.formtastic fieldset > ol > li.check_boxes { }
126
+ form.formtastic fieldset > ol > li.check_boxes fieldset { overflow:visible; }
127
+ form.formtastic fieldset > ol > li.check_boxes fieldset ol { margin-bottom:-0.5em; }
128
+ form.formtastic fieldset > ol > li.check_boxes fieldset ol li { margin:0.1em 0 0.5em 0; overflow:visible; }
129
+ form.formtastic fieldset > ol > li.check_boxes fieldset ol li label { float:none; width:100%; }
130
+ form.formtastic fieldset > ol > li.check_boxes fieldset ol li label input { margin-right:0.2em; }
131
+
132
+
133
+ /* DATE & TIME OVERRIDES
134
+ --------------------------------------------------------------------------------------------------*/
135
+ form.formtastic fieldset > ol > li.date fieldset ol li,
136
+ form.formtastic fieldset > ol > li.time fieldset ol li,
137
+ form.formtastic fieldset > ol > li.datetime fieldset ol li { float:left; width:auto; margin:0 .3em 0 0; }
138
+
139
+ form.formtastic fieldset > ol > li.date fieldset ol li label,
140
+ form.formtastic fieldset > ol > li.time fieldset ol li label,
141
+ form.formtastic fieldset > ol > li.datetime fieldset ol li label { display:none; }
142
+
143
+ form.formtastic fieldset > ol > li.date fieldset ol li label input,
144
+ form.formtastic fieldset > ol > li.time fieldset ol li label input,
145
+ form.formtastic fieldset > ol > li.datetime fieldset ol li label input { display:inline; margin:0; padding:0; }