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