social_stream 0.11.1 → 0.11.2

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 (65) hide show
  1. data/.gitignore +1 -0
  2. data/base/app/assets/images/tipsy.gif +0 -0
  3. data/base/app/assets/javascripts/activities.js.erb +23 -0
  4. data/base/app/assets/javascripts/invitations.js +7 -0
  5. data/base/app/assets/javascripts/profiles.js +4 -1
  6. data/base/app/assets/stylesheets/activities.css.scss +10 -5
  7. data/base/app/assets/stylesheets/base.css.scss +3 -2
  8. data/base/app/assets/stylesheets/frontpage.css.scss +2 -1
  9. data/base/app/assets/stylesheets/header.css.scss +5 -4
  10. data/base/app/controllers/groups_controller.rb +0 -6
  11. data/base/app/controllers/search_controller.rb +0 -4
  12. data/base/app/controllers/users_controller.rb +1 -6
  13. data/base/app/models/activity.rb +21 -7
  14. data/base/app/models/actor.rb +5 -3
  15. data/base/app/views/activities/_new.html.erb +13 -3
  16. data/base/app/views/activities/_options.html.erb +13 -4
  17. data/base/app/views/conversations/show.html.erb +1 -1
  18. data/base/app/views/conversations/show.js.erb +1 -1
  19. data/base/app/views/devise/registrations/edit.html.erb +1 -1
  20. data/base/app/views/devise/registrations/new.html.erb +1 -1
  21. data/base/app/views/devise/shared/_links.erb +6 -6
  22. data/base/app/views/frontpage/index.html.erb +3 -3
  23. data/base/app/views/groups/_new.html.erb +1 -1
  24. data/base/app/views/groups/show.html.erb +0 -5
  25. data/base/app/views/invitations/_new.html.erb +0 -5
  26. data/base/app/views/layouts/_header.erb +5 -44
  27. data/base/app/views/layouts/_header_signed_in.erb +44 -0
  28. data/base/app/views/layouts/_header_signed_out.erb +36 -0
  29. data/base/app/views/layouts/frontpage.html.erb +1 -1
  30. data/base/app/views/messages/_form.html.erb +3 -3
  31. data/base/app/views/messages/new.html.erb +2 -2
  32. data/base/app/views/messages/new.js.erb +1 -1
  33. data/base/app/views/posts/create.js.erb +2 -0
  34. data/base/app/views/profiles/edit.html.erb +6 -4
  35. data/base/app/views/search/index.html.erb +0 -4
  36. data/base/app/views/users/show.html.erb +0 -5
  37. data/base/config/locales/en.yml +33 -4
  38. data/base/config/locales/es.yml +33 -4
  39. data/base/lib/generators/social_stream/base/templates/initializer.rb +3 -0
  40. data/base/lib/social_stream-base.rb +4 -1
  41. data/base/lib/social_stream/base/version.rb +1 -1
  42. data/base/lib/social_stream/models/object.rb +2 -1
  43. data/base/social_stream-base.gemspec +3 -3
  44. data/base/spec/dummy/config/initializers/social_stream.rb +3 -0
  45. data/base/vendor/assets/javascripts/jquery.tipsy.js +104 -0
  46. data/base/vendor/assets/stylesheets/tipsy.css +7 -0
  47. data/events/app/views/frontpage/index.html.erb +3 -3
  48. data/events/config/locales/en.yml +1 -0
  49. data/events/lib/social_stream/events/version.rb +1 -1
  50. data/events/social_stream-events.gemspec +1 -1
  51. data/lib/social_stream/version.rb +1 -1
  52. data/social_stream.gemspec +2 -2
  53. metadata +15 -22
  54. data/base/app/assets/images/frontpage/join.gif +0 -0
  55. data/base/app/assets/stylesheets/ad_next.png +0 -0
  56. data/base/app/assets/stylesheets/ad_prev.png +0 -0
  57. data/base/app/assets/stylesheets/ad_scroll_back.png +0 -0
  58. data/base/app/assets/stylesheets/ad_scroll_forward.png +0 -0
  59. data/base/app/assets/stylesheets/jquery.ad-gallery.css +0 -171
  60. data/base/app/assets/stylesheets/loader.gif +0 -0
  61. data/base/app/views/frontpage/_header.html.erb +0 -30
  62. data/base/app/views/frontpage/_social_networks.html.erb +0 -5
  63. data/base/app/views/groups/_show_frontpage.html.erb +0 -11
  64. data/base/app/views/search/_index_frontpage.html.erb +0 -13
  65. data/base/app/views/users/_show_frontpage.html.erb +0 -11
