welcolme is working now
[shapado:cantonics-shapado.git] / app / helpers / application_helper.rb
1 # Methods added to this helper will be available to all templates in the application.
2 module ApplicationHelper
3   def with_facebook?
4     return true if current_group.share.fb_active
5
6     if request.host =~ Regexp.new("#{AppConfig.domain}$", Regexp::IGNORECASE)
7       AppConfig.facebook["activate"]
8     else
9       false
10     end
11   end
12
13   def context_panel_ads(group)
14     if AppConfig.enable_adbard && request.domain == AppConfig.domain &&
15         !Adbard.find_by_group_id(current_group.id)
16       adbard = "<!--Ad Bard advertisement snippet, begin -->
17         <script type='text/javascript'>
18         var ab_h = '#{AppConfig.adbard_host_id}';
19         var ab_s = '#{AppConfig.adbard_site_key}';
20         </script>
21         <script type='text/javascript' src='http://cdn1.adbard.net/js/ab1.js'></script>
22         <!--Ad Bard, end -->"
23     else
24       adbard = ""
25     end
26     if group.has_custom_ads == true
27       ads = []
28       Ad.find_all_by_group_id_and_position(group.id,'context_panel').each do |ad|
29         ads << ad.code
30       end
31       ads << adbard
32       return ads.join unless ads.empty?
33     end
34   end
35
36   def header_ads(group)
37     if group.has_custom_ads
38       ads = []
39       Ad.where(:group_id => group.id,:position => 'header').each do |ad|
40         ads << ad.code
41       end
42       return ads.join  unless ads.empty?
43     end
44   end
45
46   def content_ads(group)
47     if group.has_custom_ads
48       ads = []
49       Ad.where(:group_id => group.id,:position => 'content').each do |ad|
50         ads << ad.code
51       end
52       return ads.join  unless ads.empty?
53     end
54   end
55
56   def footer_ads(group)
57     if group.has_custom_ads
58       ads = []
59       Ad.where(:group_id => group.id,:position => 'footer').each do |ad|
60         ads << ad.code
61       end
62       return ads.join  unless ads.empty?
63     end
64   end
65
66   def language_desc(langs)
67     (langs.kind_of?(Array) ? langs : [langs]).map do |lang|
68       I18n.t("languages.#{lang}", :default => lang).capitalize
69     end.join(', ')
70   end
71
72   def language_select(f, question, opts = {})
73     selected = if question.new?
74       logged_in? ? current_user.main_language : question.language
75     else
76       question.language
77     end
78     languages = logged_in? ? current_user.preferred_languages : current_group.languages
79
80     f.select :language, languages_options(languages), {:selected => selected}, {:class => "select"}.merge(opts)
81   end
82
83   def languages_options(languages=nil, current_languages = [])
84     languages = AVAILABLE_LANGUAGES-current_languages if languages.blank?
85     locales_options(languages)
86   end
87
88   def locales_options(languages=nil)
89     languages = AVAILABLE_LOCALES if languages.blank?
90
91     languages.collect do |lang|
92       [language_desc(lang), lang]
93     end
94   end
95
96   def tag_cloud(tags = [], options = {}, limit = nil)
97     if tags.empty?
98       tags = Question.tag_cloud({:group_id => current_group.id, :banned => false}.
99                         merge(language_conditions.merge(language_conditions)), limit)
100     end
101
102     return '' if tags.size <= 2
103
104     # Sizes: xxs xs s l xl xxl
105     css = {1 => "xxs", 2 => "xs", 3 => "s", 4 => "l", 5 => "xl" }
106     max_size = 5
107     min_size = 1
108
109     tag_class = options.delete(:tag_class) || "tag"
110
111     lowest_value = tags.min { |a, b| a["count"].to_i <=> b["count"].to_i }
112     highest_value = tags.max { |a, b| a["count"].to_i <=> b["count"].to_i }
113
114     spread = (highest_value["count"] - lowest_value["count"])
115     spread = 1 if spread == 0
116     ratio = (max_size - min_size) / spread
117
118     cloud = '<div class="tag_cloud">'
119     tags.each do |tag|
120       size = min_size + (tag["count"] - lowest_value["count"]) * ratio
121       url = url_for(:controller => "questions", :action => "index", :tags => tag["name"])
122       cloud << "<span>#{link_to(tag["name"], url, :class => "#{tag_class} #{css[size.round]}")}</span> "
123     end
124     cloud += "</div>"
125     cloud.html_safe
126   end
127
128   def country_flag(code, name)
129     if code
130       image_tag("flags/flag_#{code.downcase}.gif", :title => name, :alt => "")
131     end
132   end
133
134   def markdown(txt, options = {})
135     raw = options.delete(:raw)
136     body = render_page_links(txt.to_s, options)
137     txt = if raw
138       (defined?(RDiscount) ? RDiscount.new(body) : Maruku.new(body)).to_html
139     else
140       (defined?(RDiscount) ? RDiscount.new(body, :smart, :strict) : Maruku.new(sanitize(body))).to_html
141     end
142
143     if options[:sanitize] != false
144       txt = defined?(Sanitize) ? Sanitize.clean(txt, SANITIZE_CONFIG) : sanitize(txt)
145     end
146     txt.html_safe
147   end
148
149   def render_page_links(text, options = {})
150     group = options[:group]
151     group = current_group if group.nil?
152     in_controller = respond_to?(:logged_in?)
153
154     text.gsub!(/\[\[([^\,\[\'\"]+)\]\]/) do |m|
155       link = $1.split("|", 2)
156       # FIXME mongoid .only(:title, :slug).where()
157       page = Page.by_title(link.first, :group_id => group.id)
158
159
160       if page.present?
161         %@<a href="/pages/#{page.slug}" class="page_link">#{link[1] || page.title}</a>@
162       else
163         %@<a href="/pages/#{link.first.parameterize.to_s}?create=true&title=#{link.first}" class="missing_page">#{link.last}</a>@
164       end
165     end
166
167     return text if !in_controller
168
169     text.gsub(/%(\S+)%/) do |m|
170       case $1
171         when 'site'
172           group.domain
173         when 'site_name'
174           group.name
175         when 'current_user'
176           if logged_in?
177             link_to(current_user.login, user_path(current_user))
178           else
179             "anonymous"
180           end
181         when 'hottest_today'
182           question = Question.first(:activity_at.gt => Time.zone.now.yesterday, :order => "hotness desc, views_count asc", :group_id => group.id, :select => [:slug, :title])
183           if question.present?
184             link_to(question.title, question_path(question))
185           end
186         else
187           m
188       end
189     end
190   end
191
192   def format_number(number)
193     return if number.nil?
194
195     if number < 1000
196       number.to_s
197     elsif number >= 1000 && number < 1000000
198       "%.01fK" % (number/1000.0)
199     elsif number >= 1000000
200       "%.01fM" % (number/1000000.0)
201     end
202   end
203
204   def class_for_number(number)
205     return if number.nil?
206
207     if number >= 1000 && number < 10000
208       "medium_number"
209     elsif number >= 10000
210       "big_number"
211     elsif number < 0
212       "negative_number"
213     end
214   end
215
216   def shapado_auto_link(text, options = {})
217     text = auto_link(text, :all,  { "rel" => 'nofollow', :class => 'auto-link' })
218     if options[:link_users]
219       text = TwitterRenderer.auto_link_usernames_or_lists(text, :username_url_base => "#{users_path}/", :suppress_lists => true)
220     end
221
222     text
223   end
224
225   def require_js(*files)
226     content_for(:js) { javascript_include_tag(*files) }
227   end
228
229   def require_css(*files)
230     content_for(:css) { stylesheet_link_tag(*files) }
231   end
232
233   def render_tag(tag)
234     %@<span class="tag"><a href="#{questions_path(:tags => tag)}">#{@badge.token}</a></span>@
235   end
236
237   def class_for_question(question)
238     klass = ""
239
240     if question.accepted
241       klass << "accepted"
242     elsif !question.answered
243       klass << "unanswered"
244     end
245
246     if logged_in?
247       if current_user.is_preferred_tag?(current_group, *question.tags)
248         klass << " highlight"
249       end
250
251       if current_user == question.user
252         klass << " own_question"
253       end
254     end
255
256     klass
257   end
258
259   def googlean_script(analytics_id, domain)
260     "<script type=\"text/javascript\">
261        var _gaq = _gaq || [];
262        _gaq.push(['_setAccount', '#{analytics_id}']);
263        _gaq.push(['_trackPageview'],['_setDomainName', '#{domain}']);
264
265        (function() {
266          var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
267          ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
268          (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
269        })();
270     </script>"
271   end
272
273   def logged_out_language_filter
274     custom_lang = session["user.language_filter"]
275     case custom_lang
276     when "any"
277       languages = "any"
278     else
279       languages = session["user.language_filter"] || I18n.locale.to_s.split('-').first
280     end
281     languages
282   end
283
284   def clean_seo_keywords(tags, text = "")
285     if tags.size < 5
286
287       text.scan(/(\S+)/) do |s|
288         word = s.to_s.downcase
289         if word.length > 3 && !tags.include?(word)
290           tags << word
291         end
292
293         break if tags.size >= 5
294       end
295     end
296
297     tags.join(', ')
298   end
299
300   def current_announcements(hide_time = nil)
301     conditions = {:starts_at.lte => Time.zone.now.to_i,
302                   :ends_at.gte => Time.zone.now.to_i,
303                   :group_id.in => [current_group.id, nil]}
304     if hide_time
305       conditions[:updated_at] = {:$gt => hide_time}
306     end
307
308     if logged_in?
309       conditions[:only_anonymous] = false
310     end
311
312     Announcement.order_by(:starts_at.desc).where(conditions)
313   end
314
315   def top_bar_links
316     top_bar = current_group.custom_html.top_bar
317     return [] if top_bar.blank?
318
319     top_bar.split("\n").map do |line|
320       render_page_links(line.strip)
321     end
322   end
323
324   def gravatar(*args)
325     super(*args).html_safe
326   end
327
328   def include_latex
329     if current_group.enable_latex
330       require_js domain_url(:custom => current_group.domain)+'/javascripts/jsMath/easy/load.js'
331     end
332   end
333 end
334