social_stream 0.11.1 → 0.11.2

Sign up to get free protection for your applications and to get access to all the features.
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);