@@ -0,0 +1,44 @@
1
+ <div id="headerFront">
2
+ <div class="banner_top banner_top_height">
3
+ <div id="header_left">
4
+ <div id="logo_txt">
5
+ <%= link_to(image_tag('header-logo.png', :alt => t('site.name')), root_path) %>
6
+ </div>
7
+ </div>
8
+ <% if user_signed_in? %>
9
+ <%= render :partial => 'layouts/search' %>
10
+ <%end%>
11
+ <div id="header_right">
12
+ <% if user_signed_in? %>
13
+ <div class="menu_list menu_white" id="menu_home">
14
+ <ul>
15
+ <li>
16
+ <%= link_to(t('home'), root_path)%>
17
+ </li>
18
+ <li class="pipe">·</li>
19
+ <li>
20
+ <%= link_to(t('profile.one'), current_subject)%>
21
+ </li>
22
+ <li class="pipe">·</li>
23
+ <li>
24
+ <%= link_to(t('message.other'), conversations_path) %>
25
+ <span id="header_inbox_count">
26
+ <%= link_to(current_subject.mailbox.inbox(:unread => true).count.to_s, conversations_path) %>
27
+ </span>
28
+ </li>
29
+ <li class="pipe">·</li>
30
+ <li>
31
+ <span id="header_notifications">
32
+ <%= link_to( current_subject.mailbox.notifications.not_trashed.unread.count.to_s, notifications_path) %>
33
+ </span>
34
+ </li>
35
+ <li class="pipe">·</li>
36
+ <li>
37
+ <%= render :partial => 'layouts/header_dropdown_menu' %>
38
+ </li>
39
+ </ul>
40
+ </div>
41
+ <% end %>
42
+ </div>
43
+ </div>
44
+ </div>
@@ -0,0 +1,36 @@
1
+ <div id="headerFront">
2
+ <div class="banner_top">
3
+ <div id="logo">
4
+ <%= link_to(image_tag('logo.png', :alt => t('site.name')), '/'); %>
5
+ </div>
6
+ <% unless params[:controller].eql? 'devise/sessions' and params[:action].eql? 'new' %>
7
+ <div class="div_login">
8
+ <%= form_for User.new, :as => :user, :url => user_session_path do |f| -%>
9
+ <div id="login_data">
10
+ <div class="login_data_block">
11
+ <span><%= f.label :email %></span>
12
+ <%= f.email_field :email, :class => "input_username" %>
13
+ </div>
14
+ <div class="login_data_block">
15
+ <span><%= f.label :password %></span>
16
+ <%= f.password_field :password, :class => "input_username" %>
17
+ </div>
18
+
19
+ <div class="login_data_block">
20
+ <%= f.submit t(:sign_in), :class => 'other_blue'%>
21
+ </div>
22
+ </div>
23
+ <div class="options">
24
+ <%= link_to t('sign_up'), new_user_registration_path, :class => "register_link" %>
25
+ <span>|</span>
26
+ <%= link_to t('forgot_password'), new_user_password_path, :class => "register_link" %>
27
+ <span>|</span>
28
+ <%= link_to image_tag('btn/facebook.png'), user_omniauth_authorize_path(:facebook), :class => "menu_icon" %>
29
+ <%= link_to image_tag('btn/linkedin.png'), user_omniauth_authorize_path(:linked_in), :class => "menu_icon" %>
30
+ </div>
31
+ <% end -%>
32
+ </div>
33
+ <% end %>
34
+ <br class="clearfloat" />
35
+ </div>
36
+ </div>
@@ -23,7 +23,7 @@
23
23
  <body>
