##// END OF EJS Templates
Added icon on external wiki links...
Jean-Philippe Lang -
r594:efbe29249c49
parent child
Show More
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
@@ -1,290 +1,290
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class RedCloth
18 class RedCloth
19 # Patch for RedCloth. Fixed in RedCloth r128 but _why hasn't released it yet.
19 # Patch for RedCloth. Fixed in RedCloth r128 but _why hasn't released it yet.
20 # <a href="http://code.whytheluckystiff.net/redcloth/changeset/128">http://code.whytheluckystiff.net/redcloth/changeset/128</a>
20 # <a href="http://code.whytheluckystiff.net/redcloth/changeset/128">http://code.whytheluckystiff.net/redcloth/changeset/128</a>
21 def hard_break( text )
21 def hard_break( text )
22 text.gsub!( /(.)\n(?!\n|\Z| *([#*=]+(\s|$)|[{|]))/, "\\1<br />" ) if hard_breaks
22 text.gsub!( /(.)\n(?!\n|\Z| *([#*=]+(\s|$)|[{|]))/, "\\1<br />" ) if hard_breaks
23 end
23 end
24 end
24 end
25
25
26 module ApplicationHelper
26 module ApplicationHelper
27
27
28 # Return current logged in user or nil
28 # Return current logged in user or nil
29 def loggedin?
29 def loggedin?
30 @logged_in_user
30 @logged_in_user
31 end
31 end
32
32
33 # Return true if user is logged in and is admin, otherwise false
33 # Return true if user is logged in and is admin, otherwise false
34 def admin_loggedin?
34 def admin_loggedin?
35 @logged_in_user and @logged_in_user.admin?
35 @logged_in_user and @logged_in_user.admin?
36 end
36 end
37
37
38 # Return true if user is authorized for controller/action, otherwise false
38 # Return true if user is authorized for controller/action, otherwise false
39 def authorize_for(controller, action)
39 def authorize_for(controller, action)
40 # check if action is allowed on public projects
40 # check if action is allowed on public projects
41 if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ controller, action ]
41 if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ controller, action ]
42 return true
42 return true
43 end
43 end
44 # check if user is authorized
44 # check if user is authorized
45 if @logged_in_user and (@logged_in_user.admin? or Permission.allowed_to_role( "%s/%s" % [ controller, action ], @logged_in_user.role_for_project(@project) ) )
45 if @logged_in_user and (@logged_in_user.admin? or Permission.allowed_to_role( "%s/%s" % [ controller, action ], @logged_in_user.role_for_project(@project) ) )
46 return true
46 return true
47 end
47 end
48 return false
48 return false
49 end
49 end
50
50
51 # Display a link if user is authorized
51 # Display a link if user is authorized
52 def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
52 def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
53 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller], options[:action])
53 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller], options[:action])
54 end
54 end
55
55
56 # Display a link to user's account page
56 # Display a link to user's account page
57 def link_to_user(user)
57 def link_to_user(user)
58 link_to user.name, :controller => 'account', :action => 'show', :id => user
58 link_to user.name, :controller => 'account', :action => 'show', :id => user
59 end
59 end
60
60
61 def link_to_issue(issue)
61 def link_to_issue(issue)
62 link_to "#{issue.tracker.name} ##{issue.id}", :controller => "issues", :action => "show", :id => issue
62 link_to "#{issue.tracker.name} ##{issue.id}", :controller => "issues", :action => "show", :id => issue
63 end
63 end
64
64
65 def toggle_link(name, id, options={})
65 def toggle_link(name, id, options={})
66 onclick = "Element.toggle('#{id}'); "
66 onclick = "Element.toggle('#{id}'); "
67 onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
67 onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
68 onclick << "return false;"
68 onclick << "return false;"
69 link_to(name, "#", :onclick => onclick)
69 link_to(name, "#", :onclick => onclick)
70 end
70 end
71
71
72 def image_to_function(name, function, html_options = {})
72 def image_to_function(name, function, html_options = {})
73 html_options.symbolize_keys!
73 html_options.symbolize_keys!
74 tag(:input, html_options.merge({
74 tag(:input, html_options.merge({
75 :type => "image", :src => image_path(name),
75 :type => "image", :src => image_path(name),
76 :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function};"
76 :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function};"
77 }))
77 }))
78 end
78 end
79
79
80 def format_date(date)
80 def format_date(date)
81 return nil unless date
81 return nil unless date
82 @date_format_setting ||= Setting.date_format.to_i
82 @date_format_setting ||= Setting.date_format.to_i
83 @date_format_setting == 0 ? l_date(date) : date.strftime("%Y-%m-%d")
83 @date_format_setting == 0 ? l_date(date) : date.strftime("%Y-%m-%d")
84 end
84 end
85
85
86 def format_time(time)
86 def format_time(time)
87 return nil unless time
87 return nil unless time
88 @date_format_setting ||= Setting.date_format.to_i
88 @date_format_setting ||= Setting.date_format.to_i
89 time = time.to_time if time.is_a?(String)
89 time = time.to_time if time.is_a?(String)
90 @date_format_setting == 0 ? l_datetime(time) : (time.strftime("%Y-%m-%d") + ' ' + l_time(time))
90 @date_format_setting == 0 ? l_datetime(time) : (time.strftime("%Y-%m-%d") + ' ' + l_time(time))
91 end
91 end
92
92
93 def day_name(day)
93 def day_name(day)
94 l(:general_day_names).split(',')[day-1]
94 l(:general_day_names).split(',')[day-1]
95 end
95 end
96
96
97 def month_name(month)
97 def month_name(month)
98 l(:actionview_datehelper_select_month_names).split(',')[month-1]
98 l(:actionview_datehelper_select_month_names).split(',')[month-1]
99 end
99 end
100
100
101 def pagination_links_full(paginator, options={}, html_options={})
101 def pagination_links_full(paginator, options={}, html_options={})
102 page_param = options.delete(:page_param) || :page
102 page_param = options.delete(:page_param) || :page
103
103
104 html = ''
104 html = ''
105 html << link_to_remote(('&#171; ' + l(:label_previous)),
105 html << link_to_remote(('&#171; ' + l(:label_previous)),
106 {:update => "content", :url => options.merge(page_param => paginator.current.previous)},
106 {:update => "content", :url => options.merge(page_param => paginator.current.previous)},
107 {:href => url_for(:params => options.merge(page_param => paginator.current.previous))}) + ' ' if paginator.current.previous
107 {:href => url_for(:params => options.merge(page_param => paginator.current.previous))}) + ' ' if paginator.current.previous
108
108
109 html << (pagination_links_each(paginator, options) do |n|
109 html << (pagination_links_each(paginator, options) do |n|
110 link_to_remote(n.to_s,
110 link_to_remote(n.to_s,
111 {:url => {:params => options.merge(page_param => n)}, :update => 'content'},
111 {:url => {:params => options.merge(page_param => n)}, :update => 'content'},
112 {:href => url_for(:params => options.merge(page_param => n))})
112 {:href => url_for(:params => options.merge(page_param => n))})
113 end || '')
113 end || '')
114
114
115 html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
115 html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
116 {:update => "content", :url => options.merge(page_param => paginator.current.next)},
116 {:update => "content", :url => options.merge(page_param => paginator.current.next)},
117 {:href => url_for(:params => options.merge(page_param => paginator.current.next))}) if paginator.current.next
117 {:href => url_for(:params => options.merge(page_param => paginator.current.next))}) if paginator.current.next
118 html
118 html
119 end
119 end
120
120
121 # textilize text according to system settings and RedCloth availability
121 # textilize text according to system settings and RedCloth availability
122 def textilizable(text, options = {})
122 def textilizable(text, options = {})
123 return "" if text.blank?
123 return "" if text.blank?
124
124
125 # different methods for formatting wiki links
125 # different methods for formatting wiki links
126 case options[:wiki_links]
126 case options[:wiki_links]
127 when :local
127 when :local
128 # used for local links to html files
128 # used for local links to html files
129 format_wiki_link = Proc.new {|title| "#{title}.html" }
129 format_wiki_link = Proc.new {|title| "#{title}.html" }
130 when :anchor
130 when :anchor
131 # used for single-file wiki export
131 # used for single-file wiki export
132 format_wiki_link = Proc.new {|title| "##{title}" }
132 format_wiki_link = Proc.new {|title| "##{title}" }
133 else
133 else
134 if @project
134 if @project
135 format_wiki_link = Proc.new {|title| url_for :controller => 'wiki', :action => 'index', :id => @project, :page => title }
135 format_wiki_link = Proc.new {|title| url_for :controller => 'wiki', :action => 'index', :id => @project, :page => title }
136 else
136 else
137 format_wiki_link = Proc.new {|title| title }
137 format_wiki_link = Proc.new {|title| title }
138 end
138 end
139 end
139 end
140
140
141 # turn wiki links into textile links:
141 # turn wiki links into textile links:
142 # example:
142 # example:
143 # [[link]] -> "link":link
143 # [[link]] -> "link":link
144 # [[link|title]] -> "title":link
144 # [[link|title]] -> "title":link
145 text = text.gsub(/\[\[([^\]\|]+)(\|([^\]\|]+))?\]\]/) {|m| "\"#{$3 || $1}\":" + format_wiki_link.call(Wiki.titleize($1)) }
145 text = text.gsub(/\[\[([^\]\|]+)(\|([^\]\|]+))?\]\]/) {|m| link_to(($3 || $1), format_wiki_link.call(Wiki.titleize($1)), :class => 'wiki-page') }
146
146
147 # turn issue ids into links
147 # turn issue ids into links
148 # example:
148 # example:
149 # #52 -> <a href="/issues/show/52">#52</a>
149 # #52 -> <a href="/issues/show/52">#52</a>
150 text = text.gsub(/#(\d+)(?=\b)/) {|m| link_to "##{$1}", :controller => 'issues', :action => 'show', :id => $1}
150 text = text.gsub(/#(\d+)(?=\b)/) {|m| link_to "##{$1}", {:controller => 'issues', :action => 'show', :id => $1}, :class => 'issue' }
151
151
152 # turn revision ids into links (@project needed)
152 # turn revision ids into links (@project needed)
153 # example:
153 # example:
154 # r52 -> <a href="/repositories/revision/6?rev=52">r52</a> (@project.id is 6)
154 # r52 -> <a href="/repositories/revision/6?rev=52">r52</a> (@project.id is 6)
155 text = text.gsub(/(?=\b)r(\d+)(?=\b)/) {|m| link_to "r#{$1}", :controller => 'repositories', :action => 'revision', :id => @project.id, :rev => $1} if @project
155 text = text.gsub(/(?=\b)r(\d+)(?=\b)/) {|m| link_to "r#{$1}", {:controller => 'repositories', :action => 'revision', :id => @project.id, :rev => $1}, :class => 'changeset' } if @project
156
156
157 # when using an image link, try to use an attachment, if possible
157 # when using an image link, try to use an attachment, if possible
158 attachments = options[:attachments]
158 attachments = options[:attachments]
159 if attachments
159 if attachments
160 text = text.gsub(/!([<>=]*)(\S+\.(gif|jpg|jpeg|png))!/) do |m|
160 text = text.gsub(/!([<>=]*)(\S+\.(gif|jpg|jpeg|png))!/) do |m|
161 align = $1
161 align = $1
162 filename = $2
162 filename = $2
163 rf = Regexp.new(filename, Regexp::IGNORECASE)
163 rf = Regexp.new(filename, Regexp::IGNORECASE)
164 # search for the picture in attachments
164 # search for the picture in attachments
165 if found = attachments.detect { |att| att.filename =~ rf }
165 if found = attachments.detect { |att| att.filename =~ rf }
166 image_url = url_for :controller => 'attachments', :action => 'show', :id => found.id
166 image_url = url_for :controller => 'attachments', :action => 'show', :id => found.id
167 "!#{align}#{image_url}!"
167 "!#{align}#{image_url}!"
168 else
168 else
169 "!#{align}#{filename}!"
169 "!#{align}#{filename}!"
170 end
170 end
171 end
171 end
172 end
172 end
173
173
174 # finally textilize text
174 # finally textilize text
175 @do_textilize ||= (Setting.text_formatting == 'textile') && (ActionView::Helpers::TextHelper.method_defined? "textilize")
175 @do_textilize ||= (Setting.text_formatting == 'textile') && (ActionView::Helpers::TextHelper.method_defined? "textilize")
176 text = @do_textilize ? auto_link(RedCloth.new(text, [:hard_breaks]).to_html) : simple_format(auto_link(h(text)))
176 text = @do_textilize ? auto_link(RedCloth.new(text, [:hard_breaks]).to_html) : simple_format(auto_link(h(text)))
177 end
177 end
178
178
179 # Same as Rails' simple_format helper without using paragraphs
179 # Same as Rails' simple_format helper without using paragraphs
180 def simple_format_without_paragraph(text)
180 def simple_format_without_paragraph(text)
181 text.to_s.
181 text.to_s.
182 gsub(/\r\n?/, "\n"). # \r\n and \r -> \n
182 gsub(/\r\n?/, "\n"). # \r\n and \r -> \n
183 gsub(/\n\n+/, "<br /><br />"). # 2+ newline -> 2 br
183 gsub(/\n\n+/, "<br /><br />"). # 2+ newline -> 2 br
184 gsub(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
184 gsub(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
185 end
185 end
186
186
187 def error_messages_for(object_name, options = {})
187 def error_messages_for(object_name, options = {})
188 options = options.symbolize_keys
188 options = options.symbolize_keys
189 object = instance_variable_get("@#{object_name}")
189 object = instance_variable_get("@#{object_name}")
190 if object && !object.errors.empty?
190 if object && !object.errors.empty?
191 # build full_messages here with controller current language
191 # build full_messages here with controller current language
192 full_messages = []
192 full_messages = []
193 object.errors.each do |attr, msg|
193 object.errors.each do |attr, msg|
194 next if msg.nil?
194 next if msg.nil?
195 msg = msg.first if msg.is_a? Array
195 msg = msg.first if msg.is_a? Array
196 if attr == "base"
196 if attr == "base"
197 full_messages << l(msg)
197 full_messages << l(msg)
198 else
198 else
199 full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
199 full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
200 end
200 end
201 end
201 end
202 # retrieve custom values error messages
202 # retrieve custom values error messages
203 if object.errors[:custom_values]
203 if object.errors[:custom_values]
204 object.custom_values.each do |v|
204 object.custom_values.each do |v|
205 v.errors.each do |attr, msg|
205 v.errors.each do |attr, msg|
206 next if msg.nil?
206 next if msg.nil?
207 msg = msg.first if msg.is_a? Array
207 msg = msg.first if msg.is_a? Array
208 full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
208 full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
209 end
209 end
210 end
210 end
211 end
211 end
212 content_tag("div",
212 content_tag("div",
213 content_tag(
213 content_tag(
214 options[:header_tag] || "h2", lwr(:gui_validation_error, full_messages.length) + " :"
214 options[:header_tag] || "h2", lwr(:gui_validation_error, full_messages.length) + " :"
215 ) +
215 ) +
216 content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
216 content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
217 "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
217 "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
218 )
218 )
219 else
219 else
220 ""
220 ""
221 end
221 end
222 end
222 end
223
223
224 def lang_options_for_select(blank=true)
224 def lang_options_for_select(blank=true)
225 (blank ? [["(auto)", ""]] : []) +
225 (blank ? [["(auto)", ""]] : []) +
226 GLoc.valid_languages.collect{|lang| [ ll(lang.to_s, :general_lang_name), lang.to_s]}.sort{|x,y| x.first <=> y.first }
226 GLoc.valid_languages.collect{|lang| [ ll(lang.to_s, :general_lang_name), lang.to_s]}.sort{|x,y| x.first <=> y.first }
227 end
227 end
228
228
229 def label_tag_for(name, option_tags = nil, options = {})
229 def label_tag_for(name, option_tags = nil, options = {})
230 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
230 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
231 content_tag("label", label_text)
231 content_tag("label", label_text)
232 end
232 end
233
233
234 def labelled_tabular_form_for(name, object, options, &proc)
234 def labelled_tabular_form_for(name, object, options, &proc)
235 options[:html] ||= {}
235 options[:html] ||= {}
236 options[:html].store :class, "tabular"
236 options[:html].store :class, "tabular"
237 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
237 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
238 end
238 end
239
239
240 def check_all_links(form_name)
240 def check_all_links(form_name)
241 link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
241 link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
242 " | " +
242 " | " +
243 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
243 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
244 end
244 end
245
245
246 def calendar_for(field_id)
246 def calendar_for(field_id)
247 image_tag("calendar.png", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
247 image_tag("calendar.png", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
248 javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
248 javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
249 end
249 end
250
250
251 def wikitoolbar_for(field_id)
251 def wikitoolbar_for(field_id)
252 return '' unless Setting.text_formatting == 'textile'
252 return '' unless Setting.text_formatting == 'textile'
253 javascript_include_tag('jstoolbar') + javascript_tag("var toolbar = new jsToolBar($('#{field_id}')); toolbar.draw();")
253 javascript_include_tag('jstoolbar') + javascript_tag("var toolbar = new jsToolBar($('#{field_id}')); toolbar.draw();")
254 end
254 end
255 end
255 end
256
256
257 class TabularFormBuilder < ActionView::Helpers::FormBuilder
257 class TabularFormBuilder < ActionView::Helpers::FormBuilder
258 include GLoc
258 include GLoc
259
259
260 def initialize(object_name, object, template, options, proc)
260 def initialize(object_name, object, template, options, proc)
261 set_language_if_valid options.delete(:lang)
261 set_language_if_valid options.delete(:lang)
262 @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc
262 @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc
263 end
263 end
264
264
265 (field_helpers - %w(radio_button hidden_field) + %w(date_select)).each do |selector|
265 (field_helpers - %w(radio_button hidden_field) + %w(date_select)).each do |selector|
266 src = <<-END_SRC
266 src = <<-END_SRC
267 def #{selector}(field, options = {})
267 def #{selector}(field, options = {})
268 return super if options.delete :no_label
268 return super if options.delete :no_label
269 label_text = l(options[:label]) if options[:label]
269 label_text = l(options[:label]) if options[:label]
270 label_text ||= l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym)
270 label_text ||= l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym)
271 label_text << @template.content_tag("span", " *", :class => "required") if options.delete(:required)
271 label_text << @template.content_tag("span", " *", :class => "required") if options.delete(:required)
272 label = @template.content_tag("label", label_text,
272 label = @template.content_tag("label", label_text,
273 :class => (@object && @object.errors[field] ? "error" : nil),
273 :class => (@object && @object.errors[field] ? "error" : nil),
274 :for => (@object_name.to_s + "_" + field.to_s))
274 :for => (@object_name.to_s + "_" + field.to_s))
275 label + super
275 label + super
276 end
276 end
277 END_SRC
277 END_SRC
278 class_eval src, __FILE__, __LINE__
278 class_eval src, __FILE__, __LINE__
279 end
279 end
280
280
281 def select(field, choices, options = {}, html_options = {})
281 def select(field, choices, options = {}, html_options = {})
282 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
282 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
283 label = @template.content_tag("label", label_text,
283 label = @template.content_tag("label", label_text,
284 :class => (@object && @object.errors[field] ? "error" : nil),
284 :class => (@object && @object.errors[field] ? "error" : nil),
285 :for => (@object_name.to_s + "_" + field.to_s))
285 :for => (@object_name.to_s + "_" + field.to_s))
286 label + super
286 label + super
287 end
287 end
288
288
289 end
289 end
290
290
@@ -1,685 +1,697
1 /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */
1 /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */
2 /* Edited by Jean-Philippe Lang *>
2 /* Edited by Jean-Philippe Lang *>
3 /**************** Body and tag styles ****************/
3 /**************** Body and tag styles ****************/
4
4
5 #header * {margin:0; padding:0;}
5 #header * {margin:0; padding:0;}
6 p, ul, ol, li {margin:0; padding:0;}
6 p, ul, ol, li {margin:0; padding:0;}
7
7
8 body{
8 body{
9 font:76% Verdana,Tahoma,Arial,sans-serif;
9 font:76% Verdana,Tahoma,Arial,sans-serif;
10 line-height:1.4em;
10 line-height:1.4em;
11 text-align:center;
11 text-align:center;
12 color:#303030;
12 color:#303030;
13 background:#e8eaec;
13 background:#e8eaec;
14 margin:0;
14 margin:0;
15 }
15 }
16
16
17 a{color:#467aa7;font-weight:bold;text-decoration:none;background-color:inherit;}
17 a{color:#467aa7;font-weight:bold;text-decoration:none;background-color:inherit;}
18 a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;}
18 a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;}
19 a img{border:none;}
19 a img{border:none;}
20
20
21 p{margin:0 0 1em 0;}
21 p{margin:0 0 1em 0;}
22 p form{margin-top:0; margin-bottom:20px;}
22 p form{margin-top:0; margin-bottom:20px;}
23
23
24 img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;}
24 img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;}
25 img.left{float:left; margin:0 12px 5px 0;}
25 img.left{float:left; margin:0 12px 5px 0;}
26 img.center{display:block; margin:0 auto 5px auto;}
26 img.center{display:block; margin:0 auto 5px auto;}
27 img.right{float:right; margin:0 0 5px 12px;}
27 img.right{float:right; margin:0 0 5px 12px;}
28
28
29 /**************** Header and navigation styles ****************/
29 /**************** Header and navigation styles ****************/
30
30
31 #container{
31 #container{
32 width:100%;
32 width:100%;
33 min-width: 800px;
33 min-width: 800px;
34 margin:0;
34 margin:0;
35 padding:0;
35 padding:0;
36 text-align:left;
36 text-align:left;
37 background:#ffffff;
37 background:#ffffff;
38 color:#303030;
38 color:#303030;
39 }
39 }
40
40
41 #header{
41 #header{
42 height:4.5em;
42 height:4.5em;
43 margin:0;
43 margin:0;
44 background:#467aa7;
44 background:#467aa7;
45 color:#ffffff;
45 color:#ffffff;
46 margin-bottom:1px;
46 margin-bottom:1px;
47 }
47 }
48
48
49 #header h1{
49 #header h1{
50 padding:10px 0 0 20px;
50 padding:10px 0 0 20px;
51 font-size:2em;
51 font-size:2em;
52 background-color:inherit;
52 background-color:inherit;
53 color:#fff;
53 color:#fff;
54 letter-spacing:-1px;
54 letter-spacing:-1px;
55 font-weight:bold;
55 font-weight:bold;
56 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
56 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
57 }
57 }
58
58
59 #header h2{
59 #header h2{
60 margin:3px 0 0 40px;
60 margin:3px 0 0 40px;
61 font-size:1.5em;
61 font-size:1.5em;
62 background-color:inherit;
62 background-color:inherit;
63 color:#f0f2f4;
63 color:#f0f2f4;
64 letter-spacing:-1px;
64 letter-spacing:-1px;
65 font-weight:normal;
65 font-weight:normal;
66 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
66 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
67 }
67 }
68
68
69 #header a {color:#fff;}
69 #header a {color:#fff;}
70
70
71 #navigation{
71 #navigation{
72 height:2.2em;
72 height:2.2em;
73 line-height:2.2em;
73 line-height:2.2em;
74 margin:0;
74 margin:0;
75 background:#578bb8;
75 background:#578bb8;
76 color:#ffffff;
76 color:#ffffff;
77 }
77 }
78
78
79 #navigation li{
79 #navigation li{
80 float:left;
80 float:left;
81 list-style-type:none;
81 list-style-type:none;
82 border-right:1px solid #ffffff;
82 border-right:1px solid #ffffff;
83 white-space:nowrap;
83 white-space:nowrap;
84 }
84 }
85
85
86 #navigation li.right {
86 #navigation li.right {
87 float:right;
87 float:right;
88 list-style-type:none;
88 list-style-type:none;
89 border-right:0;
89 border-right:0;
90 border-left:1px solid #ffffff;
90 border-left:1px solid #ffffff;
91 white-space:nowrap;
91 white-space:nowrap;
92 }
92 }
93
93
94 #navigation li a{
94 #navigation li a{
95 display:block;
95 display:block;
96 padding:0px 10px 0px 22px;
96 padding:0px 10px 0px 22px;
97 font-size:0.8em;
97 font-size:0.8em;
98 font-weight:normal;
98 font-weight:normal;
99 text-decoration:none;
99 text-decoration:none;
100 background-color:inherit;
100 background-color:inherit;
101 color: #ffffff;
101 color: #ffffff;
102 }
102 }
103
103
104 #navigation li.submenu {background:url(../images/arrow_down.png) 96% 80% no-repeat;}
104 #navigation li.submenu {background:url(../images/arrow_down.png) 96% 80% no-repeat;}
105 #navigation li.submenu a {padding:0px 16px 0px 22px;}
105 #navigation li.submenu a {padding:0px 16px 0px 22px;}
106 * html #navigation a {width:1%;}
106 * html #navigation a {width:1%;}
107
107
108 #navigation .selected,#navigation a:hover{
108 #navigation .selected,#navigation a:hover{
109 color:#ffffff;
109 color:#ffffff;
110 text-decoration:none;
110 text-decoration:none;
111 background-color: #80b0da;
111 background-color: #80b0da;
112 }
112 }
113
113
114 /**************** Icons *******************/
114 /**************** Icons *******************/
115 .icon {
115 .icon {
116 background-position: 0% 40%;
116 background-position: 0% 40%;
117 background-repeat: no-repeat;
117 background-repeat: no-repeat;
118 padding-left: 20px;
118 padding-left: 20px;
119 padding-top: 2px;
119 padding-top: 2px;
120 padding-bottom: 3px;
120 padding-bottom: 3px;
121 vertical-align: middle;
121 vertical-align: middle;
122 }
122 }
123
123
124 #navigation .icon {
124 #navigation .icon {
125 background-position: 4px 50%;
125 background-position: 4px 50%;
126 }
126 }
127
127
128 .icon22 {
128 .icon22 {
129 background-position: 0% 40%;
129 background-position: 0% 40%;
130 background-repeat: no-repeat;
130 background-repeat: no-repeat;
131 padding-left: 26px;
131 padding-left: 26px;
132 line-height: 22px;
132 line-height: 22px;
133 vertical-align: middle;
133 vertical-align: middle;
134 }
134 }
135
135
136 .icon-add { background-image: url(../images/add.png); }
136 .icon-add { background-image: url(../images/add.png); }
137 .icon-edit { background-image: url(../images/edit.png); }
137 .icon-edit { background-image: url(../images/edit.png); }
138 .icon-del { background-image: url(../images/delete.png); }
138 .icon-del { background-image: url(../images/delete.png); }
139 .icon-move { background-image: url(../images/move.png); }
139 .icon-move { background-image: url(../images/move.png); }
140 .icon-save { background-image: url(../images/save.png); }
140 .icon-save { background-image: url(../images/save.png); }
141 .icon-cancel { background-image: url(../images/cancel.png); }
141 .icon-cancel { background-image: url(../images/cancel.png); }
142 .icon-pdf { background-image: url(../images/pdf.png); }
142 .icon-pdf { background-image: url(../images/pdf.png); }
143 .icon-csv { background-image: url(../images/csv.png); }
143 .icon-csv { background-image: url(../images/csv.png); }
144 .icon-html { background-image: url(../images/html.png); }
144 .icon-html { background-image: url(../images/html.png); }
145 .icon-txt { background-image: url(../images/txt.png); }
145 .icon-txt { background-image: url(../images/txt.png); }
146 .icon-file { background-image: url(../images/file.png); }
146 .icon-file { background-image: url(../images/file.png); }
147 .icon-folder { background-image: url(../images/folder.png); }
147 .icon-folder { background-image: url(../images/folder.png); }
148 .icon-package { background-image: url(../images/package.png); }
148 .icon-package { background-image: url(../images/package.png); }
149 .icon-home { background-image: url(../images/home.png); }
149 .icon-home { background-image: url(../images/home.png); }
150 .icon-user { background-image: url(../images/user.png); }
150 .icon-user { background-image: url(../images/user.png); }
151 .icon-mypage { background-image: url(../images/user_page.png); }
151 .icon-mypage { background-image: url(../images/user_page.png); }
152 .icon-admin { background-image: url(../images/admin.png); }
152 .icon-admin { background-image: url(../images/admin.png); }
153 .icon-projects { background-image: url(../images/projects.png); }
153 .icon-projects { background-image: url(../images/projects.png); }
154 .icon-logout { background-image: url(../images/logout.png); }
154 .icon-logout { background-image: url(../images/logout.png); }
155 .icon-help { background-image: url(../images/help.png); }
155 .icon-help { background-image: url(../images/help.png); }
156 .icon-attachment { background-image: url(../images/attachment.png); }
156 .icon-attachment { background-image: url(../images/attachment.png); }
157 .icon-index { background-image: url(../images/index.png); }
157 .icon-index { background-image: url(../images/index.png); }
158 .icon-history { background-image: url(../images/history.png); }
158 .icon-history { background-image: url(../images/history.png); }
159 .icon-feed { background-image: url(../images/feed.png); }
159 .icon-feed { background-image: url(../images/feed.png); }
160 .icon-time { background-image: url(../images/time.png); }
160 .icon-time { background-image: url(../images/time.png); }
161 .icon-stats { background-image: url(../images/stats.png); }
161 .icon-stats { background-image: url(../images/stats.png); }
162 .icon-warning { background-image: url(../images/warning.png); }
162 .icon-warning { background-image: url(../images/warning.png); }
163 .icon-fav { background-image: url(../images/fav.png); }
163 .icon-fav { background-image: url(../images/fav.png); }
164 .icon-fav-off { background-image: url(../images/fav_off.png); }
164 .icon-fav-off { background-image: url(../images/fav_off.png); }
165 .icon-reload { background-image: url(../images/reload.png); }
165 .icon-reload { background-image: url(../images/reload.png); }
166 .icon-lock { background-image: url(../images/locked.png); }
166 .icon-lock { background-image: url(../images/locked.png); }
167 .icon-unlock { background-image: url(../images/unlock.png); }
167 .icon-unlock { background-image: url(../images/unlock.png); }
168
168
169 .icon22-projects { background-image: url(../images/22x22/projects.png); }
169 .icon22-projects { background-image: url(../images/22x22/projects.png); }
170 .icon22-users { background-image: url(../images/22x22/users.png); }
170 .icon22-users { background-image: url(../images/22x22/users.png); }
171 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
171 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
172 .icon22-role { background-image: url(../images/22x22/role.png); }
172 .icon22-role { background-image: url(../images/22x22/role.png); }
173 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
173 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
174 .icon22-options { background-image: url(../images/22x22/options.png); }
174 .icon22-options { background-image: url(../images/22x22/options.png); }
175 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
175 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
176 .icon22-authent { background-image: url(../images/22x22/authent.png); }
176 .icon22-authent { background-image: url(../images/22x22/authent.png); }
177 .icon22-info { background-image: url(../images/22x22/info.png); }
177 .icon22-info { background-image: url(../images/22x22/info.png); }
178 .icon22-comment { background-image: url(../images/22x22/comment.png); }
178 .icon22-comment { background-image: url(../images/22x22/comment.png); }
179 .icon22-package { background-image: url(../images/22x22/package.png); }
179 .icon22-package { background-image: url(../images/22x22/package.png); }
180 .icon22-settings { background-image: url(../images/22x22/settings.png); }
180 .icon22-settings { background-image: url(../images/22x22/settings.png); }
181
181
182 /**************** Content styles ****************/
182 /**************** Content styles ****************/
183
183
184 html>body #content {
184 html>body #content {
185 height: auto;
185 height: auto;
186 min-height: 500px;
186 min-height: 500px;
187 }
187 }
188
188
189 #content{
189 #content{
190 width: auto;
190 width: auto;
191 height:500px;
191 height:500px;
192 font-size:0.9em;
192 font-size:0.9em;
193 padding:20px 10px 10px 20px;
193 padding:20px 10px 10px 20px;
194 margin-left: 120px;
194 margin-left: 120px;
195 border-left: 1px dashed #c0c0c0;
195 border-left: 1px dashed #c0c0c0;
196
196
197 }
197 }
198
198
199 #content h2, #content div.wiki h1 {
199 #content h2, #content div.wiki h1 {
200 display:block;
200 display:block;
201 margin:0 0 16px 0;
201 margin:0 0 16px 0;
202 font-size:1.7em;
202 font-size:1.7em;
203 font-weight:normal;
203 font-weight:normal;
204 letter-spacing:-1px;
204 letter-spacing:-1px;
205 color:#606060;
205 color:#606060;
206 background-color:inherit;
206 background-color:inherit;
207 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
207 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
208 }
208 }
209
209
210 #content h2 a{font-weight:normal;}
210 #content h2 a{font-weight:normal;}
211 #content h3{margin:0 0 12px 0; font-size:1.4em;color:#707070;font-family: Trebuchet MS,Georgia,"Times New Roman",serif;}
211 #content h3{margin:0 0 12px 0; font-size:1.4em;color:#707070;font-family: Trebuchet MS,Georgia,"Times New Roman",serif;}
212 #content h4{font-size: 1em; margin-bottom: 12px; margin-top: 20px; font-weight: normal; border-bottom: dotted 1px #c0c0c0;}
212 #content h4{font-size: 1em; margin-bottom: 12px; margin-top: 20px; font-weight: normal; border-bottom: dotted 1px #c0c0c0;}
213 #content a:hover,#subcontent a:hover{text-decoration:underline;}
213 #content a:hover,#subcontent a:hover{text-decoration:underline;}
214 #content ul,#content ol{margin:0 5px 16px 35px;}
214 #content ul,#content ol{margin:0 5px 16px 35px;}
215 #content dl{margin:0 5px 10px 25px;}
215 #content dl{margin:0 5px 10px 25px;}
216 #content dt{font-weight:bold; margin-bottom:5px;}
216 #content dt{font-weight:bold; margin-bottom:5px;}
217 #content dd{margin:0 0 10px 15px;}
217 #content dd{margin:0 0 10px 15px;}
218
218
219 #content .tabs{height: 2.6em;}
219 #content .tabs{height: 2.6em;}
220 #content .tabs ul{margin:0;}
220 #content .tabs ul{margin:0;}
221 #content .tabs ul li{
221 #content .tabs ul li{
222 float:left;
222 float:left;
223 list-style-type:none;
223 list-style-type:none;
224 white-space:nowrap;
224 white-space:nowrap;
225 margin-right:8px;
225 margin-right:8px;
226 background:#fff;
226 background:#fff;
227 }
227 }
228 #content .tabs ul li a{
228 #content .tabs ul li a{
229 display:block;
229 display:block;
230 font-size: 0.9em;
230 font-size: 0.9em;
231 text-decoration:none;
231 text-decoration:none;
232 line-height:1em;
232 line-height:1em;
233 padding:4px;
233 padding:4px;
234 border: 1px solid #c0c0c0;
234 border: 1px solid #c0c0c0;
235 }
235 }
236
236
237 #content .tabs ul li a.selected, #content .tabs ul li a:hover{
237 #content .tabs ul li a.selected, #content .tabs ul li a:hover{
238 background-color: #80b0da;
238 background-color: #80b0da;
239 border: 1px solid #80b0da;
239 border: 1px solid #80b0da;
240 color: #fff;
240 color: #fff;
241 text-decoration:none;
241 text-decoration:none;
242 }
242 }
243
243
244 /***********************************************/
244 /***********************************************/
245
245
246 form {display: inline;}
246 form {display: inline;}
247 blockquote {padding-left: 6px; border-left: 2px solid #ccc;}
247 blockquote {padding-left: 6px; border-left: 2px solid #ccc;}
248 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
248 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
249
249
250 input.button-small {font-size: 0.8em;}
250 input.button-small {font-size: 0.8em;}
251 textarea.wiki-edit { width: 99.5%; }
251 textarea.wiki-edit { width: 99.5%; }
252 .select-small {font-size: 0.8em;}
252 .select-small {font-size: 0.8em;}
253 label {font-weight: bold; font-size: 1em; color: #505050;}
253 label {font-weight: bold; font-size: 1em; color: #505050;}
254 fieldset {border:1px solid #c0c0c0; padding: 6px;}
254 fieldset {border:1px solid #c0c0c0; padding: 6px;}
255 legend {color: #505050;}
255 legend {color: #505050;}
256 .required {color: #bb0000;}
256 .required {color: #bb0000;}
257 .odd {background-color:#f6f7f8;}
257 .odd {background-color:#f6f7f8;}
258 .even {background-color: #fff;}
258 .even {background-color: #fff;}
259 hr { border:0; border-top: dotted 1px #fff; border-bottom: dotted 1px #c0c0c0; }
259 hr { border:0; border-top: dotted 1px #fff; border-bottom: dotted 1px #c0c0c0; }
260 table p {margin:0; padding:0;}
260 table p {margin:0; padding:0;}
261
261
262 .highlight { background-color: #FCFD8D;}
262 .highlight { background-color: #FCFD8D;}
263
263
264 div.square {
264 div.square {
265 border: 1px solid #999;
265 border: 1px solid #999;
266 float: left;
266 float: left;
267 margin: .4em .5em 0 0;
267 margin: .4em .5em 0 0;
268 overflow: hidden;
268 overflow: hidden;
269 width: .6em; height: .6em;
269 width: .6em; height: .6em;
270 }
270 }
271
271
272 ul.documents {
272 ul.documents {
273 list-style-type: none;
273 list-style-type: none;
274 padding: 0;
274 padding: 0;
275 margin: 0;
275 margin: 0;
276 }
276 }
277
277
278 ul.documents li {
278 ul.documents li {
279 background-image: url(../images/32x32/file.png);
279 background-image: url(../images/32x32/file.png);
280 background-repeat: no-repeat;
280 background-repeat: no-repeat;
281 background-position: 0 1px;
281 background-position: 0 1px;
282 padding-left: 36px;
282 padding-left: 36px;
283 margin-bottom: 10px;
283 margin-bottom: 10px;
284 margin-left: -37px;
284 margin-left: -37px;
285 }
285 }
286
286
287 /********** Table used to display lists of things ***********/
287 /********** Table used to display lists of things ***********/
288
288
289 table.list {
289 table.list {
290 width:100%;
290 width:100%;
291 border-collapse: collapse;
291 border-collapse: collapse;
292 border: 1px dotted #d0d0d0;
292 border: 1px dotted #d0d0d0;
293 margin-bottom: 6px;
293 margin-bottom: 6px;
294 }
294 }
295
295
296 table.with-cells td {
296 table.with-cells td {
297 border: 1px solid #d7d7d7;
297 border: 1px solid #d7d7d7;
298 }
298 }
299
299
300 table.list td {
300 table.list td {
301 padding:2px;
301 padding:2px;
302 }
302 }
303
303
304 table.list thead th {
304 table.list thead th {
305 text-align: center;
305 text-align: center;
306 background: #eee;
306 background: #eee;
307 border: 1px solid #d7d7d7;
307 border: 1px solid #d7d7d7;
308 color: #777;
308 color: #777;
309 }
309 }
310
310
311 table.list tbody th {
311 table.list tbody th {
312 font-weight: bold;
312 font-weight: bold;
313 background: #eed;
313 background: #eed;
314 border: 1px solid #d7d7d7;
314 border: 1px solid #d7d7d7;
315 color: #777;
315 color: #777;
316 }
316 }
317
317
318 /********** Validation error messages *************/
318 /********** Validation error messages *************/
319 #errorExplanation {
319 #errorExplanation {
320 width: 400px;
320 width: 400px;
321 border: 0;
321 border: 0;
322 padding: 7px;
322 padding: 7px;
323 padding-bottom: 3px;
323 padding-bottom: 3px;
324 margin-bottom: 0px;
324 margin-bottom: 0px;
325 }
325 }
326
326
327 #errorExplanation h2 {
327 #errorExplanation h2 {
328 text-align: left;
328 text-align: left;
329 font-weight: bold;
329 font-weight: bold;
330 padding: 5px 5px 10px 26px;
330 padding: 5px 5px 10px 26px;
331 font-size: 1em;
331 font-size: 1em;
332 margin: -7px;
332 margin: -7px;
333 background: url(../images/alert.png) no-repeat 6px 6px;
333 background: url(../images/alert.png) no-repeat 6px 6px;
334 }
334 }
335
335
336 #errorExplanation p {
336 #errorExplanation p {
337 color: #333;
337 color: #333;
338 margin-bottom: 0;
338 margin-bottom: 0;
339 padding: 5px;
339 padding: 5px;
340 }
340 }
341
341
342 #errorExplanation ul li {
342 #errorExplanation ul li {
343 font-size: 1em;
343 font-size: 1em;
344 list-style: none;
344 list-style: none;
345 margin-left: -16px;
345 margin-left: -16px;
346 }
346 }
347
347
348 /*========== Drop down menu ==============*/
348 /*========== Drop down menu ==============*/
349 div.menu {
349 div.menu {
350 background-color: #FFFFFF;
350 background-color: #FFFFFF;
351 border-style: solid;
351 border-style: solid;
352 border-width: 1px;
352 border-width: 1px;
353 border-color: #7F9DB9;
353 border-color: #7F9DB9;
354 position: absolute;
354 position: absolute;
355 top: 0px;
355 top: 0px;
356 left: 0px;
356 left: 0px;
357 padding: 0;
357 padding: 0;
358 visibility: hidden;
358 visibility: hidden;
359 z-index: 101;
359 z-index: 101;
360 }
360 }
361
361
362 div.menu a.menuItem {
362 div.menu a.menuItem {
363 font-size: 10px;
363 font-size: 10px;
364 font-weight: normal;
364 font-weight: normal;
365 line-height: 2em;
365 line-height: 2em;
366 color: #000000;
366 color: #000000;
367 background-color: #FFFFFF;
367 background-color: #FFFFFF;
368 cursor: default;
368 cursor: default;
369 display: block;
369 display: block;
370 padding: 0 1em;
370 padding: 0 1em;
371 margin: 0;
371 margin: 0;
372 border: 0;
372 border: 0;
373 text-decoration: none;
373 text-decoration: none;
374 white-space: nowrap;
374 white-space: nowrap;
375 }
375 }
376
376
377 div.menu a.menuItem:hover, div.menu a.menuItemHighlight {
377 div.menu a.menuItem:hover, div.menu a.menuItemHighlight {
378 background-color: #80b0da;
378 background-color: #80b0da;
379 color: #ffffff;
379 color: #ffffff;
380 }
380 }
381
381
382 div.menu a.menuItem span.menuItemText {}
382 div.menu a.menuItem span.menuItemText {}
383
383
384 div.menu a.menuItem span.menuItemArrow {
384 div.menu a.menuItem span.menuItemArrow {
385 margin-right: -.75em;
385 margin-right: -.75em;
386 }
386 }
387
387
388 /**************** Sidebar styles ****************/
388 /**************** Sidebar styles ****************/
389
389
390 #subcontent{
390 #subcontent{
391 position: absolute;
391 position: absolute;
392 left: 0px;
392 left: 0px;
393 width:95px;
393 width:95px;
394 padding:20px 20px 10px 5px;
394 padding:20px 20px 10px 5px;
395 overflow: hidden;
395 overflow: hidden;
396 }
396 }
397
397
398 #subcontent h2{
398 #subcontent h2{
399 display:block;
399 display:block;
400 margin:0 0 5px 0;
400 margin:0 0 5px 0;
401 font-size:1.0em;
401 font-size:1.0em;
402 font-weight:bold;
402 font-weight:bold;
403 text-align:left;
403 text-align:left;
404 color:#606060;
404 color:#606060;
405 background-color:inherit;
405 background-color:inherit;
406 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
406 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
407 }
407 }
408
408
409 #subcontent p{margin:0 0 16px 0; font-size:0.9em;}
409 #subcontent p{margin:0 0 16px 0; font-size:0.9em;}
410
410
411 /**************** Menublock styles ****************/
411 /**************** Menublock styles ****************/
412
412
413 .menublock{margin:0 0 20px 8px; font-size:0.8em;}
413 .menublock{margin:0 0 20px 8px; font-size:0.8em;}
414 .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;}
414 .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;}
415 .menublock li a{font-weight:bold; text-decoration:none;}
415 .menublock li a{font-weight:bold; text-decoration:none;}
416 .menublock li a:hover{text-decoration:none;}
416 .menublock li a:hover{text-decoration:none;}
417 .menublock li ul{margin:0; font-size:1em; font-weight:normal;}
417 .menublock li ul{margin:0; font-size:1em; font-weight:normal;}
418 .menublock li ul li{margin-bottom:0;}
418 .menublock li ul li{margin-bottom:0;}
419 .menublock li ul a{font-weight:normal;}
419 .menublock li ul a{font-weight:normal;}
420
420
421 /**************** Footer styles ****************/
421 /**************** Footer styles ****************/
422
422
423 #footer{
423 #footer{
424 clear:both;
424 clear:both;
425 padding:5px 0;
425 padding:5px 0;
426 margin:0;
426 margin:0;
427 font-size:0.9em;
427 font-size:0.9em;
428 color:#f0f0f0;
428 color:#f0f0f0;
429 background:#467aa7;
429 background:#467aa7;
430 }
430 }
431
431
432 #footer p{padding:0; margin:0; text-align:center;}
432 #footer p{padding:0; margin:0; text-align:center;}
433 #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;}
433 #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;}
434 #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;}
434 #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;}
435
435
436 /**************** Misc classes and styles ****************/
436 /**************** Misc classes and styles ****************/
437
437
438 .splitcontentleft{float:left; width:49%;}
438 .splitcontentleft{float:left; width:49%;}
439 .splitcontentright{float:right; width:49%;}
439 .splitcontentright{float:right; width:49%;}
440 .clear{clear:both;}
440 .clear{clear:both;}
441 .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;}
441 .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;}
442 .hide{display:none;}
442 .hide{display:none;}
443 .textcenter{text-align:center;}
443 .textcenter{text-align:center;}
444 .textright{text-align:right;}
444 .textright{text-align:right;}
445 .important{color:#f02025; background-color:inherit; font-weight:bold;}
445 .important{color:#f02025; background-color:inherit; font-weight:bold;}
446
446
447 .box{
447 .box{
448 margin:0 0 20px 0;
448 margin:0 0 20px 0;
449 padding:10px;
449 padding:10px;
450 border:1px solid #c0c0c0;
450 border:1px solid #c0c0c0;
451 background-color:#fafbfc;
451 background-color:#fafbfc;
452 color:#505050;
452 color:#505050;
453 line-height:1.5em;
453 line-height:1.5em;
454 }
454 }
455
455
456 a.close-icon {
456 a.close-icon {
457 display:block;
457 display:block;
458 margin-top:3px;
458 margin-top:3px;
459 overflow:hidden;
459 overflow:hidden;
460 width:12px;
460 width:12px;
461 height:12px;
461 height:12px;
462 background-repeat: no-repeat;
462 background-repeat: no-repeat;
463 cursor:pointer;
463 cursor:pointer;
464 background-image:url('../images/close.png');
464 background-image:url('../images/close.png');
465 }
465 }
466
466
467 a.close-icon:hover {
467 a.close-icon:hover {
468 background-image:url('../images/close_hl.png');
468 background-image:url('../images/close_hl.png');
469 }
469 }
470
470
471 .rightbox{
471 .rightbox{
472 background: #fafbfc;
472 background: #fafbfc;
473 border: 1px solid #c0c0c0;
473 border: 1px solid #c0c0c0;
474 float: right;
474 float: right;
475 padding: 8px;
475 padding: 8px;
476 position: relative;
476 position: relative;
477 margin: 0 5px 5px;
477 margin: 0 5px 5px;
478 }
478 }
479
479
480 div.attachments {padding-left: 6px; border-left: 2px solid #ccc; margin-bottom: 8px;}
480 div.attachments {padding-left: 6px; border-left: 2px solid #ccc; margin-bottom: 8px;}
481 div.attachments p {margin-bottom:2px;}
481 div.attachments p {margin-bottom:2px;}
482
482
483 .overlay{
483 .overlay{
484 position: absolute;
484 position: absolute;
485 margin-left:0;
485 margin-left:0;
486 z-index: 50;
486 z-index: 50;
487 }
487 }
488
488
489 .layout-active {
489 .layout-active {
490 background: #ECF3E1;
490 background: #ECF3E1;
491 }
491 }
492
492
493 .block-receiver {
493 .block-receiver {
494 border:1px dashed #c0c0c0;
494 border:1px dashed #c0c0c0;
495 margin-bottom: 20px;
495 margin-bottom: 20px;
496 padding: 15px 0 15px 0;
496 padding: 15px 0 15px 0;
497 }
497 }
498
498
499 .mypage-box {
499 .mypage-box {
500 margin:0 0 20px 0;
500 margin:0 0 20px 0;
501 color:#505050;
501 color:#505050;
502 line-height:1.5em;
502 line-height:1.5em;
503 }
503 }
504
504
505 .handle {
505 .handle {
506 cursor: move;
506 cursor: move;
507 }
507 }
508
508
509 .login {
509 .login {
510 width: 50%;
510 width: 50%;
511 text-align: left;
511 text-align: left;
512 }
512 }
513
513
514 img.calendar-trigger {
514 img.calendar-trigger {
515 cursor: pointer;
515 cursor: pointer;
516 vertical-align: middle;
516 vertical-align: middle;
517 margin-left: 4px;
517 margin-left: 4px;
518 }
518 }
519
519
520 #history p {
520 #history p {
521 margin-left: 34px;
521 margin-left: 34px;
522 }
522 }
523
523
524 .progress {
524 .progress {
525 border: 1px solid #D7D7D7;
525 border: 1px solid #D7D7D7;
526 border-collapse: collapse;
526 border-collapse: collapse;
527 border-spacing: 0pt;
527 border-spacing: 0pt;
528 empty-cells: show;
528 empty-cells: show;
529 padding: 3px;
529 padding: 3px;
530 width: 40em;
530 width: 40em;
531 text-align: center;
531 text-align: center;
532 }
532 }
533
533
534 .progress td { height: 1em; }
534 .progress td { height: 1em; }
535 .progress .closed { background: #BAE0BA none repeat scroll 0%; }
535 .progress .closed { background: #BAE0BA none repeat scroll 0%; }
536 .progress .open { background: #FFF none repeat scroll 0%; }
536 .progress .open { background: #FFF none repeat scroll 0%; }
537
537
538 /***** Contextual links div *****/
538 /***** Contextual links div *****/
539 .contextual {
539 .contextual {
540 float: right;
540 float: right;
541 font-size: 0.8em;
541 font-size: 0.8em;
542 line-height: 16px;
542 line-height: 16px;
543 padding: 2px;
543 padding: 2px;
544 }
544 }
545
545
546 .contextual select, .contextual input {
546 .contextual select, .contextual input {
547 font-size: 1em;
547 font-size: 1em;
548 }
548 }
549
549
550 /***** Gantt chart *****/
550 /***** Gantt chart *****/
551 .gantt_hdr {
551 .gantt_hdr {
552 position:absolute;
552 position:absolute;
553 top:0;
553 top:0;
554 height:16px;
554 height:16px;
555 border-top: 1px solid #c0c0c0;
555 border-top: 1px solid #c0c0c0;
556 border-bottom: 1px solid #c0c0c0;
556 border-bottom: 1px solid #c0c0c0;
557 border-right: 1px solid #c0c0c0;
557 border-right: 1px solid #c0c0c0;
558 text-align: center;
558 text-align: center;
559 overflow: hidden;
559 overflow: hidden;
560 }
560 }
561
561
562 .task {
562 .task {
563 position: absolute;
563 position: absolute;
564 height:8px;
564 height:8px;
565 font-size:0.8em;
565 font-size:0.8em;
566 color:#888;
566 color:#888;
567 padding:0;
567 padding:0;
568 margin:0;
568 margin:0;
569 line-height:0.8em;
569 line-height:0.8em;
570 }
570 }
571
571
572 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
572 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
573 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
573 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
574 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
574 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
575 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
575 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
576
576
577 /***** Tooltips ******/
577 /***** Tooltips ******/
578 .tooltip{position:relative;z-index:24;}
578 .tooltip{position:relative;z-index:24;}
579 .tooltip:hover{z-index:25;color:#000;}
579 .tooltip:hover{z-index:25;color:#000;}
580 .tooltip span.tip{display: none; text-align:left;}
580 .tooltip span.tip{display: none; text-align:left;}
581
581
582 div.tooltip:hover span.tip{
582 div.tooltip:hover span.tip{
583 display:block;
583 display:block;
584 position:absolute;
584 position:absolute;
585 top:12px; left:24px; width:270px;
585 top:12px; left:24px; width:270px;
586 border:1px solid #555;
586 border:1px solid #555;
587 background-color:#fff;
587 background-color:#fff;
588 padding: 4px;
588 padding: 4px;
589 font-size: 0.8em;
589 font-size: 0.8em;
590 color:#505050;
590 color:#505050;
591 }
591 }
592
592
593 /***** CSS FORM ******/
593 /***** CSS FORM ******/
594 .tabular p{
594 .tabular p{
595 margin: 0;
595 margin: 0;
596 padding: 5px 0 8px 0;
596 padding: 5px 0 8px 0;
597 padding-left: 180px; /*width of left column containing the label elements*/
597 padding-left: 180px; /*width of left column containing the label elements*/
598 height: 1%;
598 height: 1%;
599 }
599 }
600
600
601 .tabular label{
601 .tabular label{
602 font-weight: bold;
602 font-weight: bold;
603 float: left;
603 float: left;
604 margin-left: -180px; /*width of left column*/
604 margin-left: -180px; /*width of left column*/
605 width: 175px; /*width of labels. Should be smaller than left column to create some right
605 width: 175px; /*width of labels. Should be smaller than left column to create some right
606 margin*/
606 margin*/
607 }
607 }
608
608
609 .error {
609 .error {
610 color: #cc0000;
610 color: #cc0000;
611 }
611 }
612
612
613 #settings .tabular p{ padding-left: 300px; }
613 #settings .tabular p{ padding-left: 300px; }
614 #settings .tabular label{ margin-left: -300px; width: 295px; }
614 #settings .tabular label{ margin-left: -300px; width: 295px; }
615
615
616 /*.threepxfix class below:
616 /*.threepxfix class below:
617 Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents.
617 Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents.
618 to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html
618 to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html
619 */
619 */
620
620
621 * html .threepxfix{
621 * html .threepxfix{
622 margin-left: 3px;
622 margin-left: 3px;
623 }
623 }
624
624
625 /***** Wiki sections ****/
625 /***** Wiki sections ****/
626 #content div.wiki { font-size: 110%}
626 #content div.wiki { font-size: 110%}
627
627
628 #content div.wiki h2, div.wiki h3 { font-family: Trebuchet MS,Georgia,"Times New Roman",serif; color:#606060; }
628 #content div.wiki h2, div.wiki h3 { font-family: Trebuchet MS,Georgia,"Times New Roman",serif; color:#606060; }
629 #content div.wiki h2 { font-size: 1.4em;}
629 #content div.wiki h2 { font-size: 1.4em;}
630 #content div.wiki h3 { font-size: 1.2em;}
630 #content div.wiki h3 { font-size: 1.2em;}
631
631
632 div.wiki table {
632 div.wiki table {
633 border: 1px solid #505050;
633 border: 1px solid #505050;
634 border-collapse: collapse;
634 border-collapse: collapse;
635 }
635 }
636
636
637 div.wiki table, div.wiki td {
637 div.wiki table, div.wiki td {
638 border: 1px solid #bbb;
638 border: 1px solid #bbb;
639 padding: 4px;
639 padding: 4px;
640 }
640 }
641
641
642 div.wiki a {
643 background-position: 0% 60%;
644 background-repeat: no-repeat;
645 padding-left: 12px;
646 background-image: url(../images/external.png);
647 }
648
649 div.wiki a.wiki-page, div.wiki a.issue, div.wiki a.changeset {
650 padding-left: 0;
651 background-image: none;
652 }
653
642 div.wiki code {
654 div.wiki code {
643 font-size: 1.2em;
655 font-size: 1.2em;
644 }
656 }
645
657
646 div.wiki img {
658 div.wiki img {
647 margin: 6px;
659 margin: 6px;
648 }
660 }
649
661
650 .diff_out{
662 .diff_out{
651 background: #fcc;
663 background: #fcc;
652 }
664 }
653
665
654 .diff_in{
666 .diff_in{
655 background: #cfc;
667 background: #cfc;
656 }
668 }
657
669
658 #preview .preview { background: #fafbfc url(../images/draft.png); }
670 #preview .preview { background: #fafbfc url(../images/draft.png); }
659
671
660 #ajax-indicator {
672 #ajax-indicator {
661 position: absolute; /* fixed not supported by IE */
673 position: absolute; /* fixed not supported by IE */
662 background-color:#eee;
674 background-color:#eee;
663 border: 1px solid #bbb;
675 border: 1px solid #bbb;
664 top:35%;
676 top:35%;
665 left:40%;
677 left:40%;
666 width:20%;
678 width:20%;
667 font-weight:bold;
679 font-weight:bold;
668 text-align:center;
680 text-align:center;
669 padding:0.6em;
681 padding:0.6em;
670 z-index:100;
682 z-index:100;
671 filter:alpha(opacity=50);
683 filter:alpha(opacity=50);
672 -moz-opacity:0.5;
684 -moz-opacity:0.5;
673 opacity: 0.5;
685 opacity: 0.5;
674 -khtml-opacity: 0.5;
686 -khtml-opacity: 0.5;
675 }
687 }
676
688
677 html>body #ajax-indicator { position: fixed; }
689 html>body #ajax-indicator { position: fixed; }
678
690
679 #ajax-indicator span {
691 #ajax-indicator span {
680 background-position: 0% 40%;
692 background-position: 0% 40%;
681 background-repeat: no-repeat;
693 background-repeat: no-repeat;
682 background-image: url(../images/loading.gif);
694 background-image: url(../images/loading.gif);
683 padding-left: 26px;
695 padding-left: 26px;
684 vertical-align: bottom;
696 vertical-align: bottom;
685 }
697 }
General Comments 0
You need to be logged in to leave comments. Login now