Description:
added announcement refresh, more styling, prep for announcement hiding git-svn-id: http://theory.cpe.ku.ac.th/grader/web/trunk@412 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r192:f7680fc5e3dd - - 7 files changed: 102 inserted, 10 deleted

@@ -0,0 +1,4
1 + environment.rb
2 + database.yml
3 + tasks.yml
4 +
@@ -0,0 +1,33
1 +
2 + var Announcement = {
3 +
4 + mostRecentId: 0,
5 +
6 + setMostRecentId: function(id) {
7 + Announcement.mostRecentId = id;
8 + },
9 +
10 + updateRecentId: function(id) {
11 + if(Announcement.mostRecentId < id)
12 + Announcement.mostRecentId = id;
13 + },
14 +
15 + refreshAnnouncement: function() {
16 + var url = '/main/announcements';
17 + new Ajax.Request(url, {
18 + method: 'get',
19 + parameters: { recent: Announcement.mostRecentId },
20 + onSuccess: function(transport) {
21 + var announcementBody = $("announcementbox-body");
22 + announcementBody.insert({ top: transport.responseText });
23 + }
24 + });
25 + Announcement.registerRefreshEventTimer();
26 + },
27 +
28 + registerRefreshEventTimer: function() {
29 + setTimeout(function () {
30 + Announcement.refreshAnnouncement();
31 + }, 30000);
32 + }
33 + }; No newline at end of file
@@ -1,4 +1,2
1 *~
1 *~
2 log
2 log
3 - config/environment.rb
4 - config/database.yml
@@ -70,210 +70,232
70 if @submission.save == false
70 if @submission.save == false
71 flash[:notice] = 'Error saving your submission'
71 flash[:notice] = 'Error saving your submission'
72 elsif Task.create(:submission_id => @submission.id,
72 elsif Task.create(:submission_id => @submission.id,
73 :status => Task::STATUS_INQUEUE) == false
73 :status => Task::STATUS_INQUEUE) == false
74 flash[:notice] = 'Error adding your submission to task queue'
74 flash[:notice] = 'Error adding your submission to task queue'
75 end
75 end
76 else
76 else
77 prepare_list_information
77 prepare_list_information
78 render :action => 'list' and return
78 render :action => 'list' and return
79 end
79 end
80 redirect_to :action => 'list'
80 redirect_to :action => 'list'
81 end
81 end
82
82
83 def source
83 def source
84 submission = Submission.find(params[:id])
84 submission = Submission.find(params[:id])
85 if submission.user_id == session[:user_id]
85 if submission.user_id == session[:user_id]
86 send_data(submission.source,
86 send_data(submission.source,
87 {:filename => submission.download_filename,
87 {:filename => submission.download_filename,
88 :type => 'text/plain'})
88 :type => 'text/plain'})
89 else
89 else
90 flash[:notice] = 'Error viewing source'
90 flash[:notice] = 'Error viewing source'
91 redirect_to :action => 'list'
91 redirect_to :action => 'list'
92 end
92 end
93 end
93 end
94
94
95 def compiler_msg
95 def compiler_msg
96 @submission = Submission.find(params[:id])
96 @submission = Submission.find(params[:id])
97 if @submission.user_id == session[:user_id]
97 if @submission.user_id == session[:user_id]
98 render :action => 'compiler_msg', :layout => 'empty'
98 render :action => 'compiler_msg', :layout => 'empty'
99 else
99 else
100 flash[:notice] = 'Error viewing source'
100 flash[:notice] = 'Error viewing source'
101 redirect_to :action => 'list'
101 redirect_to :action => 'list'
102 end
102 end
103 end
103 end
104
104
105 def submission
105 def submission
106 @user = User.find(session[:user_id])
106 @user = User.find(session[:user_id])
107 @problems = Problem.find_available_problems
107 @problems = Problem.find_available_problems
108 if params[:id]==nil
108 if params[:id]==nil
109 @problem = nil
109 @problem = nil
110 @submissions = nil
110 @submissions = nil
111 else
111 else
112 @problem = Problem.find_by_name(params[:id])
112 @problem = Problem.find_by_name(params[:id])
113 if not @problem.available
113 if not @problem.available
114 redirect_to :action => 'list'
114 redirect_to :action => 'list'
115 flash[:notice] = 'Error: submissions for that problem are not viewable.'
115 flash[:notice] = 'Error: submissions for that problem are not viewable.'
116 return
116 return
117 end
117 end
118 @submissions = Submission.find_all_by_user_problem(@user.id, @problem.id)
118 @submissions = Submission.find_all_by_user_problem(@user.id, @problem.id)
119 end
119 end
120 end
120 end
121
121
122 def result
122 def result
123 if !Configuration.show_grading_result
123 if !Configuration.show_grading_result
124 redirect_to :action => 'list' and return
124 redirect_to :action => 'list' and return
125 end
125 end
126 @user = User.find(session[:user_id])
126 @user = User.find(session[:user_id])
127 @submission = Submission.find(params[:id])
127 @submission = Submission.find(params[:id])
128 if @submission.user!=@user
128 if @submission.user!=@user
129 flash[:notice] = 'You are not allowed to view result of other users.'
129 flash[:notice] = 'You are not allowed to view result of other users.'
130 redirect_to :action => 'list' and return
130 redirect_to :action => 'list' and return
131 end
131 end
132 prepare_grading_result(@submission)
132 prepare_grading_result(@submission)
133 end
133 end
134
134
135 def load_output
135 def load_output
136 if !Configuration.show_grading_result or params[:num]==nil
136 if !Configuration.show_grading_result or params[:num]==nil
137 redirect_to :action => 'list' and return
137 redirect_to :action => 'list' and return
138 end
138 end
139 @user = User.find(session[:user_id])
139 @user = User.find(session[:user_id])
140 @submission = Submission.find(params[:id])
140 @submission = Submission.find(params[:id])
141 if @submission.user!=@user
141 if @submission.user!=@user
142 flash[:notice] = 'You are not allowed to view result of other users.'
142 flash[:notice] = 'You are not allowed to view result of other users.'
143 redirect_to :action => 'list' and return
143 redirect_to :action => 'list' and return
144 end
144 end
145 case_num = params[:num].to_i
145 case_num = params[:num].to_i
146 out_filename = output_filename(@user.login,
146 out_filename = output_filename(@user.login,
147 @submission.problem.name,
147 @submission.problem.name,
148 @submission.id,
148 @submission.id,
149 case_num)
149 case_num)
150 if !FileTest.exists?(out_filename)
150 if !FileTest.exists?(out_filename)
151 flash[:notice] = 'Output not found.'
151 flash[:notice] = 'Output not found.'
152 redirect_to :action => 'list' and return
152 redirect_to :action => 'list' and return
153 end
153 end
154
154
155 response.headers['Content-Type'] = "application/force-download"
155 response.headers['Content-Type'] = "application/force-download"
156 response.headers['Content-Disposition'] = "attachment; filename=\"output-#{case_num}.txt\""
156 response.headers['Content-Disposition'] = "attachment; filename=\"output-#{case_num}.txt\""
157 response.headers["X-Sendfile"] = out_filename
157 response.headers["X-Sendfile"] = out_filename
158 response.headers['Content-length'] = File.size(out_filename)
158 response.headers['Content-length'] = File.size(out_filename)
159 render :nothing => true
159 render :nothing => true
160 end
160 end
161
161
162 def error
162 def error
163 @user = User.find(session[:user_id])
163 @user = User.find(session[:user_id])
164 end
164 end
165
165
166 + # announcement refreshing and hiding methods
167 +
168 + def announcements
169 + if params.has_key? 'recent'
170 + prepare_announcements(params[:recent])
171 + else
172 + prepare_announcements
173 + end
174 + render(:partial => 'announcement',
175 + :collection => @announcements,
176 + :locals => {:announcement_effect => true})
177 + end
178 +
166 protected
179 protected
180 +
181 + def prepare_announcements(recent=nil)
182 + if Configuration.show_tasks_to?(@user)
183 + @announcements = Announcement.find_published(true)
184 + else
185 + @announcements = Announcement.find_published
186 + end
187 + if recent!=nil
188 + recent_id = recent.to_i
189 + @announcements = @announcements.find_all { |a| a.id > recent_id }
190 + end
191 + end
192 +
167 def prepare_list_information
193 def prepare_list_information
168 @problems = Problem.find_available_problems
194 @problems = Problem.find_available_problems
169 @prob_submissions = Array.new
195 @prob_submissions = Array.new
170 @user = User.find(session[:user_id])
196 @user = User.find(session[:user_id])
171 @problems.each do |p|
197 @problems.each do |p|
172 sub = Submission.find_last_by_user_and_problem(@user.id,p.id)
198 sub = Submission.find_last_by_user_and_problem(@user.id,p.id)
173 if sub!=nil
199 if sub!=nil
174 @prob_submissions << { :count => sub.number, :submission => sub }
200 @prob_submissions << { :count => sub.number, :submission => sub }
175 else
201 else
176 @prob_submissions << { :count => 0, :submission => nil }
202 @prob_submissions << { :count => 0, :submission => nil }
177 end
203 end
178 end
204 end
179 - if Configuration.show_tasks_to?(@user)
205 + prepare_announcements
180 - @announcements = Announcement.find_published(true)
181 - else
182 - @announcements = Announcement.find_published
183 - end
184 end
206 end
185
207
186 def check_viewability
208 def check_viewability
187 @user = User.find(session[:user_id])
209 @user = User.find(session[:user_id])
188 if (!Configuration.show_tasks_to?(@user)) and
210 if (!Configuration.show_tasks_to?(@user)) and
189 ((action_name=='submission') or (action_name=='submit'))
211 ((action_name=='submission') or (action_name=='submit'))
190 redirect_to :action => 'list' and return
212 redirect_to :action => 'list' and return
191 end
213 end
192 end
214 end
193
215
194 def prepare_grading_result(submission)
216 def prepare_grading_result(submission)
195 grading_info = Configuration.task_grading_info[submission.problem.name]
217 grading_info = Configuration.task_grading_info[submission.problem.name]
196 @test_runs = []
218 @test_runs = []
197 if grading_info['testruns'].is_a? Integer
219 if grading_info['testruns'].is_a? Integer
198 trun_count = grading_info['testruns']
220 trun_count = grading_info['testruns']
199 trun_count.times do |i|
221 trun_count.times do |i|
200 @test_runs << [ read_grading_result(@user.login,
222 @test_runs << [ read_grading_result(@user.login,
201 submission.problem.name,
223 submission.problem.name,
202 submission.id,
224 submission.id,
203 i+1) ]
225 i+1) ]
204 end
226 end
205 else
227 else
206 grading_info['testruns'].keys.sort.each do |num|
228 grading_info['testruns'].keys.sort.each do |num|
207 run = []
229 run = []
208 testrun = grading_info['testruns'][num]
230 testrun = grading_info['testruns'][num]
209 testrun.each do |c|
231 testrun.each do |c|
210 run << read_grading_result(@user.login,
232 run << read_grading_result(@user.login,
211 submission.problem.name,
233 submission.problem.name,
212 submission.id,
234 submission.id,
213 c)
235 c)
214 end
236 end
215 @test_runs << run
237 @test_runs << run
216 end
238 end
217 end
239 end
218 end
240 end
219
241
220 def grading_result_dir(user_name, problem_name, submission_id, case_num)
242 def grading_result_dir(user_name, problem_name, submission_id, case_num)
221 return "#{GRADING_RESULT_DIR}/#{user_name}/#{problem_name}/#{submission_id}/test-result/#{case_num}"
243 return "#{GRADING_RESULT_DIR}/#{user_name}/#{problem_name}/#{submission_id}/test-result/#{case_num}"
222 end
244 end
223
245
224 def output_filename(user_name, problem_name, submission_id, case_num)
246 def output_filename(user_name, problem_name, submission_id, case_num)
225 dir = grading_result_dir(user_name,problem_name, submission_id, case_num)
247 dir = grading_result_dir(user_name,problem_name, submission_id, case_num)
226 return "#{dir}/output.txt"
248 return "#{dir}/output.txt"
227 end
249 end
228
250
229 def read_grading_result(user_name, problem_name, submission_id, case_num)
251 def read_grading_result(user_name, problem_name, submission_id, case_num)
230 dir = grading_result_dir(user_name,problem_name, submission_id, case_num)
252 dir = grading_result_dir(user_name,problem_name, submission_id, case_num)
231 result_file_name = "#{dir}/result"
253 result_file_name = "#{dir}/result"
232 if !FileTest.exists?(result_file_name)
254 if !FileTest.exists?(result_file_name)
233 return {:num => case_num, :msg => 'program did not run'}
255 return {:num => case_num, :msg => 'program did not run'}
234 else
256 else
235 results = File.open(result_file_name).readlines
257 results = File.open(result_file_name).readlines
236 run_stat = extract_running_stat(results)
258 run_stat = extract_running_stat(results)
237 output_filename = "#{dir}/output.txt"
259 output_filename = "#{dir}/output.txt"
238 if FileTest.exists?(output_filename)
260 if FileTest.exists?(output_filename)
239 output_file = true
261 output_file = true
240 output_size = File.size(output_filename)
262 output_size = File.size(output_filename)
241 else
263 else
242 output_file = false
264 output_file = false
243 output_size = 0
265 output_size = 0
244 end
266 end
245
267
246 return {
268 return {
247 :num => case_num,
269 :num => case_num,
248 :msg => results[0],
270 :msg => results[0],
249 :run_stat => run_stat,
271 :run_stat => run_stat,
250 :output => output_file,
272 :output => output_file,
251 :output_size => output_size
273 :output_size => output_size
252 }
274 }
253 end
275 end
254 end
276 end
255
277
256 # copied from grader/script/lib/test_request_helper.rb
278 # copied from grader/script/lib/test_request_helper.rb
257 def extract_running_stat(results)
279 def extract_running_stat(results)
258 running_stat_line = results[-1]
280 running_stat_line = results[-1]
259
281
260 # extract exit status line
282 # extract exit status line
261 run_stat = ""
283 run_stat = ""
262 if !(/[Cc]orrect/.match(results[0]))
284 if !(/[Cc]orrect/.match(results[0]))
263 run_stat = results[0].chomp
285 run_stat = results[0].chomp
264 else
286 else
265 run_stat = 'Program exited normally'
287 run_stat = 'Program exited normally'
266 end
288 end
267
289
268 logger.info "Stat line: #{running_stat_line}"
290 logger.info "Stat line: #{running_stat_line}"
269
291
270 # extract running time
292 # extract running time
271 if res = /r(.*)u(.*)s/.match(running_stat_line)
293 if res = /r(.*)u(.*)s/.match(running_stat_line)
272 seconds = (res[1].to_f + res[2].to_f)
294 seconds = (res[1].to_f + res[2].to_f)
273 time_stat = "Time used: #{seconds} sec."
295 time_stat = "Time used: #{seconds} sec."
274 else
296 else
275 seconds = nil
297 seconds = nil
276 time_stat = "Time used: n/a sec."
298 time_stat = "Time used: n/a sec."
277 end
299 end
278
300
279 # extract memory usage
301 # extract memory usage
@@ -1,4 +1,17
1 - .announcement
1 + .announcement{:id => "announcement-#{announcement.id}", :style => "#{'opacity: 0;' if (defined? announcement_effect) and announcement_effect }"}
2 + -# .announcement-title
3 + -# .toggles
4 + -# %a{:href => '#', :onclick => "$(\"announcement-body-#{announcement.id}\").hide(); return false;"}
5 + -# [hide]
6 + -# %a{:href => '#', :onclick => "$(\"announcement-body-#{announcement.id}\").show(); return false;"}
7 + -# [show]
8 + -# Announcement Title
9 + .announcement-body{:id => "announcement-body-#{announcement.id}"}
2 = markdown(announcement.body)
10 = markdown(announcement.body)
3 -#.pub-info
11 -#.pub-info
4 -# %p= "#{announcement.author}, #{announcement.created_at}"
12 -# %p= "#{announcement.author}, #{announcement.created_at}"
13 + :javascript
14 + Announcement.updateRecentId(#{announcement.id});
15 + - if (defined? announcement_effect) and announcement_effect
16 + :javascript
17 + $("announcement-#{announcement.id}").appear();
@@ -1,30 +1,39
1 + - content_for :head do
2 + = javascript_include_tag :defaults
3 + %script{:type => 'text/javascript', :src => '/javascripts/announcement_refresh.js'}
4 +
1 = user_title_bar(@user)
5 = user_title_bar(@user)
2
6
3 - if @announcements.length!=0
7 - if @announcements.length!=0
4 .announcementbox
8 .announcementbox
5 %span{:class => 'title'}
9 %span{:class => 'title'}
6 Announcements
10 Announcements
11 + #announcementbox-body
7 = render :partial => 'announcement', :collection => @announcements
12 = render :partial => 'announcement', :collection => @announcements
8
13
9 - if Configuration.show_submitbox_to?(@user)
14 - if Configuration.show_submitbox_to?(@user)
10 .submitbox
15 .submitbox
11 = error_messages_for 'submission'
16 = error_messages_for 'submission'
12 = render :partial => 'submission_box'
17 = render :partial => 'submission_box'
13
18
14
19
15 %hr/
20 %hr/
16
21
17 - - if (Configuration.contest_mode) and (@user.site!=nil) and (@user.site.started!=true)
22 + - if (Configuration.contest_mode) and (@user.site!=nil) |
23 + and (@user.site.started!=true)
18 %p=t 'main.start_soon'
24 %p=t 'main.start_soon'
19
25
20 - if Configuration.show_tasks_to?(@user)
26 - if Configuration.show_tasks_to?(@user)
21 %table.info
27 %table.info
22 %tr.info-head
28 %tr.info-head
23 %th
29 %th
24 %th Tasks
30 %th Tasks
25 %th # of sub(s)
31 %th # of sub(s)
26 %th Results
32 %th Results
27 = render :partial => 'problem', :collection => @problems
33 = render :partial => 'problem', :collection => @problems
28
34
29 %hr/
35 %hr/
30
36
37 + :javascript
38 + Announcement.registerRefreshEventTimer();
39 +
@@ -144,180 +144,193
144 border: 1px solid black;
144 border: 1px solid black;
145 font-size: 13px;
145 font-size: 13px;
146 }
146 }
147
147
148 td.uinfo {
148 td.uinfo {
149 vertical-align: top;
149 vertical-align: top;
150 border: 1px solid black;
150 border: 1px solid black;
151 padding: 5px;
151 padding: 5px;
152 }
152 }
153
153
154 th.uinfo {
154 th.uinfo {
155 background: lightgreen;
155 background: lightgreen;
156 vertical-align: top;
156 vertical-align: top;
157 text-align: right;
157 text-align: right;
158 border: 1px solid black;
158 border: 1px solid black;
159 padding: 5px;
159 padding: 5px;
160 }
160 }
161
161
162 /*******************************
162 /*******************************
163 [Submission]
163 [Submission]
164 ********************************/
164 ********************************/
165 div.compilermsgbody {
165 div.compilermsgbody {
166 font-family: monospace;
166 font-family: monospace;
167 }
167 }
168
168
169 div.task-menu {
169 div.task-menu {
170 text-align: center;
170 text-align: center;
171 font-size: 13px;
171 font-size: 13px;
172 line-height: 1.75em;
172 line-height: 1.75em;
173 font-weight: bold;
173 font-weight: bold;
174 border-top: 1px dashed gray;
174 border-top: 1px dashed gray;
175 border-bottom: 1px dashed gray;
175 border-bottom: 1px dashed gray;
176 margin-top: 2px;
176 margin-top: 2px;
177 margin-bottom: 4px;
177 margin-bottom: 4px;
178 }
178 }
179
179
180 /*******************************
180 /*******************************
181 [Submission]
181 [Submission]
182 ********************************/
182 ********************************/
183 table.taskdesc {
183 table.taskdesc {
184 border: 2px solid #dddddd;
184 border: 2px solid #dddddd;
185 border-collapse: collapse;
185 border-collapse: collapse;
186 margin: 10px auto;
186 margin: 10px auto;
187 width: 90%;
187 width: 90%;
188 font-size: 13px;
188 font-size: 13px;
189 }
189 }
190
190
191 table.taskdesc p {
191 table.taskdesc p {
192 font-size: 13px;
192 font-size: 13px;
193 }
193 }
194
194
195 table.taskdesc tr.name {
195 table.taskdesc tr.name {
196 border: 2px solid #dddddd;
196 border: 2px solid #dddddd;
197 background: #dddddd;
197 background: #dddddd;
198 color: #333333;
198 color: #333333;
199 font-weight: bold;
199 font-weight: bold;
200 font-size: 14px;
200 font-size: 14px;
201 line-height: 1.5em;
201 line-height: 1.5em;
202 text-align: center;
202 text-align: center;
203 }
203 }
204
204
205 table.taskdesc td.desc-odd {
205 table.taskdesc td.desc-odd {
206 padding: 5px;
206 padding: 5px;
207 padding-left: 20px;
207 padding-left: 20px;
208 background: #fefeee;
208 background: #fefeee;
209 }
209 }
210
210
211 table.taskdesc td.desc-even {
211 table.taskdesc td.desc-even {
212 padding: 5px;
212 padding: 5px;
213 padding-left: 20px;
213 padding-left: 20px;
214 background: #feeefe;
214 background: #feeefe;
215 }
215 }
216
216
217 /**********************
217 /**********************
218 Announcement
218 Announcement
219 ***********************/
219 ***********************/
220
220
221 div.announcementbox {
221 div.announcementbox {
222 margin: 10px 0px;
222 margin: 10px 0px;
223 background: #bbddee;
223 background: #bbddee;
224 padding: 1px;
224 padding: 1px;
225 }
225 }
226
226
227 div.announcementbox span.title {
227 div.announcementbox span.title {
228 font-weight: bold;
228 font-weight: bold;
229 color: #224455;
229 color: #224455;
230 padding-left: 10px;
230 padding-left: 10px;
231 line-height: 1.6em;
231 line-height: 1.6em;
232 }
232 }
233
233
234 div.announcement {
234 div.announcement {
235 margin: 2px;
235 margin: 2px;
236 background: white;
236 background: white;
237 padding: 1px;
237 padding: 1px;
238 padding-left: 10px;
238 padding-left: 10px;
239 padding-right: 10px;
239 padding-right: 10px;
240 + padding-top: 5px;
241 + padding-bottom: 5px;
240 }
242 }
241
243
242 - div.announcement p {
244 + .announcement p {
243 font-size: 12px;
245 font-size: 12px;
246 + margin: 2px;
244 }
247 }
245
248
246 div.pub-info, div.pub-info p {
249 div.pub-info, div.pub-info p {
247 text-align: right;
250 text-align: right;
248 font-style: italic;
251 font-style: italic;
249 font-size: 9px;
252 font-size: 9px;
250 }
253 }
251
254
255 + .announcement .toggles {
256 + font-weight: normal;
257 + float: right;
258 + font-size: 80%;
259 + }
260 +
261 + .announcement .announcement-title {
262 + font-weight: bold;
263 + }
264 +
252 /******************
265 /******************
253 Messages
266 Messages
254 ******************/
267 ******************/
255
268
256 div.message {
269 div.message {
257 margin: 10px 0 0;
270 margin: 10px 0 0;
258 }
271 }
259
272
260 div.message div.message {
273 div.message div.message {
261 margin: 0 0 0 30px;
274 margin: 0 0 0 30px;
262 }
275 }
263
276
264 div.message div.body {
277 div.message div.body {
265 border: 2px solid #dddddd;
278 border: 2px solid #dddddd;
266 background: #fff8f8;
279 background: #fff8f8;
267 padding-left: 5px;
280 padding-left: 5px;
268 }
281 }
269
282
270 div.message div.reply-body {
283 div.message div.reply-body {
271 border: 2px solid #bbbbbb;
284 border: 2px solid #bbbbbb;
272 background: #fffff8;
285 background: #fffff8;
273 padding-left: 5px;
286 padding-left: 5px;
274 }
287 }
275
288
276 div.message div.stat {
289 div.message div.stat {
277 font-size: 10px;
290 font-size: 10px;
278 line-height: 1.75em;
291 line-height: 1.75em;
279 padding: 0 5px;
292 padding: 0 5px;
280 color: #333333;
293 color: #333333;
281 background: #dddddd;
294 background: #dddddd;
282 font-weight: bold;
295 font-weight: bold;
283 }
296 }
284
297
285 div.message div.message div.stat {
298 div.message div.message div.stat {
286 font-size: 10px;
299 font-size: 10px;
287 line-height: 1.75em;
300 line-height: 1.75em;
288 padding: 0 5px;
301 padding: 0 5px;
289 color: #444444;
302 color: #444444;
290 background: #bbbbbb;
303 background: #bbbbbb;
291 font-weight: bold;
304 font-weight: bold;
292 }
305 }
293
306
294 /********************
307 /********************
295 Registration
308 Registration
296 ********************/
309 ********************/
297 div.contest-title {
310 div.contest-title {
298 color: white;
311 color: white;
299 text-align: center;
312 text-align: center;
300 line-height: 2em;
313 line-height: 2em;
301 }
314 }
302
315
303 div.registration-desc {
316 div.registration-desc {
304 border: 1px dotted gray;
317 border: 1px dotted gray;
305 background: #f5f5f5;
318 background: #f5f5f5;
306 padding: 5px;
319 padding: 5px;
307 margin: 10px 0;
320 margin: 10px 0;
308 font-size: 12px;
321 font-size: 12px;
309 line-height: 1.5em;
322 line-height: 1.5em;
310 }
323 }
311
324
312 /********************
325 /********************
313 [Test Interface]
326 [Test Interface]
314 ********************/
327 ********************/
315
328
316 div.test-desc {
329 div.test-desc {
317 border: 1px dotted gray;
330 border: 1px dotted gray;
318 background: #f5f5f5;
331 background: #f5f5f5;
319 padding: 5px;
332 padding: 5px;
320 margin: 10px 0;
333 margin: 10px 0;
321 font-size: 12px;
334 font-size: 12px;
322 line-height: 1.5em;
335 line-height: 1.5em;
323 }
336 }
You need to be logged in to leave comments. Login now