24
24
  <div id="wrapper">
25
25
  <header>
26
- <%= render :partial => "frontpage/header" %>
26
+ <%= render :partial => "layouts/header" %>
27
27
  </header>
28
28
  <section>
29
29
  <div id="wrapper_body">
@@ -14,20 +14,20 @@
14
14
  <% end %>
15
15
  <div class="block">
16
16
  <div class="form_row">
17
- <%= label_tag :recipients %>
17
+ <%= label_tag t('mailboxer.form.recipients') %>
18
18
  </div>
19
19
  <div class="form_row">
20
20
  <%= select_tag :_recipients, "", :class => "required form_tag" %>
21
21
 
22
22
  </div>
23
23
  <div class="form_row">
24
- <%= label_tag :subject %>
24
+ <%= label_tag t('mailboxer.form.subject') %>
25
25
  </div>
26
26
  <div class="form_row">
27
27
  <%= text_field_tag :subject,nil, :class => "required form_tag" %>
28
28
  </div>
29
29
  <div class="form_row">
30
- <%= label_tag :body %>
30
+ <%= label_tag t('mailboxer.form.body') %>
31
31
  </div>
32
32
  <div class="form_row" id="ck_editor" >
33
33
  <%= text_area_tag :body, nil,:rows =>6, :cols=> 53, :class => "required form_tag", :maxlength => 5000 %>
@@ -24,14 +24,14 @@
24
24
 
25
25
  $("#body").cleditor({
26
26
  width:493,
27
- controls: "<%= t('cleditor.controls')%>"
27
+ controls: "<%= SocialStream.cleditor_controls %>"
28
28
  });
29
29
 
30
30
  <% unless @recipient.nil? %>
31
31
  $("#_recipients").trigger("addItem",[{"title": "<%= truncate_name @recipient.name %>", "value": "<%= @recipient.id %>"}]);
32
32
  <% end %>
33
33
 
34
- $(".new_message").validate();
34
+ $(".new_message").validate({errorClass: "validation_error"});
35
35
 
36
36
  <% end %>
37
37
 
