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.
- data/.gitignore +1 -0
- data/base/app/assets/images/tipsy.gif +0 -0
- data/base/app/assets/javascripts/activities.js.erb +23 -0
- data/base/app/assets/javascripts/invitations.js +7 -0
- data/base/app/assets/javascripts/profiles.js +4 -1
- data/base/app/assets/stylesheets/activities.css.scss +10 -5
- data/base/app/assets/stylesheets/base.css.scss +3 -2
- data/base/app/assets/stylesheets/frontpage.css.scss +2 -1
- data/base/app/assets/stylesheets/header.css.scss +5 -4
- data/base/app/controllers/groups_controller.rb +0 -6
- data/base/app/controllers/search_controller.rb +0 -4
- data/base/app/controllers/users_controller.rb +1 -6
- data/base/app/models/activity.rb +21 -7
- data/base/app/models/actor.rb +5 -3
- data/base/app/views/activities/_new.html.erb +13 -3
- data/base/app/views/activities/_options.html.erb +13 -4
- data/base/app/views/conversations/show.html.erb +1 -1
- data/base/app/views/conversations/show.js.erb +1 -1
- data/base/app/views/devise/registrations/edit.html.erb +1 -1
- data/base/app/views/devise/registrations/new.html.erb +1 -1
- data/base/app/views/devise/shared/_links.erb +6 -6
- data/base/app/views/frontpage/index.html.erb +3 -3
- data/base/app/views/groups/_new.html.erb +1 -1
- data/base/app/views/groups/show.html.erb +0 -5
- data/base/app/views/invitations/_new.html.erb +0 -5
- data/base/app/views/layouts/_header.erb +5 -44
- data/base/app/views/layouts/_header_signed_in.erb +44 -0
- data/base/app/views/layouts/_header_signed_out.erb +36 -0
- data/base/app/views/layouts/frontpage.html.erb +1 -1
- data/base/app/views/messages/_form.html.erb +3 -3
- data/base/app/views/messages/new.html.erb +2 -2
- data/base/app/views/messages/new.js.erb +1 -1
- data/base/app/views/posts/create.js.erb +2 -0
- data/base/app/views/profiles/edit.html.erb +6 -4
- data/base/app/views/search/index.html.erb +0 -4
- data/base/app/views/users/show.html.erb +0 -5
- data/base/config/locales/en.yml +33 -4
- data/base/config/locales/es.yml +33 -4
- data/base/lib/generators/social_stream/base/templates/initializer.rb +3 -0
- data/base/lib/social_stream-base.rb +4 -1
- data/base/lib/social_stream/base/version.rb +1 -1
- data/base/lib/social_stream/models/object.rb +2 -1
- data/base/social_stream-base.gemspec +3 -3
- data/base/spec/dummy/config/initializers/social_stream.rb +3 -0
- data/base/vendor/assets/javascripts/jquery.tipsy.js +104 -0
- data/base/vendor/assets/stylesheets/tipsy.css +7 -0
- data/events/app/views/frontpage/index.html.erb +3 -3
- data/events/config/locales/en.yml +1 -0
- data/events/lib/social_stream/events/version.rb +1 -1
- data/events/social_stream-events.gemspec +1 -1
- data/lib/social_stream/version.rb +1 -1
- data/social_stream.gemspec +2 -2
- metadata +15 -22
- data/base/app/assets/images/frontpage/join.gif +0 -0
- data/base/app/assets/stylesheets/ad_next.png +0 -0
- data/base/app/assets/stylesheets/ad_prev.png +0 -0
- data/base/app/assets/stylesheets/ad_scroll_back.png +0 -0
- data/base/app/assets/stylesheets/ad_scroll_forward.png +0 -0
- data/base/app/assets/stylesheets/jquery.ad-gallery.css +0 -171
- data/base/app/assets/stylesheets/loader.gif +0 -0
- data/base/app/views/frontpage/_header.html.erb +0 -30
- data/base/app/views/frontpage/_social_networks.html.erb +0 -5
- data/base/app/views/groups/_show_frontpage.html.erb +0 -11
- data/base/app/views/search/_index_frontpage.html.erb +0 -13
- 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>
|
@@ -14,20 +14,20 @@
|
|
14
14
|
<% end %>
|
15
15
|
<div class="block">
|
16
16
|
<div class="form_row">
|
17
|
-
<%= label_tag
|
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
|
-
|
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
|
-
|
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: "<%=
|
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"});
|
@@ -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
|
123
|
-
|
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" %>
|
data/base/config/locales/en.yml
CHANGED
@@ -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
|
-
|
21
|
-
|
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}"
|
data/base/config/locales/es.yml
CHANGED
@@ -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
|
-
|
21
|
-
|
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
|
@@ -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
|
-
|
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.
|
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.
|
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.
|
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);
|