@@ -25,4 +25,4 @@ var recipients = $("#_recipients").fcbkcomplete({
25
25
  $("#_recipients").trigger("addItem",[{"title": "<%= @recipient.name %>", "value": "<%= @recipient.id %>"}]);
26
26
  <% end %>
27
27
 
28
- $(".new_message").validate();
28
+ $(".new_message").validate({errorClass: "validation_error"});
@@ -1,5 +1,7 @@
1
1
  //Display the new post
2
2
  $("#wall").prepend("<%= escape_javascript(render @post.post_activity) %>");
3
3
 
4
+ setActivityPrivacyTooltips("<%= escape_javascript dom_id(@post.post_activity) %>");
5
+
4
6
  unblock_all_forms();
5
7
 
@@ -37,7 +37,7 @@ end %>
37
37
  <% if !params[:section].present? or params[:section].eql?("tags") %>
38
38
  <% content_for :javascript do %>
39
39
  $(function() {
40
- $(".new_group").validate();
40
+ $(".new_group").validate({errorClass: "validation_error"});
41
41
  });
42
42
  $("#profile_actor_attributes_tag_list").fcbkcomplete({
43
43
  json_url: "<%= tags_path(:format => :json) %>",
@@ -95,7 +95,7 @@ end %>
95
95
  <div class="form_label">
96
96
  <%= f.label t('profile.' + current_subject.class.to_s.downcase + '.birthday')%>
97
97
  </div>
98
- <div class="form_field">
98
+ <div class="form_field" id="form_select">
99
99
  <%= date_select "profile", "birthday", :order => [:day, :month, :year], :end_year=> Date.today.year,
100
100
  :start_year=> (Date.today.year - 100), :prompt => { :day => 'Day', :month => 'Month', :year => 'Year' } %>
101
101
  </div>
@@ -119,8 +119,10 @@ end %>
119
119
  </div>
120
120
  </div>
121
121
 
122
- <div class="form_row form_label">
123
- <%= f.label t('profile.' + current_subject.class.to_s.downcase + '.about') %>
122
+ <div class="form_row">
123
+ <div class="form_label">
124
+ <%= f.label t('profile.' + current_subject.class.to_s.downcase + '.about') %>
125
+ </div>
124
126
  </div>
125
127
  <div class="form_row">
126
128
  <%= f.text_area :description, :maxlength => 200, :rows => 10, :class => "form_tag_long" %>
@@ -8,8 +8,4 @@
8
8
 
9
9
  <% toolbar if user_signed_in? %>
10
10
 
11
- <% if user_signed_in? %>
12
11
  <%= render :partial => 'index' %>
13
- <% else %>
14
- <%= render :partial => 'index_frontpage' %>
15
- <% end %>
@@ -1,6 +1 @@
1
- <% if user_signed_in? %>
2
1
  <%= render :partial => 'show' %>
3
- <% else %>
4
- <% toolbar :profile => @user %>
5
- <%= render :partial => 'show_frontpage' %>
6
- <% end %>
@@ -15,16 +15,35 @@ en:
15
15
  new: "New password"
16
16
  retype: "Retype new password"
17
17
  privacy: "Privacy"
18
+ activerecord:
19
+ attributes:
20
+ user:
21
+ email: "Email"
22
+ name: "Name"
23
+ password: "Password"
24
+ password_confirmation: "Confirm password"
25
+ remember_me: "Remember me"
18
26
  activity:
19
27
  audience:
20
- visible: "Shared with %{audience}"
21
- hidden: "Shared with spheres of %{audience}"
28
+ hidden:
29
+ summary: "Restricted"
30
+ full: "Shared with contacts of %{audience}"
31
+ public:
32
+ summary: "Public"
33
+ full: "Shared with all the Internet"
34
+ visible:
35
+ summary: "Restricted"
36
+ full: "Shared with %{audience}"
22
37
  confirm_delete: "Delete activity?"
23
38
  delete: "Delete"
24
39
  last: "Last Activities"
25
40
  like: "I like"
26
41
  one: "Activity"
27
42
  other: "Activities"
43
+ privacy:
44
+ contacts:
45
+ user: "Contacts of %{receiver}"
46
+ group: "Members of %{receiver}"
28
47
  sending: "Sending"
29
48
  title: "Activities"
30
49
  to_comment: "Comment"
@@ -60,8 +79,6 @@ en:
60
79
  create: "Create"
61
80
  save: "Save"
62
81
  update: "Update"
63
- cleditor:
64
- controls: "bold italic underline strikethrough subscript superscript | size style | bullets | image link unlink"
65
82
  comment:
66
83
  input: "Write a comment..."
67
84
  confirm_delete: "Delete comment?"
@@ -108,6 +125,13 @@ en:
108
125
  delete:
109
126
  confirm: Delete %{element}}?
110
127
  devise:
128
+ links:
129
+ sign_in: "Sign in"
130
+ sign_up: "Sign up"
131
+ forgot_password: "Forgot you password?"
132
+ confirmation_instructions: "Didn't receive confirmation instructions?"
133
+ unlock_instructions: "Didn't receive unlock instructions?"
134
+ sign_in_with: "Sign in with %{provider}"
111
135
  passwords:
112
136
  confirm: "Confirm password"
113
137
  forgot: "Forgot your password?"
@@ -137,6 +161,7 @@ en:
137
161
  default: "Meet"
138
162
  sentence1: "Meet interesting people and groups"
139
163
  sentence2: "Find last activity of your contacts"
164
+ register: "Register now!"
140
165
  share:
141
166
  default: "Share"
142
167
  sentence1: "Your proyects and activities"
@@ -192,6 +217,10 @@ en:
192
217
  base: "You are here"
193
218
  separator: " > "
194
219
  mailboxer:
220
+ form:
221
+ body: "Body"
222
+ recipients: "Recipients"
223
+ subject: "Subject"
195
224
  message_mailer:
196
225
  subject_new: "%{subject}"
197
226
  subject_reply: "%{subject}"
@@ -15,16 +15,35 @@ es:
15
15
  new: "Nueva contraseña"
16
16
  retype: "Repetir nueva contraseña"
17
17
  privacy: "Privacidad"
18
+ activerecord:
19
+ attributes:
20
+ user:
21
+ email: "Correo"
22
+ name: "Nombre"
23
+ password: "Contraseña"
24
+ password_confirmation: "Confirmar contraseña"
25
+ remember_me: "Recuérdame"
18
26
  activity:
19
27
  audience:
20
- visible: "Compartido con %{audience}"
21
- hidden: "Compartido con esferas de %{audience}"
28
+ hidden:
29
+ summary: "Restringido"
30
+ full: "Compartido con contactos de %{audience}"
31
+ public:
32
+ summary: "Público"
33
+ full: "Accesible por toda Internet"
34
+ visible:
35
+ summary: "Restringido"
36
+ full: "Compartido con %{audience}"
22
37
  confirm_delete: "¿Borrar actividad?"
23
38
  delete: "Borrar"
24
39
  last: "Últimas actividades"
25
40
  like: "Me gusta"
26
41
  one: "Actividad"
27
42
  other: "Actividades"
43
+ privacy:
44
+ contacts:
45
+ user: "Contactos de %{receiver}"
46
+ group: "Integrantes de %{receiver}"
28
47
  sending: "Enviando"
29
48
  title: "Actividades"
30
49
  to_comment: "Comentar"
@@ -59,8 +78,6 @@ es:
59
78
  cancel: "Cancelar"
60
79
  save: "Guardar"
61
80
  update: "Actualizar"
62
- cleditor:
63
- controls: "negrita cursiva subrayado tachado subíndice superíndice | tamaño estilo | lista | imagen enlazar desenlazar"
64
81
  comment:
65
82
  input: "Comentar..."
66
83
  confirm_delete: "¿Borrar commentario?"
@@ -107,6 +124,13 @@ es:
107
124
  delete:
108
125
  confirm: "¿Borrar %{element}}?"
109
126
  devise:
127
+ links:
128
+ sign_in: "Entrar"
129
+ sign_up: "Registrarse"
130
+ forgot_password: "¿Olvidaste tu contraseña?"
131
+ confirmation_instructions: "¿No recibiste instrucciones de confirmación?"
132
+ unlock_instructions: "¿No recibiste instrucciones de desbloqueo?"
133
+ sign_in_with: "Entrar con %{provider}"
110
134
  passwords:
111
135
  confirm: "Confirmar contraseña"
112
136
  forgot: "¿Olvidaste tu contraseña?"
@@ -134,6 +158,7 @@ es:
134
158
  default: "Encuentra"
135
159
  sentence1: "Descubre grupos y gente interesante"
136
160
  sentence2: "Encuentra la última actividad de tus contactos"
161
+ register: "¡Inscríbete ahora!"
137
162
  share:
138
163
  default: "Comparte"
139
164
  sentence1: "Tus proyectos y actividades"
@@ -189,6 +214,10 @@ es:
189
214
  base: "Estás aquí"
190
215
  separator: " > "
191
216
  mailboxer:
217
+ form:
218
+ body: "Mensaje"
219
+ recipients: "Para"
220
+ subject: "Asunto"
192
221
  message_mailer:
193
222
  subject_new: "%{subject}"
194
223
  subject_reply: "%{subject}"
@@ -26,4 +26,7 @@ SocialStream.setup do |config|
26
26
  #
27
27
  # config.quick_search_models = [:user, :group]
28
28
  # config.extended_search_models = [:user, :group]
29
+
30
+ # Cleditor controls. It is used in new message editor, for example
31
+ # config.cleditor_controls = "bold italic underline strikethrough subscript superscript | size style | bullets | image link unlink"
29
32
  end
@@ -84,7 +84,10 @@ module SocialStream
84
84
 
85
85
  mattr_accessor :extended_search_models
86
86
  @@extended_search_models = [ :user, :group, :post ]
87
-
87
+
88
+ mattr_accessor :cleditor_controls
89
+ @@cleditor_controls = "bold italic underline strikethrough subscript superscript | size style | bullets | image link unlink"
90
+
88
91
  class << self
89
92
  def setup
90
93
  yield self
@@ -1,5 +1,5 @@
1
1
  module SocialStream
2
2
  module Base
3
- VERSION = "0.9.16".freeze
3
+ VERSION = "0.9.18".freeze
4
4
  end
5
5
  end
@@ -73,8 +73,9 @@ module SocialStream
73
73
  if _contact_id.nil?
74
74
  nil
75
75
  else
76
+ # FIXME: repeated in Activity#fill_relations
76
77
  if _contact.reflexive?
77
- Array.wrap(_contact.sender.relation_public.id)
78
+ _contact.sender.relation_customs.map(&:id)
78
79
  else
79
80
  _contact.
80
81
  receiver.
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
  # Slug generation
27
27
  s.add_runtime_dependency('stringex', '~> 1.3.0')
28
28
  # Avatar attachments
29
- s.add_runtime_dependency('avatars_for_rails', '~> 0.1.3')
29
+ s.add_runtime_dependency('avatars_for_rails', '~> 0.1.4')
30
30
  # jQuery
31
31
  s.add_runtime_dependency('jquery-rails', '~> 1.0.9')
32
32
  # Authorization
@@ -38,7 +38,7 @@ Gem::Specification.new do |s|
38
38
  # OAuth provider
39
39
  s.add_runtime_dependency('oauth-plugin','~> 0.4.0.pre1')
40
40
  # Messages
41
- s.add_runtime_dependency('mailboxer','~> 0.5.3')
41
+ s.add_runtime_dependency('mailboxer','~> 0.5.4')
42
42
  # Tagging
43
43
  s.add_runtime_dependency('acts-as-taggable-on','~> 2.0.6')
44
44
  # HTML Forms
@@ -50,7 +50,7 @@ Gem::Specification.new do |s|
50
50
  # Modernizr.js javascript library
51
51
  s.add_runtime_dependency('modernizr-rails', '~> 2.0.6')
52
52
  # Sphinx search engine
53
- s.add_runtime_dependency('thinking-sphinx', '~> 2.0.7')
53
+ s.add_runtime_dependency('thinking-sphinx', '~> 2.0.8')
54
54
  #Syntactically Awesome Stylesheets
55
55
  s.add_runtime_dependency('sass-rails', '~> 3.1.0')
56
56
 
@@ -26,4 +26,7 @@ SocialStream.setup do |config|
26
26
  #
27
27
  # config.quick_search_models = [:user, :group]
28
28
  # config.extended_search_models = [:user, :group]
29
+
30
+ # Cleditor controls. It is used in new message editor, for example
31
+ # config.cleditor_controls = "bold italic underline strikethrough subscript superscript | size style | bullets | image link unlink"
29
32
  end
@@ -0,0 +1,104 @@
1
+ (function($) {
2
+ $.fn.tipsy = function(options) {
3
+
4
+ options = $.extend({}, $.fn.tipsy.defaults, options);
5
+
6
+ return this.each(function() {
7
+
8
+ var opts = $.fn.tipsy.elementOptions(this, options);
9
+
10
+ $(this).hover(function() {
11
+
12
+ $.data(this, 'cancel.tipsy', true);
13
+
14
+ var tip = $.data(this, 'active.tipsy');
15
+ if (!tip) {
16
+ tip = $('<div class="tipsy"><div class="tipsy-inner"/></div>');
17
+ tip.css({position: 'absolute', zIndex: 100000});
18
+ $.data(this, 'active.tipsy', tip);
19
+ }
20
+
21
+ if ($(this).attr('title') || typeof($(this).attr('original-title')) != 'string') {
22
+ $(this).attr('original-title', $(this).attr('title') || '').removeAttr('title');
23
+ }
24
+
25
+ var title;
26
+ if (typeof opts.title == 'string') {
27
+ title = $(this).attr(opts.title == 'title' ? 'original-title' : opts.title);
28
+ } else if (typeof opts.title == 'function') {
29
+ title = opts.title.call(this);
30
+ }
31
+
32
+ tip.find('.tipsy-inner')[opts.html ? 'html' : 'text'](title || opts.fallback);
33
+
34
+ var pos = $.extend({}, $(this).offset(), {width: this.offsetWidth, height: this.offsetHeight});
35
+ tip.get(0).className = 'tipsy'; // reset classname in case of dynamic gravity
36
+ tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).appendTo(document.body);
37
+ var actualWidth = tip[0].offsetWidth, actualHeight = tip[0].offsetHeight;
38
+ var gravity = (typeof opts.gravity == 'function') ? opts.gravity.call(this) : opts.gravity;
39
+
40
+ switch (gravity.charAt(0)) {
41
+ case 'n':
42
+ tip.css({top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}).addClass('tipsy-north');
43
+ break;
44
+ case 's':
45
+ tip.css({top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}).addClass('tipsy-south');
46
+ break;
47
+ case 'e':
48
+ tip.css({top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}).addClass('tipsy-east');
49
+ break;
50
+ case 'w':
51
+ tip.css({top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}).addClass('tipsy-west');
52
+ break;
53
+ }
54
+
55
+ if (opts.fade) {
56
+ tip.css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: 0.8});
57
+ } else {
58
+ tip.css({visibility: 'visible'});
59
+ }
60
+
61
+ }, function() {
62
+ $.data(this, 'cancel.tipsy', false);
63
+ var self = this;
64
+ setTimeout(function() {
65
+ if ($.data(this, 'cancel.tipsy')) return;
66
+ var tip = $.data(self, 'active.tipsy');
67
+ if (opts.fade) {
68
+ tip.stop().fadeOut(function() { $(this).remove(); });
69
+ } else {
70
+ tip.remove();
71
+ }
72
+ }, 100);
73
+
74
+ });
75
+
76
+ });
77
+
78
+ };
79
+
80
+ // Overwrite this method to provide options on a per-element basis.
81
+ // For example, you could store the gravity in a 'tipsy-gravity' attribute:
82
+ // return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });
83
+ // (remember - do not modify 'options' in place!)
84
+ $.fn.tipsy.elementOptions = function(ele, options) {
85
+ return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
86
+ };
87
+
88
+ $.fn.tipsy.defaults = {
89
+ fade: false,
90
+ fallback: '',
91
+ gravity: 'n',
92
+ html: false,
93
+ title: 'title'
94
+ };
95
+
96
+ $.fn.tipsy.autoNS = function() {
97
+ return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
98
+ };
99
+
100
+ $.fn.tipsy.autoWE = function() {
101
+ return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
102
+ };
103
+
104
+ })(jQuery);