Description:
fixed javascript/css assets, fixed link_to_remote in problems page
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
r322:c744bb196ba4 - - The requested commit is too big and content was truncated. 30 files changed. Show full diff
@@ -0,0 +1,41 | |||||
|
|
1 | + | ||
|
|
2 | + var Announcement = { | ||
|
|
3 | + | ||
|
|
4 | + mostRecentId: 0, | ||
|
|
5 | + | ||
|
|
6 | + refreshUrl: '/main/announcements', | ||
|
|
7 | + | ||
|
|
8 | + setMostRecentId: function(id) { | ||
|
|
9 | + Announcement.mostRecentId = id; | ||
|
|
10 | + }, | ||
|
|
11 | + | ||
|
|
12 | + updateRecentId: function(id) { | ||
|
|
13 | + if(Announcement.mostRecentId < id) | ||
|
|
14 | + Announcement.mostRecentId = id; | ||
|
|
15 | + }, | ||
|
|
16 | + | ||
|
|
17 | + refreshAnnouncement: function() { | ||
|
|
18 | + var url = Announcement.refreshUrl; | ||
|
|
19 | + new Ajax.Request(url, { | ||
|
|
20 | + method: 'get', | ||
|
|
21 | + parameters: { recent: Announcement.mostRecentId }, | ||
|
|
22 | + onSuccess: function(transport) { | ||
|
|
23 | + if((transport.status == 200) && | ||
|
|
24 | + (transport.responseText.match(/\S/)!=null)) { | ||
|
|
25 | + var announcementBody = $("announcementbox-body"); | ||
|
|
26 | + announcementBody.insert({ top: transport.responseText }); | ||
|
|
27 | + var announcementBoxes = $$(".announcementbox"); | ||
|
|
28 | + if(announcementBoxes.length!=0) | ||
|
|
29 | + announcementBoxes[0].show(); | ||
|
|
30 | + Announcement.registerRefreshEventTimer(); | ||
|
|
31 | + } | ||
|
|
32 | + } | ||
|
|
33 | + }); | ||
|
|
34 | + }, | ||
|
|
35 | + | ||
|
|
36 | + registerRefreshEventTimer: function() { | ||
|
|
37 | + setTimeout(function () { | ||
|
|
38 | + Announcement.refreshAnnouncement(); | ||
|
|
39 | + }, 30000); | ||
|
|
40 | + } | ||
|
|
41 | + }; |
This diff has been collapsed as it changes many lines, (1128 lines changed) Show them Hide them | |||||
@@ -0,0 +1,1128 | |||||
|
|
1 | + // Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) | ||
|
|
2 | + // Contributors: | ||
|
|
3 | + // Justin Palmer (http://encytemedia.com/) | ||
|
|
4 | + // Mark Pilgrim (http://diveintomark.org/) | ||
|
|
5 | + // Martin Bialasinki | ||
|
|
6 | + // | ||
|
|
7 | + // script.aculo.us is freely distributable under the terms of an MIT-style license. | ||
|
|
8 | + // For details, see the script.aculo.us web site: http://script.aculo.us/ | ||
|
|
9 | + | ||
|
|
10 | + // converts rgb() and #xxx to #xxxxxx format, | ||
|
|
11 | + // returns self (or first argument) if not convertable | ||
|
|
12 | + String.prototype.parseColor = function() { | ||
|
|
13 | + var color = '#'; | ||
|
|
14 | + if (this.slice(0,4) == 'rgb(') { | ||
|
|
15 | + var cols = this.slice(4,this.length-1).split(','); | ||
|
|
16 | + var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); | ||
|
|
17 | + } else { | ||
|
|
18 | + if (this.slice(0,1) == '#') { | ||
|
|
19 | + if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); | ||
|
|
20 | + if (this.length==7) color = this.toLowerCase(); | ||
|
|
21 | + } | ||
|
|
22 | + } | ||
|
|
23 | + return (color.length==7 ? color : (arguments[0] || this)); | ||
|
|
24 | + }; | ||
|
|
25 | + | ||
|
|
26 | + /*--------------------------------------------------------------------------*/ | ||
|
|
27 | + | ||
|
|
28 | + Element.collectTextNodes = function(element) { | ||
|
|
29 | + return $A($(element).childNodes).collect( function(node) { | ||
|
|
30 | + return (node.nodeType==3 ? node.nodeValue : | ||
|
|
31 | + (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); | ||
|
|
32 | + }).flatten().join(''); | ||
|
|
33 | + }; | ||
|
|
34 | + | ||
|
|
35 | + Element.collectTextNodesIgnoreClass = function(element, className) { | ||
|
|
36 | + return $A($(element).childNodes).collect( function(node) { | ||
|
|
37 | + return (node.nodeType==3 ? node.nodeValue : | ||
|
|
38 | + ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? | ||
|
|
39 | + Element.collectTextNodesIgnoreClass(node, className) : '')); | ||
|
|
40 | + }).flatten().join(''); | ||
|
|
41 | + }; | ||
|
|
42 | + | ||
|
|
43 | + Element.setContentZoom = function(element, percent) { | ||
|
|
44 | + element = $(element); | ||
|
|
45 | + element.setStyle({fontSize: (percent/100) + 'em'}); | ||
|
|
46 | + if (Prototype.Browser.WebKit) window.scrollBy(0,0); | ||
|
|
47 | + return element; | ||
|
|
48 | + }; | ||
|
|
49 | + | ||
|
|
50 | + Element.getInlineOpacity = function(element){ | ||
|
|
51 | + return $(element).style.opacity || ''; | ||
|
|
52 | + }; | ||
|
|
53 | + | ||
|
|
54 | + Element.forceRerendering = function(element) { | ||
|
|
55 | + try { | ||
|
|
56 | + element = $(element); | ||
|
|
57 | + var n = document.createTextNode(' '); | ||
|
|
58 | + element.appendChild(n); | ||
|
|
59 | + element.removeChild(n); | ||
|
|
60 | + } catch(e) { } | ||
|
|
61 | + }; | ||
|
|
62 | + | ||
|
|
63 | + /*--------------------------------------------------------------------------*/ | ||
|
|
64 | + | ||
|
|
65 | + var Effect = { | ||
|
|
66 | + _elementDoesNotExistError: { | ||
|
|
67 | + name: 'ElementDoesNotExistError', | ||
|
|
68 | + message: 'The specified DOM element does not exist, but is required for this effect to operate' | ||
|
|
69 | + }, | ||
|
|
70 | + Transitions: { | ||
|
|
71 | + linear: Prototype.K, | ||
|
|
72 | + sinoidal: function(pos) { | ||
|
|
73 | + return (-Math.cos(pos*Math.PI)/2) + .5; | ||
|
|
74 | + }, | ||
|
|
75 | + reverse: function(pos) { | ||
|
|
76 | + return 1-pos; | ||
|
|
77 | + }, | ||
|
|
78 | + flicker: function(pos) { | ||
|
|
79 | + var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4; | ||
|
|
80 | + return pos > 1 ? 1 : pos; | ||
|
|
81 | + }, | ||
|
|
82 | + wobble: function(pos) { | ||
|
|
83 | + return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5; | ||
|
|
84 | + }, | ||
|
|
85 | + pulse: function(pos, pulses) { | ||
|
|
86 | + return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5; | ||
|
|
87 | + }, | ||
|
|
88 | + spring: function(pos) { | ||
|
|
89 | + return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); | ||
|
|
90 | + }, | ||
|
|
91 | + none: function(pos) { | ||
|
|
92 | + return 0; | ||
|
|
93 | + }, | ||
|
|
94 | + full: function(pos) { | ||
|
|
95 | + return 1; | ||
|
|
96 | + } | ||
|
|
97 | + }, | ||
|
|
98 | + DefaultOptions: { | ||
|
|
99 | + duration: 1.0, // seconds | ||
|
|
100 | + fps: 100, // 100= assume 66fps max. | ||
|
|
101 | + sync: false, // true for combining | ||
|
|
102 | + from: 0.0, | ||
|
|
103 | + to: 1.0, | ||
|
|
104 | + delay: 0.0, | ||
|
|
105 | + queue: 'parallel' | ||
|
|
106 | + }, | ||
|
|
107 | + tagifyText: function(element) { | ||
|
|
108 | + var tagifyStyle = 'position:relative'; | ||
|
|
109 | + if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; | ||
|
|
110 | + | ||
|
|
111 | + element = $(element); | ||
|
|
112 | + $A(element.childNodes).each( function(child) { | ||
|
|
113 | + if (child.nodeType==3) { | ||
|
|
114 | + child.nodeValue.toArray().each( function(character) { | ||
|
|
115 | + element.insertBefore( | ||
|
|
116 | + new Element('span', {style: tagifyStyle}).update( | ||
|
|
117 | + character == ' ' ? String.fromCharCode(160) : character), | ||
|
|
118 | + child); | ||
|
|
119 | + }); | ||
|
|
120 | + Element.remove(child); | ||
|
|
121 | + } | ||
|
|
122 | + }); | ||
|
|
123 | + }, | ||
|
|
124 | + multiple: function(element, effect) { | ||
|
|
125 | + var elements; | ||
|
|
126 | + if (((typeof element == 'object') || | ||
|
|
127 | + Object.isFunction(element)) && | ||
|
|
128 | + (element.length)) | ||
|
|
129 | + elements = element; | ||
|
|
130 | + else | ||
|
|
131 | + elements = $(element).childNodes; | ||
|
|
132 | + | ||
|
|
133 | + var options = Object.extend({ | ||
|
|
134 | + speed: 0.1, | ||
|
|
135 | + delay: 0.0 | ||
|
|
136 | + }, arguments[2] || { }); | ||
|
|
137 | + var masterDelay = options.delay; | ||
|
|
138 | + | ||
|
|
139 | + $A(elements).each( function(element, index) { | ||
|
|
140 | + new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); | ||
|
|
141 | + }); | ||
|
|
142 | + }, | ||
|
|
143 | + PAIRS: { | ||
|
|
144 | + 'slide': ['SlideDown','SlideUp'], | ||
|
|
145 | + 'blind': ['BlindDown','BlindUp'], | ||
|
|
146 | + 'appear': ['Appear','Fade'] | ||
|
|
147 | + }, | ||
|
|
148 | + toggle: function(element, effect) { | ||
|
|
149 | + element = $(element); | ||
|
|
150 | + effect = (effect || 'appear').toLowerCase(); | ||
|
|
151 | + var options = Object.extend({ | ||
|
|
152 | + queue: { position:'end', scope:(element.id || 'global'), limit: 1 } | ||
|
|
153 | + }, arguments[2] || { }); | ||
|
|
154 | + Effect[element.visible() ? | ||
|
|
155 | + Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); | ||
|
|
156 | + } | ||
|
|
157 | + }; | ||
|
|
158 | + | ||
|
|
159 | + Effect.DefaultOptions.transition = Effect.Transitions.sinoidal; | ||
|
|
160 | + | ||
|
|
161 | + /* ------------- core effects ------------- */ | ||
|
|
162 | + | ||
|
|
163 | + Effect.ScopedQueue = Class.create(Enumerable, { | ||
|
|
164 | + initialize: function() { | ||
|
|
165 | + this.effects = []; | ||
|
|
166 | + this.interval = null; | ||
|
|
167 | + }, | ||
|
|
168 | + _each: function(iterator) { | ||
|
|
169 | + this.effects._each(iterator); | ||
|
|
170 | + }, | ||
|
|
171 | + add: function(effect) { | ||
|
|
172 | + var timestamp = new Date().getTime(); | ||
|
|
173 | + | ||
|
|
174 | + var position = Object.isString(effect.options.queue) ? | ||
|
|
175 | + effect.options.queue : effect.options.queue.position; | ||
|
|
176 | + | ||
|
|
177 | + switch(position) { | ||
|
|
178 | + case 'front': | ||
|
|
179 | + // move unstarted effects after this effect | ||
|
|
180 | + this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { | ||
|
|
181 | + e.startOn += effect.finishOn; | ||
|
|
182 | + e.finishOn += effect.finishOn; | ||
|
|
183 | + }); | ||
|
|
184 | + break; | ||
|
|
185 | + case 'with-last': | ||
|
|
186 | + timestamp = this.effects.pluck('startOn').max() || timestamp; | ||
|
|
187 | + break; | ||
|
|
188 | + case 'end': | ||
|
|
189 | + // start effect after last queued effect has finished | ||
|
|
190 | + timestamp = this.effects.pluck('finishOn').max() || timestamp; | ||
|
|
191 | + break; | ||
|
|
192 | + } | ||
|
|
193 | + | ||
|
|
194 | + effect.startOn += timestamp; | ||
|
|
195 | + effect.finishOn += timestamp; | ||
|
|
196 | + | ||
|
|
197 | + if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) | ||
|
|
198 | + this.effects.push(effect); | ||
|
|
199 | + | ||
|
|
200 | + if (!this.interval) | ||
|
|
201 | + this.interval = setInterval(this.loop.bind(this), 15); | ||
|
|
202 | + }, | ||
|
|
203 | + remove: function(effect) { | ||
|
|
204 | + this.effects = this.effects.reject(function(e) { return e==effect }); | ||
|
|
205 | + if (this.effects.length == 0) { | ||
|
|
206 | + clearInterval(this.interval); | ||
|
|
207 | + this.interval = null; | ||
|
|
208 | + } | ||
|
|
209 | + }, | ||
|
|
210 | + loop: function() { | ||
|
|
211 | + var timePos = new Date().getTime(); | ||
|
|
212 | + for(var i=0, len=this.effects.length;i<len;i++) | ||
|
|
213 | + this.effects[i] && this.effects[i].loop(timePos); | ||
|
|
214 | + } | ||
|
|
215 | + }); | ||
|
|
216 | + | ||
|
|
217 | + Effect.Queues = { | ||
|
|
218 | + instances: $H(), | ||
|
|
219 | + get: function(queueName) { | ||
|
|
220 | + if (!Object.isString(queueName)) return queueName; | ||
|
|
221 | + | ||
|
|
222 | + return this.instances.get(queueName) || | ||
|
|
223 | + this.instances.set(queueName, new Effect.ScopedQueue()); | ||
|
|
224 | + } | ||
|
|
225 | + }; | ||
|
|
226 | + Effect.Queue = Effect.Queues.get('global'); | ||
|
|
227 | + | ||
|
|
228 | + Effect.Base = Class.create({ | ||
|
|
229 | + position: null, | ||
|
|
230 | + start: function(options) { | ||
|
|
231 | + function codeForEvent(options,eventName){ | ||
|
|
232 | + return ( | ||
|
|
233 | + (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') + | ||
|
|
234 | + (options[eventName] ? 'this.options.'+eventName+'(this);' : '') | ||
|
|
235 | + ); | ||
|
|
236 | + } | ||
|
|
237 | + if (options && options.transition === false) options.transition = Effect.Transitions.linear; | ||
|
|
238 | + this.options = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { }); | ||
|
|
239 | + this.currentFrame = 0; | ||
|
|
240 | + this.state = 'idle'; | ||
|
|
241 | + this.startOn = this.options.delay*1000; | ||
|
|
242 | + this.finishOn = this.startOn+(this.options.duration*1000); | ||
|
|
243 | + this.fromToDelta = this.options.to-this.options.from; | ||
|
|
244 | + this.totalTime = this.finishOn-this.startOn; | ||
|
|
245 | + this.totalFrames = this.options.fps*this.options.duration; | ||
|
|
246 | + | ||
|
|
247 | + this.render = (function() { | ||
|
|
248 | + function dispatch(effect, eventName) { | ||
|
|
249 | + if (effect.options[eventName + 'Internal']) | ||
|
|
250 | + effect.options[eventName + 'Internal'](effect); | ||
|
|
251 | + if (effect.options[eventName]) | ||
|
|
252 | + effect.options[eventName](effect); | ||
|
|
253 | + } | ||
|
|
254 | + | ||
|
|
255 | + return function(pos) { | ||
|
|
256 | + if (this.state === "idle") { | ||
|
|
257 | + this.state = "running"; | ||
|
|
258 | + dispatch(this, 'beforeSetup'); | ||
|
|
259 | + if (this.setup) this.setup(); | ||
|
|
260 | + dispatch(this, 'afterSetup'); | ||
|
|
261 | + } | ||
|
|
262 | + if (this.state === "running") { | ||
|
|
263 | + pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from; | ||
|
|
264 | + this.position = pos; | ||
|
|
265 | + dispatch(this, 'beforeUpdate'); | ||
|
|
266 | + if (this.update) this.update(pos); | ||
|
|
267 | + dispatch(this, 'afterUpdate'); | ||
|
|
268 | + } | ||
|
|
269 | + }; | ||
|
|
270 | + })(); | ||
|
|
271 | + | ||
|
|
272 | + this.event('beforeStart'); | ||
|
|
273 | + if (!this.options.sync) | ||
|
|
274 | + Effect.Queues.get(Object.isString(this.options.queue) ? | ||
|
|
275 | + 'global' : this.options.queue.scope).add(this); | ||
|
|
276 | + }, | ||
|
|
277 | + loop: function(timePos) { | ||
|
|
278 | + if (timePos >= this.startOn) { | ||
|
|
279 | + if (timePos >= this.finishOn) { | ||
|
|
280 | + this.render(1.0); | ||
|
|
281 | + this.cancel(); | ||
|
|
282 | + this.event('beforeFinish'); | ||
|
|
283 | + if (this.finish) this.finish(); | ||
|
|
284 | + this.event('afterFinish'); | ||
|
|
285 | + return; | ||
|
|
286 | + } | ||
|
|
287 | + var pos = (timePos - this.startOn) / this.totalTime, | ||
|
|
288 | + frame = (pos * this.totalFrames).round(); | ||
|
|
289 | + if (frame > this.currentFrame) { | ||
|
|
290 | + this.render(pos); | ||
|
|
291 | + this.currentFrame = frame; | ||
|
|
292 | + } | ||
|
|
293 | + } | ||
|
|
294 | + }, | ||
|
|
295 | + cancel: function() { | ||
|
|
296 | + if (!this.options.sync) | ||
|
|
297 | + Effect.Queues.get(Object.isString(this.options.queue) ? | ||
|
|
298 | + 'global' : this.options.queue.scope).remove(this); | ||
|
|
299 | + this.state = 'finished'; | ||
|
|
300 | + }, | ||
|
|
301 | + event: function(eventName) { | ||
|
|
302 | + if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); | ||
|
|
303 | + if (this.options[eventName]) this.options[eventName](this); | ||
|
|
304 | + }, | ||
|
|
305 | + inspect: function() { | ||
|
|
306 | + var data = $H(); | ||
|
|
307 | + for(property in this) | ||
|
|
308 | + if (!Object.isFunction(this[property])) data.set(property, this[property]); | ||
|
|
309 | + return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>'; | ||
|
|
310 | + } | ||
|
|
311 | + }); | ||
|
|
312 | + | ||
|
|
313 | + Effect.Parallel = Class.create(Effect.Base, { | ||
|
|
314 | + initialize: function(effects) { | ||
|
|
315 | + this.effects = effects || []; | ||
|
|
316 | + this.start(arguments[1]); | ||
|
|
317 | + }, | ||
|
|
318 | + update: function(position) { | ||
|
|
319 | + this.effects.invoke('render', position); | ||
|
|
320 | + }, | ||
|
|
321 | + finish: function(position) { | ||
|
|
322 | + this.effects.each( function(effect) { | ||
|
|
323 | + effect.render(1.0); | ||
|
|
324 | + effect.cancel(); | ||
|
|
325 | + effect.event('beforeFinish'); | ||
|
|
326 | + if (effect.finish) effect.finish(position); | ||
|
|
327 | + effect.event('afterFinish'); | ||
|
|
328 | + }); | ||
|
|
329 | + } | ||
|
|
330 | + }); | ||
|
|
331 | + | ||
|
|
332 | + Effect.Tween = Class.create(Effect.Base, { | ||
|
|
333 | + initialize: function(object, from, to) { | ||
|
|
334 | + object = Object.isString(object) ? $(object) : object; | ||
|
|
335 | + var args = $A(arguments), method = args.last(), | ||
|
|
336 | + options = args.length == 5 ? args[3] : null; | ||
|
|
337 | + this.method = Object.isFunction(method) ? method.bind(object) : | ||
|
|
338 | + Object.isFunction(object[method]) ? object[method].bind(object) : | ||
|
|
339 | + function(value) { object[method] = value }; | ||
|
|
340 | + this.start(Object.extend({ from: from, to: to }, options || { })); | ||
|
|
341 | + }, | ||
|
|
342 | + update: function(position) { | ||
|
|
343 | + this.method(position); | ||
|
|
344 | + } | ||
|
|
345 | + }); | ||
|
|
346 | + | ||
|
|
347 | + Effect.Event = Class.create(Effect.Base, { | ||
|
|
348 | + initialize: function() { | ||
|
|
349 | + this.start(Object.extend({ duration: 0 }, arguments[0] || { })); | ||
|
|
350 | + }, | ||
|
|
351 | + update: Prototype.emptyFunction | ||
|
|
352 | + }); | ||
|
|
353 | + | ||
|
|
354 | + Effect.Opacity = Class.create(Effect.Base, { | ||
|
|
355 | + initialize: function(element) { | ||
|
|
356 | + this.element = $(element); | ||
|
|
357 | + if (!this.element) throw(Effect._elementDoesNotExistError); | ||
|
|
358 | + // make this work on IE on elements without 'layout' | ||
|
|
359 | + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) | ||
|
|
360 | + this.element.setStyle({zoom: 1}); | ||
|
|
361 | + var options = Object.extend({ | ||
|
|
362 | + from: this.element.getOpacity() || 0.0, | ||
|
|
363 | + to: 1.0 | ||
|
|
364 | + }, arguments[1] || { }); | ||
|
|
365 | + this.start(options); | ||
|
|
366 | + }, | ||
|
|
367 | + update: function(position) { | ||
|
|
368 | + this.element.setOpacity(position); | ||
|
|
369 | + } | ||
|
|
370 | + }); | ||
|
|
371 | + | ||
|
|
372 | + Effect.Move = Class.create(Effect.Base, { | ||
|
|
373 | + initialize: function(element) { | ||
|
|
374 | + this.element = $(element); | ||
|
|
375 | + if (!this.element) throw(Effect._elementDoesNotExistError); | ||
|
|
376 | + var options = Object.extend({ | ||
|
|
377 | + x: 0, | ||
|
|
378 | + y: 0, | ||
|
|
379 | + mode: 'relative' | ||
|
|
380 | + }, arguments[1] || { }); | ||
|
|
381 | + this.start(options); | ||
|
|
382 | + }, | ||
|
|
383 | + setup: function() { | ||
|
|
384 | + this.element.makePositioned(); | ||
|
|
385 | + this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); | ||
|
|
386 | + this.originalTop = parseFloat(this.element.getStyle('top') || '0'); | ||
|
|
387 | + if (this.options.mode == 'absolute') { | ||
|
|
388 | + this.options.x = this.options.x - this.originalLeft; | ||
|
|
389 | + this.options.y = this.options.y - this.originalTop; | ||
|
|
390 | + } | ||
|
|
391 | + }, | ||
|
|
392 | + update: function(position) { | ||
|
|
393 | + this.element.setStyle({ | ||
|
|
394 | + left: (this.options.x * position + this.originalLeft).round() + 'px', | ||
|
|
395 | + top: (this.options.y * position + this.originalTop).round() + 'px' | ||
|
|
396 | + }); | ||
|
|
397 | + } | ||
|
|
398 | + }); | ||
|
|
399 | + | ||
|
|
400 | + // for backwards compatibility | ||
|
|
401 | + Effect.MoveBy = function(element, toTop, toLeft) { | ||
|
|
402 | + return new Effect.Move(element, | ||
|
|
403 | + Object.extend({ x: toLeft, y: toTop }, arguments[3] || { })); | ||
|
|
404 | + }; | ||
|
|
405 | + | ||
|
|
406 | + Effect.Scale = Class.create(Effect.Base, { | ||
|
|
407 | + initialize: function(element, percent) { | ||
|
|
408 | + this.element = $(element); | ||
|
|
409 | + if (!this.element) throw(Effect._elementDoesNotExistError); | ||
|
|
410 | + var options = Object.extend({ | ||
|
|
411 | + scaleX: true, | ||
|
|
412 | + scaleY: true, | ||
|
|
413 | + scaleContent: true, | ||
|
|
414 | + scaleFromCenter: false, | ||
|
|
415 | + scaleMode: 'box', // 'box' or 'contents' or { } with provided values | ||
|
|
416 | + scaleFrom: 100.0, | ||
|
|
417 | + scaleTo: percent | ||
|
|
418 | + }, arguments[2] || { }); | ||
|
|
419 | + this.start(options); | ||
|
|
420 | + }, | ||
|
|
421 | + setup: function() { | ||
|
|
422 | + this.restoreAfterFinish = this.options.restoreAfterFinish || false; | ||
|
|
423 | + this.elementPositioning = this.element.getStyle('position'); | ||
|
|
424 | + | ||
|
|
425 | + this.originalStyle = { }; | ||
|
|
426 | + ['top','left','width','height','fontSize'].each( function(k) { | ||
|
|
427 | + this.originalStyle[k] = this.element.style[k]; | ||
|
|
428 | + }.bind(this)); | ||
|
|
429 | + | ||
|
|
430 | + this.originalTop = this.element.offsetTop; | ||
|
|
431 | + this.originalLeft = this.element.offsetLeft; | ||
|
|
432 | + | ||
|
|
433 | + var fontSize = this.element.getStyle('font-size') || '100%'; | ||
|
|
434 | + ['em','px','%','pt'].each( function(fontSizeType) { | ||
|
|
435 | + if (fontSize.indexOf(fontSizeType)>0) { | ||
|
|
436 | + this.fontSize = parseFloat(fontSize); | ||
|
|
437 | + this.fontSizeType = fontSizeType; | ||
|
|
438 | + } | ||
|
|
439 | + }.bind(this)); | ||
|
|
440 | + | ||
|
|
441 | + this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; | ||
|
|
442 | + | ||
|
|
443 | + this.dims = null; | ||
|
|
444 | + if (this.options.scaleMode=='box') | ||
|
|
445 | + this.dims = [this.element.offsetHeight, this.element.offsetWidth]; | ||
|
|
446 | + if (/^content/.test(this.options.scaleMode)) | ||
|
|
447 | + this.dims = [this.element.scrollHeight, this.element.scrollWidth]; | ||
|
|
448 | + if (!this.dims) | ||
|
|
449 | + this.dims = [this.options.scaleMode.originalHeight, | ||
|
|
450 | + this.options.scaleMode.originalWidth]; | ||
|
|
451 | + }, | ||
|
|
452 | + update: function(position) { | ||
|
|
453 | + var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); | ||
|
|
454 | + if (this.options.scaleContent && this.fontSize) | ||
|
|
455 | + this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); | ||
|
|
456 | + this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); | ||
|
|
457 | + }, | ||
|
|
458 | + finish: function(position) { | ||
|
|
459 | + if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); | ||
|
|
460 | + }, | ||
|
|
461 | + setDimensions: function(height, width) { | ||
|
|
462 | + var d = { }; | ||
|
|
463 | + if (this.options.scaleX) d.width = width.round() + 'px'; | ||
|
|
464 | + if (this.options.scaleY) d.height = height.round() + 'px'; | ||
|
|
465 | + if (this.options.scaleFromCenter) { | ||
|
|
466 | + var topd = (height - this.dims[0])/2; | ||
|
|
467 | + var leftd = (width - this.dims[1])/2; | ||
|
|
468 | + if (this.elementPositioning == 'absolute') { | ||
|
|
469 | + if (this.options.scaleY) d.top = this.originalTop-topd + 'px'; | ||
|
|
470 | + if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; | ||
|
|
471 | + } else { | ||
|
|
472 | + if (this.options.scaleY) d.top = -topd + 'px'; | ||
|
|
473 | + if (this.options.scaleX) d.left = -leftd + 'px'; | ||
|
|
474 | + } | ||
|
|
475 | + } | ||
|
|
476 | + this.element.setStyle(d); | ||
|
|
477 | + } | ||
|
|
478 | + }); | ||
|
|
479 | + | ||
|
|
480 | + Effect.Highlight = Class.create(Effect.Base, { | ||
|
|
481 | + initialize: function(element) { | ||
|
|
482 | + this.element = $(element); | ||
|
|
483 | + if (!this.element) throw(Effect._elementDoesNotExistError); | ||
|
|
484 | + var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { }); | ||
|
|
485 | + this.start(options); | ||
|
|
486 | + }, | ||
|
|
487 | + setup: function() { | ||
|
|
488 | + // Prevent executing on elements not in the layout flow | ||
|
|
489 | + if (this.element.getStyle('display')=='none') { this.cancel(); return; } | ||
|
|
490 | + // Disable background image during the effect | ||
|
|
491 | + this.oldStyle = { }; | ||
|
|
492 | + if (!this.options.keepBackgroundImage) { | ||
|
|
493 | + this.oldStyle.backgroundImage = this.element.getStyle('background-image'); | ||
|
|
494 | + this.element.setStyle({backgroundImage: 'none'}); | ||
|
|
495 | + } | ||
|
|
496 | + if (!this.options.endcolor) | ||
|
|
497 | + this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); | ||
|
|
498 | + if (!this.options.restorecolor) | ||
|
|
499 | + this.options.restorecolor = this.element.getStyle('background-color'); | ||
|
|
500 | + // init color calculations | ||
|
|
501 | + this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); | ||
|
|
502 | + this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); | ||
|
|
503 | + }, | ||
|
|
504 | + update: function(position) { | ||
|
|
505 | + this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ | ||
|
|
506 | + return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) }); | ||
|
|
507 | + }, | ||
|
|
508 | + finish: function() { | ||
|
|
509 | + this.element.setStyle(Object.extend(this.oldStyle, { | ||
|
|
510 | + backgroundColor: this.options.restorecolor | ||
|
|
511 | + })); | ||
|
|
512 | + } | ||
|
|
513 | + }); | ||
|
|
514 | + | ||
|
|
515 | + Effect.ScrollTo = function(element) { | ||
|
|
516 | + var options = arguments[1] || { }, | ||
|
|
517 | + scrollOffsets = document.viewport.getScrollOffsets(), | ||
|
|
518 | + elementOffsets = $(element).cumulativeOffset(); | ||
|
|
519 | + | ||
|
|
520 | + if (options.offset) elementOffsets[1] += options.offset; | ||
|
|
521 | + | ||
|
|
522 | + return new Effect.Tween(null, | ||
|
|
523 | + scrollOffsets.top, | ||
|
|
524 | + elementOffsets[1], | ||
|
|
525 | + options, | ||
|
|
526 | + function(p){ scrollTo(scrollOffsets.left, p.round()); } | ||
|
|
527 | + ); | ||
|
|
528 | + }; | ||
|
|
529 | + | ||
|
|
530 | + /* ------------- combination effects ------------- */ | ||
|
|
531 | + | ||
|
|
532 | + Effect.Fade = function(element) { | ||
|
|
533 | + element = $(element); | ||
|
|
534 | + var oldOpacity = element.getInlineOpacity(); | ||
|
|
535 | + var options = Object.extend({ | ||
|
|
536 | + from: element.getOpacity() || 1.0, | ||
|
|
537 | + to: 0.0, | ||
|
|
538 | + afterFinishInternal: function(effect) { | ||
|
|
539 | + if (effect.options.to!=0) return; | ||
|
|
540 | + effect.element.hide().setStyle({opacity: oldOpacity}); | ||
|
|
541 | + } | ||
|
|
542 | + }, arguments[1] || { }); | ||
|
|
543 | + return new Effect.Opacity(element,options); | ||
|
|
544 | + }; | ||
|
|
545 | + | ||
|
|
546 | + Effect.Appear = function(element) { | ||
|
|
547 | + element = $(element); | ||
|
|
548 | + var options = Object.extend({ | ||
|
|
549 | + from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), | ||
|
|
550 | + to: 1.0, | ||
|
|
551 | + // force Safari to render floated elements properly | ||
|
|
552 | + afterFinishInternal: function(effect) { | ||
|
|
553 | + effect.element.forceRerendering(); | ||
|
|
554 | + }, | ||
|
|
555 | + beforeSetup: function(effect) { | ||
|
|
556 | + effect.element.setOpacity(effect.options.from).show(); | ||
|
|
557 | + }}, arguments[1] || { }); | ||
|
|
558 | + return new Effect.Opacity(element,options); | ||
|
|
559 | + }; | ||
|
|
560 | + | ||
|
|
561 | + Effect.Puff = function(element) { | ||
|
|
562 | + element = $(element); | ||
|
|
563 | + var oldStyle = { | ||
|
|
564 | + opacity: element.getInlineOpacity(), | ||
|
|
565 | + position: element.getStyle('position'), | ||
|
|
566 | + top: element.style.top, | ||
|
|
567 | + left: element.style.left, | ||
|
|
568 | + width: element.style.width, | ||
|
|
569 | + height: element.style.height | ||
|
|
570 | + }; | ||
|
|
571 | + return new Effect.Parallel( | ||
|
|
572 | + [ new Effect.Scale(element, 200, | ||
|
|
573 | + { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), | ||
|
|
574 | + new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], | ||
|
|
575 | + Object.extend({ duration: 1.0, | ||
|
|
576 | + beforeSetupInternal: function(effect) { | ||
|
|
577 | + Position.absolutize(effect.effects[0].element); | ||
|
|
578 | + }, | ||
|
|
579 | + afterFinishInternal: function(effect) { | ||
|
|
580 | + effect.effects[0].element.hide().setStyle(oldStyle); } | ||
|
|
581 | + }, arguments[1] || { }) | ||
|
|
582 | + ); | ||
|
|
583 | + }; | ||
|
|
584 | + | ||
|
|
585 | + Effect.BlindUp = function(element) { | ||
|
|
586 | + element = $(element); | ||
|
|
587 | + element.makeClipping(); | ||
|
|
588 | + return new Effect.Scale(element, 0, | ||
|
|
589 | + Object.extend({ scaleContent: false, | ||
|
|
590 | + scaleX: false, | ||
|
|
591 | + restoreAfterFinish: true, | ||
|
|
592 | + afterFinishInternal: function(effect) { | ||
|
|
593 | + effect.element.hide().undoClipping(); | ||
|
|
594 | + } | ||
|
|
595 | + }, arguments[1] || { }) | ||
|
|
596 | + ); | ||
|
|
597 | + }; | ||
|
|
598 | + | ||
|
|
599 | + Effect.BlindDown = function(element) { | ||
|
|
600 | + element = $(element); | ||
|
|
601 | + var elementDimensions = element.getDimensions(); | ||
|
|
602 | + return new Effect.Scale(element, 100, Object.extend({ | ||
|
|
603 | + scaleContent: false, | ||
|
|
604 | + scaleX: false, | ||
|
|
605 | + scaleFrom: 0, | ||
|
|
606 | + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, | ||
|
|
607 | + restoreAfterFinish: true, | ||
|
|
608 | + afterSetup: function(effect) { | ||
|
|
609 | + effect.element.makeClipping().setStyle({height: '0px'}).show(); | ||
|
|
610 | + }, | ||
|
|
611 | + afterFinishInternal: function(effect) { | ||
|
|
612 | + effect.element.undoClipping(); | ||
|
|
613 | + } | ||
|
|
614 | + }, arguments[1] || { })); | ||
|
|
615 | + }; | ||
|
|
616 | + | ||
|
|
617 | + Effect.SwitchOff = function(element) { | ||
|
|
618 | + element = $(element); | ||
|
|
619 | + var oldOpacity = element.getInlineOpacity(); | ||
|
|
620 | + return new Effect.Appear(element, Object.extend({ | ||
|
|
621 | + duration: 0.4, | ||
|
|
622 | + from: 0, | ||
|
|
623 | + transition: Effect.Transitions.flicker, | ||
|
|
624 | + afterFinishInternal: function(effect) { | ||
|
|
625 | + new Effect.Scale(effect.element, 1, { | ||
|
|
626 | + duration: 0.3, scaleFromCenter: true, | ||
|
|
627 | + scaleX: false, scaleContent: false, restoreAfterFinish: true, | ||
|
|
628 | + beforeSetup: function(effect) { | ||
|
|
629 | + effect.element.makePositioned().makeClipping(); | ||
|
|
630 | + }, | ||
|
|
631 | + afterFinishInternal: function(effect) { | ||
|
|
632 | + effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); | ||
|
|
633 | + } | ||
|
|
634 | + }); | ||
|
|
635 | + } | ||
|
|
636 | + }, arguments[1] || { })); | ||
|
|
637 | + }; | ||
|
|
638 | + | ||
|
|
639 | + Effect.DropOut = function(element) { | ||
|
|
640 | + element = $(element); | ||
|
|
641 | + var oldStyle = { | ||
|
|
642 | + top: element.getStyle('top'), | ||
|
|
643 | + left: element.getStyle('left'), | ||
|
|
644 | + opacity: element.getInlineOpacity() }; | ||
|
|
645 | + return new Effect.Parallel( | ||
|
|
646 | + [ new Effect.Move(element, {x: 0, y: 100, sync: true }), | ||
|
|
647 | + new Effect.Opacity(element, { sync: true, to: 0.0 }) ], | ||
|
|
648 | + Object.extend( | ||
|
|
649 | + { duration: 0.5, | ||
|
|
650 | + beforeSetup: function(effect) { | ||
|
|
651 | + effect.effects[0].element.makePositioned(); | ||
|
|
652 | + }, | ||
|
|
653 | + afterFinishInternal: function(effect) { | ||
|
|
654 | + effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); | ||
|
|
655 | + } | ||
|
|
656 | + }, arguments[1] || { })); | ||
|
|
657 | + }; | ||
|
|
658 | + | ||
|
|
659 | + Effect.Shake = function(element) { | ||
|
|
660 | + element = $(element); | ||
|
|
661 | + var options = Object.extend({ | ||
|
|
662 | + distance: 20, | ||
|
|
663 | + duration: 0.5 | ||
|
|
664 | + }, arguments[1] || {}); | ||
|
|
665 | + var distance = parseFloat(options.distance); | ||
|
|
666 | + var split = parseFloat(options.duration) / 10.0; | ||
|
|
667 | + var oldStyle = { | ||
|
|
668 | + top: element.getStyle('top'), | ||
|
|
669 | + left: element.getStyle('left') }; | ||
|
|
670 | + return new Effect.Move(element, | ||
|
|
671 | + { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) { | ||
|
|
672 | + new Effect.Move(effect.element, | ||
|
|
673 | + { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { | ||
|
|
674 | + new Effect.Move(effect.element, | ||
|
|
675 | + { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { | ||
|
|
676 | + new Effect.Move(effect.element, | ||
|
|
677 | + { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { | ||
|
|
678 | + new Effect.Move(effect.element, | ||
|
|
679 | + { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { | ||
|
|
680 | + new Effect.Move(effect.element, | ||
|
|
681 | + { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) { | ||
|
|
682 | + effect.element.undoPositioned().setStyle(oldStyle); | ||
|
|
683 | + }}); }}); }}); }}); }}); }}); | ||
|
|
684 | + }; | ||
|
|
685 | + | ||
|
|
686 | + Effect.SlideDown = function(element) { | ||
|
|
687 | + element = $(element).cleanWhitespace(); | ||
|
|
688 | + // SlideDown need to have the content of the element wrapped in a container element with fixed height! | ||
|
|
689 | + var oldInnerBottom = element.down().getStyle('bottom'); | ||
|
|
690 | + var elementDimensions = element.getDimensions(); | ||
|
|
691 | + return new Effect.Scale(element, 100, Object.extend({ | ||
|
|
692 | + scaleContent: false, | ||
|
|
693 | + scaleX: false, | ||
|
|
694 | + scaleFrom: window.opera ? 0 : 1, | ||
|
|
695 | + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, | ||
|
|
696 | + restoreAfterFinish: true, | ||
|
|
697 | + afterSetup: function(effect) { | ||
|
|
698 | + effect.element.makePositioned(); | ||
|
|
699 | + effect.element.down().makePositioned(); | ||
|
|
700 | + if (window.opera) effect.element.setStyle({top: ''}); | ||
|
|
701 | + effect.element.makeClipping().setStyle({height: '0px'}).show(); | ||
|
|
702 | + }, | ||
|
|
703 | + afterUpdateInternal: function(effect) { | ||
|
|
704 | + effect.element.down().setStyle({bottom: | ||
|
|
705 | + (effect.dims[0] - effect.element.clientHeight) + 'px' }); | ||
|
|
706 | + }, | ||
|
|
707 | + afterFinishInternal: function(effect) { | ||
|
|
708 | + effect.element.undoClipping().undoPositioned(); | ||
|
|
709 | + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } | ||
|
|
710 | + }, arguments[1] || { }) | ||
|
|
711 | + ); | ||
|
|
712 | + }; | ||
|
|
713 | + | ||
|
|
714 | + Effect.SlideUp = function(element) { | ||
|
|
715 | + element = $(element).cleanWhitespace(); | ||
|
|
716 | + var oldInnerBottom = element.down().getStyle('bottom'); | ||
|
|
717 | + var elementDimensions = element.getDimensions(); | ||
|
|
718 | + return new Effect.Scale(element, window.opera ? 0 : 1, | ||
|
|
719 | + Object.extend({ scaleContent: false, | ||
|
|
720 | + scaleX: false, | ||
|
|
721 | + scaleMode: 'box', | ||
|
|
722 | + scaleFrom: 100, | ||
|
|
723 | + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, | ||
|
|
724 | + restoreAfterFinish: true, | ||
|
|
725 | + afterSetup: function(effect) { | ||
|
|
726 | + effect.element.makePositioned(); | ||
|
|
727 | + effect.element.down().makePositioned(); | ||
|
|
728 | + if (window.opera) effect.element.setStyle({top: ''}); | ||
|
|
729 | + effect.element.makeClipping().show(); | ||
|
|
730 | + }, | ||
|
|
731 | + afterUpdateInternal: function(effect) { | ||
|
|
732 | + effect.element.down().setStyle({bottom: | ||
|
|
733 | + (effect.dims[0] - effect.element.clientHeight) + 'px' }); | ||
|
|
734 | + }, | ||
|
|
735 | + afterFinishInternal: function(effect) { | ||
|
|
736 | + effect.element.hide().undoClipping().undoPositioned(); | ||
|
|
737 | + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); | ||
|
|
738 | + } | ||
|
|
739 | + }, arguments[1] || { }) | ||
|
|
740 | + ); | ||
|
|
741 | + }; | ||
|
|
742 | + | ||
|
|
743 | + // Bug in opera makes the TD containing this element expand for a instance after finish | ||
|
|
744 | + Effect.Squish = function(element) { | ||
|
|
745 | + return new Effect.Scale(element, window.opera ? 1 : 0, { | ||
|
|
746 | + restoreAfterFinish: true, | ||
|
|
747 | + beforeSetup: function(effect) { | ||
|
|
748 | + effect.element.makeClipping(); | ||
|
|
749 | + }, | ||
|
|
750 | + afterFinishInternal: function(effect) { | ||
|
|
751 | + effect.element.hide().undoClipping(); | ||
|
|
752 | + } | ||
|
|
753 | + }); | ||
|
|
754 | + }; | ||
|
|
755 | + | ||
|
|
756 | + Effect.Grow = function(element) { | ||
|
|
757 | + element = $(element); | ||
|
|
758 | + var options = Object.extend({ | ||
|
|
759 | + direction: 'center', | ||
|
|
760 | + moveTransition: Effect.Transitions.sinoidal, | ||
|
|
761 | + scaleTransition: Effect.Transitions.sinoidal, | ||
|
|
762 | + opacityTransition: Effect.Transitions.full | ||
|
|
763 | + }, arguments[1] || { }); | ||
|
|
764 | + var oldStyle = { | ||
|
|
765 | + top: element.style.top, | ||
|
|
766 | + left: element.style.left, | ||
|
|
767 | + height: element.style.height, | ||
|
|
768 | + width: element.style.width, | ||
|
|
769 | + opacity: element.getInlineOpacity() }; | ||
|
|
770 | + | ||
|
|
771 | + var dims = element.getDimensions(); | ||
|
|
772 | + var initialMoveX, initialMoveY; | ||
|
|
773 | + var moveX, moveY; | ||
|
|
774 | + | ||
|
|
775 | + switch (options.direction) { | ||
|
|
776 | + case 'top-left': | ||
|
|
777 | + initialMoveX = initialMoveY = moveX = moveY = 0; | ||
|
|
778 | + break; | ||
|
|
779 | + case 'top-right': | ||
|
|
780 | + initialMoveX = dims.width; | ||
|
|
781 | + initialMoveY = moveY = 0; | ||
|
|
782 | + moveX = -dims.width; | ||
|
|
783 | + break; | ||
|
|
784 | + case 'bottom-left': | ||
|
|
785 | + initialMoveX = moveX = 0; | ||
|
|
786 | + initialMoveY = dims.height; | ||
|
|
787 | + moveY = -dims.height; | ||
|
|
788 | + break; | ||
|
|
789 | + case 'bottom-right': | ||
|
|
790 | + initialMoveX = dims.width; | ||
|
|
791 | + initialMoveY = dims.height; | ||
|
|
792 | + moveX = -dims.width; | ||
|
|
793 | + moveY = -dims.height; | ||
|
|
794 | + break; | ||
|
|
795 | + case 'center': | ||
|
|
796 | + initialMoveX = dims.width / 2; | ||
|
|
797 | + initialMoveY = dims.height / 2; | ||
|
|
798 | + moveX = -dims.width / 2; | ||
|
|
799 | + moveY = -dims.height / 2; | ||
|
|
800 | + break; | ||
|
|
801 | + } | ||
|
|
802 | + | ||
|
|
803 | + return new Effect.Move(element, { | ||
|
|
804 | + x: initialMoveX, | ||
|
|
805 | + y: initialMoveY, | ||
|
|
806 | + duration: 0.01, | ||
|
|
807 | + beforeSetup: function(effect) { | ||
|
|
808 | + effect.element.hide().makeClipping().makePositioned(); | ||
|
|
809 | + }, | ||
|
|
810 | + afterFinishInternal: function(effect) { | ||
|
|
811 | + new Effect.Parallel( | ||
|
|
812 | + [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), | ||
|
|
813 | + new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), | ||
|
|
814 | + new Effect.Scale(effect.element, 100, { | ||
|
|
815 | + scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, | ||
|
|
816 | + sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) | ||
|
|
817 | + ], Object.extend({ | ||
|
|
818 | + beforeSetup: function(effect) { | ||
|
|
819 | + effect.effects[0].element.setStyle({height: '0px'}).show(); | ||
|
|
820 | + }, | ||
|
|
821 | + afterFinishInternal: function(effect) { | ||
|
|
822 | + effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); | ||
|
|
823 | + } | ||
|
|
824 | + }, options) | ||
|
|
825 | + ); | ||
|
|
826 | + } | ||
|
|
827 | + }); | ||
|
|
828 | + }; | ||
|
|
829 | + | ||
|
|
830 | + Effect.Shrink = function(element) { | ||
|
|
831 | + element = $(element); | ||
|
|
832 | + var options = Object.extend({ | ||
|
|
833 | + direction: 'center', | ||
|
|
834 | + moveTransition: Effect.Transitions.sinoidal, | ||
|
|
835 | + scaleTransition: Effect.Transitions.sinoidal, | ||
|
|
836 | + opacityTransition: Effect.Transitions.none | ||
|
|
837 | + }, arguments[1] || { }); | ||
|
|
838 | + var oldStyle = { | ||
|
|
839 | + top: element.style.top, | ||
|
|
840 | + left: element.style.left, | ||
|
|
841 | + height: element.style.height, | ||
|
|
842 | + width: element.style.width, | ||
|
|
843 | + opacity: element.getInlineOpacity() }; | ||
|
|
844 | + | ||
|
|
845 | + var dims = element.getDimensions(); | ||
|
|
846 | + var moveX, moveY; | ||
|
|
847 | + | ||
|
|
848 | + switch (options.direction) { | ||
|
|
849 | + case 'top-left': | ||
|
|
850 | + moveX = moveY = 0; | ||
|
|
851 | + break; | ||
|
|
852 | + case 'top-right': | ||
|
|
853 | + moveX = dims.width; | ||
|
|
854 | + moveY = 0; | ||
|
|
855 | + break; | ||
|
|
856 | + case 'bottom-left': | ||
|
|
857 | + moveX = 0; | ||
|
|
858 | + moveY = dims.height; | ||
|
|
859 | + break; | ||
|
|
860 | + case 'bottom-right': | ||
|
|
861 | + moveX = dims.width; | ||
|
|
862 | + moveY = dims.height; | ||
|
|
863 | + break; | ||
|
|
864 | + case 'center': | ||
|
|
865 | + moveX = dims.width / 2; | ||
|
|
866 | + moveY = dims.height / 2; | ||
|
|
867 | + break; | ||
|
|
868 | + } | ||
|
|
869 | + | ||
|
|
870 | + return new Effect.Parallel( | ||
|
|
871 | + [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), | ||
|
|
872 | + new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), | ||
|
|
873 | + new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) | ||
|
|
874 | + ], Object.extend({ | ||
|
|
875 | + beforeStartInternal: function(effect) { | ||
|
|
876 | + effect.effects[0].element.makePositioned().makeClipping(); | ||
|
|
877 | + }, | ||
|
|
878 | + afterFinishInternal: function(effect) { | ||
|
|
879 | + effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } | ||
|
|
880 | + }, options) | ||
|
|
881 | + ); | ||
|
|
882 | + }; | ||
|
|
883 | + | ||
|
|
884 | + Effect.Pulsate = function(element) { | ||
|
|
885 | + element = $(element); | ||
|
|
886 | + var options = arguments[1] || { }, | ||
|
|
887 | + oldOpacity = element.getInlineOpacity(), | ||
|
|
888 | + transition = options.transition || Effect.Transitions.linear, | ||
|
|
889 | + reverser = function(pos){ | ||
|
|
890 | + return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5); | ||
|
|
891 | + }; | ||
|
|
892 | + | ||
|
|
893 | + return new Effect.Opacity(element, | ||
|
|
894 | + Object.extend(Object.extend({ duration: 2.0, from: 0, | ||
|
|
895 | + afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } | ||
|
|
896 | + }, options), {transition: reverser})); | ||
|
|
897 | + }; | ||
|
|
898 | + | ||
|
|
899 | + Effect.Fold = function(element) { | ||
|
|
900 | + element = $(element); | ||
|
|
901 | + var oldStyle = { | ||
|
|
902 | + top: element.style.top, | ||
|
|
903 | + left: element.style.left, | ||
|
|
904 | + width: element.style.width, | ||
|
|
905 | + height: element.style.height }; | ||
|
|
906 | + element.makeClipping(); | ||
|
|
907 | + return new Effect.Scale(element, 5, Object.extend({ | ||
|
|
908 | + scaleContent: false, | ||
|
|
909 | + scaleX: false, | ||
|
|
910 | + afterFinishInternal: function(effect) { | ||
|
|
911 | + new Effect.Scale(element, 1, { | ||
|
|
912 | + scaleContent: false, | ||
|
|
913 | + scaleY: false, | ||
|
|
914 | + afterFinishInternal: function(effect) { | ||
|
|
915 | + effect.element.hide().undoClipping().setStyle(oldStyle); | ||
|
|
916 | + } }); | ||
|
|
917 | + }}, arguments[1] || { })); | ||
|
|
918 | + }; | ||
|
|
919 | + | ||
|
|
920 | + Effect.Morph = Class.create(Effect.Base, { | ||
|
|
921 | + initialize: function(element) { | ||
|
|
922 | + this.element = $(element); | ||
|
|
923 | + if (!this.element) throw(Effect._elementDoesNotExistError); | ||
|
|
924 | + var options = Object.extend({ | ||
|
|
925 | + style: { } | ||
|
|
926 | + }, arguments[1] || { }); | ||
|
|
927 | + | ||
|
|
928 | + if (!Object.isString(options.style)) this.style = $H(options.style); | ||
|
|
929 | + else { | ||
|
|
930 | + if (options.style.include(':')) | ||
|
|
931 | + this.style = options.style.parseStyle(); | ||
|
|
932 | + else { | ||
|
|
933 | + this.element.addClassName(options.style); | ||
|
|
934 | + this.style = $H(this.element.getStyles()); | ||
|
|
935 | + this.element.removeClassName(options.style); | ||
|
|
936 | + var css = this.element.getStyles(); | ||
|
|
937 | + this.style = this.style.reject(function(style) { | ||
|
|
938 | + return style.value == css[style.key]; | ||
|
|
939 | + }); | ||
|
|
940 | + options.afterFinishInternal = function(effect) { | ||
|
|
941 | + effect.element.addClassName(effect.options.style); | ||
|
|
942 | + effect.transforms.each(function(transform) { | ||
|
|
943 | + effect.element.style[transform.style] = ''; | ||
|
|
944 | + }); | ||
|
|
945 | + }; | ||
|
|
946 | + } | ||
|
|
947 | + } | ||
|
|
948 | + this.start(options); | ||
|
|
949 | + }, | ||
|
|
950 | + | ||
|
|
951 | + setup: function(){ | ||
|
|
952 | + function parseColor(color){ | ||
|
|
953 | + if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; | ||
|
|
954 | + color = color.parseColor(); | ||
|
|
955 | + return $R(0,2).map(function(i){ | ||
|
|
956 | + return parseInt( color.slice(i*2+1,i*2+3), 16 ); | ||
|
|
957 | + }); | ||
|
|
958 | + } | ||
|
|
959 | + this.transforms = this.style.map(function(pair){ | ||
|
|
960 | + var property = pair[0], value = pair[1], unit = null; | ||
|
|
961 | + | ||
|
|
962 | + if (value.parseColor('#zzzzzz') != '#zzzzzz') { | ||
|
|
963 | + value = value.parseColor(); | ||
|
|
964 | + unit = 'color'; | ||
|
|
965 | + } else if (property == 'opacity') { | ||
|
|
966 | + value = parseFloat(value); | ||
|
|
967 | + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) | ||
|
|
968 | + this.element.setStyle({zoom: 1}); | ||
|
|
969 | + } else if (Element.CSS_LENGTH.test(value)) { | ||
|
|
970 | + var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); | ||
|
|
971 | + value = parseFloat(components[1]); | ||
|
|
972 | + unit = (components.length == 3) ? components[2] : null; | ||
|
|
973 | + } | ||
|
|
974 | + | ||
|
|
975 | + var originalValue = this.element.getStyle(property); | ||
|
|
976 | + return { | ||
|
|
977 | + style: property.camelize(), | ||
|
|
978 | + originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), | ||
|
|
979 | + targetValue: unit=='color' ? parseColor(value) : value, | ||
|
|
980 | + unit: unit | ||
|
|
981 | + }; | ||
|
|
982 | + }.bind(this)).reject(function(transform){ | ||
|
|
983 | + return ( | ||
|
|
984 | + (transform.originalValue == transform.targetValue) || | ||
|
|
985 | + ( | ||
|
|
986 | + transform.unit != 'color' && | ||
|
|
987 | + (isNaN(transform.originalValue) || isNaN(transform.targetValue)) | ||
|
|
988 | + ) | ||
|
|
989 | + ); | ||
|
|
990 | + }); | ||
|
|
991 | + }, | ||
|
|
992 | + update: function(position) { | ||
|
|
993 | + var style = { }, transform, i = this.transforms.length; | ||
|
|
994 | + while(i--) | ||
|
|
995 | + style[(transform = this.transforms[i]).style] = | ||
|
|
996 | + transform.unit=='color' ? '#'+ | ||
|
|
997 | + (Math.round(transform.originalValue[0]+ | ||
|
|
998 | + (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() + | ||
|
|
999 | + (Math.round(transform.originalValue[1]+ | ||
|
|
1000 | + (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() + | ||
|
|
1001 | + (Math.round(transform.originalValue[2]+ | ||
|
|
1002 | + (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() : | ||
|
|
1003 | + (transform.originalValue + | ||
|
|
1004 | + (transform.targetValue - transform.originalValue) * position).toFixed(3) + | ||
|
|
1005 | + (transform.unit === null ? '' : transform.unit); | ||
|
|
1006 | + this.element.setStyle(style, true); | ||
|
|
1007 | + } | ||
|
|
1008 | + }); | ||
|
|
1009 | + | ||
|
|
1010 | + Effect.Transform = Class.create({ | ||
|
|
1011 | + initialize: function(tracks){ | ||
|
|
1012 | + this.tracks = []; | ||
|
|
1013 | + this.options = arguments[1] || { }; | ||
|
|
1014 | + this.addTracks(tracks); | ||
|
|
1015 | + }, | ||
|
|
1016 | + addTracks: function(tracks){ | ||
|
|
1017 | + tracks.each(function(track){ | ||
|
|
1018 | + track = $H(track); | ||
|
|
1019 | + var data = track.values().first(); | ||
|
|
1020 | + this.tracks.push($H({ | ||
|
|
1021 | + ids: track.keys().first(), | ||
|
|
1022 | + effect: Effect.Morph, | ||
|
|
1023 | + options: { style: data } | ||
|
|
1024 | + })); | ||
|
|
1025 | + }.bind(this)); | ||
|
|
1026 | + return this; | ||
|
|
1027 | + }, | ||
|
|
1028 | + play: function(){ | ||
|
|
1029 | + return new Effect.Parallel( | ||
|
|
1030 | + this.tracks.map(function(track){ | ||
|
|
1031 | + var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options'); | ||
|
|
1032 | + var elements = [$(ids) || $$(ids)].flatten(); | ||
|
|
1033 | + return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) }); | ||
|
|
1034 | + }).flatten(), | ||
|
|
1035 | + this.options | ||
|
|
1036 | + ); | ||
|
|
1037 | + } | ||
|
|
1038 | + }); | ||
|
|
1039 | + | ||
|
|
1040 | + Element.CSS_PROPERTIES = $w( | ||
|
|
1041 | + 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + | ||
|
|
1042 | + 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + | ||
|
|
1043 | + 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + | ||
|
|
1044 | + 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + | ||
|
|
1045 | + 'fontSize fontWeight height left letterSpacing lineHeight ' + | ||
|
|
1046 | + 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ | ||
|
|
1047 | + 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + | ||
|
|
1048 | + 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + | ||
|
|
1049 | + 'right textIndent top width wordSpacing zIndex'); | ||
|
|
1050 | + | ||
|
|
1051 | + Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; | ||
|
|
1052 | + | ||
|
|
1053 | + String.__parseStyleElement = document.createElement('div'); | ||
|
|
1054 | + String.prototype.parseStyle = function(){ | ||
|
|
1055 | + var style, styleRules = $H(); | ||
|
|
1056 | + if (Prototype.Browser.WebKit) | ||
|
|
1057 | + style = new Element('div',{style:this}).style; | ||
|
|
1058 | + else { | ||
|
|
1059 | + String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>'; | ||
|
|
1060 | + style = String.__parseStyleElement.childNodes[0].style; | ||
|
|
1061 | + } | ||
|
|
1062 | + | ||
|
|
1063 | + Element.CSS_PROPERTIES.each(function(property){ | ||
|
|
1064 | + if (style[property]) styleRules.set(property, style[property]); | ||
|
|
1065 | + }); | ||
|
|
1066 | + | ||
|
|
1067 | + if (Prototype.Browser.IE && this.include('opacity')) | ||
|
|
1068 | + styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]); | ||
|
|
1069 | + | ||
|
|
1070 | + return styleRules; | ||
|
|
1071 | + }; | ||
|
|
1072 | + | ||
|
|
1073 | + if (document.defaultView && document.defaultView.getComputedStyle) { | ||
|
|
1074 | + Element.getStyles = function(element) { | ||
|
|
1075 | + var css = document.defaultView.getComputedStyle($(element), null); | ||
|
|
1076 | + return Element.CSS_PROPERTIES.inject({ }, function(styles, property) { | ||
|
|
1077 | + styles[property] = css[property]; | ||
|
|
1078 | + return styles; | ||
|
|
1079 | + }); | ||
|
|
1080 | + }; | ||
|
|
1081 | + } else { | ||
|
|
1082 | + Element.getStyles = function(element) { | ||
|
|
1083 | + element = $(element); | ||
|
|
1084 | + var css = element.currentStyle, styles; | ||
|
|
1085 | + styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) { | ||
|
|
1086 | + results[property] = css[property]; | ||
|
|
1087 | + return results; | ||
|
|
1088 | + }); | ||
|
|
1089 | + if (!styles.opacity) styles.opacity = element.getOpacity(); | ||
|
|
1090 | + return styles; | ||
|
|
1091 | + }; | ||
|
|
1092 | + } | ||
|
|
1093 | + | ||
|
|
1094 | + Effect.Methods = { | ||
|
|
1095 | + morph: function(element, style) { | ||
|
|
1096 | + element = $(element); | ||
|
|
1097 | + new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { })); | ||
|
|
1098 | + return element; | ||
|
|
1099 | + }, | ||
|
|
1100 | + visualEffect: function(element, effect, options) { | ||
|
|
1101 | + element = $(element); | ||
|
|
1102 | + var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1); | ||
|
|
1103 | + new Effect[klass](element, options); | ||
|
|
1104 | + return element; | ||
|
|
1105 | + }, | ||
|
|
1106 | + highlight: function(element, options) { | ||
|
|
1107 | + element = $(element); | ||
|
|
1108 | + new Effect.Highlight(element, options); | ||
|
|
1109 | + return element; | ||
|
|
1110 | + } | ||
|
|
1111 | + }; | ||
|
|
1112 | + | ||
|
|
1113 | + $w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ | ||
|
|
1114 | + 'pulsate shake puff squish switchOff dropOut').each( | ||
|
|
1115 | + function(effect) { | ||
|
|
1116 | + Effect.Methods[effect] = function(element, options){ | ||
|
|
1117 | + element = $(element); | ||
|
|
1118 | + Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options); | ||
|
|
1119 | + return element; | ||
|
|
1120 | + }; | ||
|
|
1121 | + } | ||
|
|
1122 | + ); | ||
|
|
1123 | + | ||
|
|
1124 | + $w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( | ||
|
|
1125 | + function(f) { Effect.Methods[f] = Element[f]; } | ||
|
|
1126 | + ); | ||
|
|
1127 | + | ||
|
|
1128 | + Element.addMethods(Effect.Methods); No newline at end of file |
@@ -0,0 +1,32 | |||||
|
|
1 | + function updateSiteList() { | ||
|
|
2 | + currentCountry = document.getElementById("site_country_id").value; | ||
|
|
3 | + | ||
|
|
4 | + sites = siteList[currentCountry]; | ||
|
|
5 | + siteSelect = document.getElementById("login_site_id"); | ||
|
|
6 | + old_len = siteSelect.length; | ||
|
|
7 | + // clear old box | ||
|
|
8 | + for(i=0; i<old_len; i++) siteSelect.remove(0); | ||
|
|
9 | + | ||
|
|
10 | + if(currentCountry==0) { | ||
|
|
11 | + for(i=0; i<allSiteList.length; i++) { | ||
|
|
12 | + if(allSiteList[i]!=null) { | ||
|
|
13 | + try { | ||
|
|
14 | + siteSelect.add(new Option(allSiteList[i],""+i,false,false),null); | ||
|
|
15 | + } catch(ex) { | ||
|
|
16 | + siteSelect.add(new Option(allSiteList[i],""+i,false,false)); | ||
|
|
17 | + } | ||
|
|
18 | + } | ||
|
|
19 | + } | ||
|
|
20 | + } else { | ||
|
|
21 | + for(i=0; i<sites.length; i++) { | ||
|
|
22 | + if(sites[i]!=null) { | ||
|
|
23 | + try { | ||
|
|
24 | + siteSelect.add(new Option(sites[i],""+i,false,false),null); | ||
|
|
25 | + } catch(ex) { | ||
|
|
26 | + siteSelect.add(new Option(sites[i],""+i,false,false)); | ||
|
|
27 | + } | ||
|
|
28 | + } | ||
|
|
29 | + } | ||
|
|
30 | + } | ||
|
|
31 | + } | ||
|
|
32 | + No newline at end of file |
@@ -0,0 +1,17 | |||||
|
|
1 | + | ||
|
|
2 | + table.graders tr.active { | ||
|
|
3 | + border: 1px solid black; | ||
|
|
4 | + background: lightgreen; | ||
|
|
5 | + text-align: center; | ||
|
|
6 | + } | ||
|
|
7 | + | ||
|
|
8 | + table.graders tr.inactive { | ||
|
|
9 | + border: 1px solid black; | ||
|
|
10 | + background: #ffcccc; | ||
|
|
11 | + text-align: center; | ||
|
|
12 | + } | ||
|
|
13 | + | ||
|
|
14 | + .submitbox .item { | ||
|
|
15 | + padding-right: 5px; | ||
|
|
16 | + float: left; | ||
|
|
17 | + } |
@@ -0,0 +1,14 | |||||
|
|
1 | + | ||
|
|
2 | + tr.available { | ||
|
|
3 | + background: #c0ffc0; | ||
|
|
4 | + } | ||
|
|
5 | + | ||
|
|
6 | + tr.not-available { | ||
|
|
7 | + background: #ffc0c0; | ||
|
|
8 | + } | ||
|
|
9 | + | ||
|
|
10 | + .import-log { | ||
|
|
11 | + background: lightgray; | ||
|
|
12 | + border: solid black 1px; | ||
|
|
13 | + padding: 10px; | ||
|
|
14 | + } No newline at end of file |
@@ -35,13 +35,13 | |||||
|
35 |
|
35 | ||
|
36 | # To use debugger |
|
36 | # To use debugger |
|
37 | # gem 'debugger' |
|
37 | # gem 'debugger' |
|
38 |
|
38 | ||
|
39 | gem "haml" |
|
39 | gem "haml" |
|
40 | gem "tmail" |
|
40 | gem "tmail" |
|
41 | - gem "rdiscount", :require => "rdiscount" |
|
41 | + gem "rdiscount" |
|
42 | gem "test-unit" |
|
42 | gem "test-unit" |
|
43 | gem 'will_paginate', '~> 3.0.0' |
|
43 | gem 'will_paginate', '~> 3.0.0' |
|
44 | gem 'dynamic_form' |
|
44 | gem 'dynamic_form' |
|
45 |
|
45 | ||
|
46 | group :test, :development do |
|
46 | group :test, :development do |
|
47 | gem "rspec-rails", "~> 2.0" |
|
47 | gem "rspec-rails", "~> 2.0" |
@@ -9,7 +9,7 | |||||
|
9 | // |
|
9 | // |
|
10 | // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD |
|
10 | // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD |
|
11 | // GO AFTER THE REQUIRES BELOW. |
|
11 | // GO AFTER THE REQUIRES BELOW. |
|
12 | // |
|
12 | // |
|
13 | //= require prototype |
|
13 | //= require prototype |
|
14 | //= require prototype_ujs |
|
14 | //= require prototype_ujs |
|
15 | - //= require_tree . |
|
15 | + |
@@ -1,13 +1,255 | |||||
|
1 | /* |
|
1 | /* |
|
2 |
- |
|
2 | + * This is a manifest file that'll be compiled into application.css, which will include all the |
|
3 |
|
|
3 | * listed below. |
|
4 |
|
|
4 | * |
|
5 |
- |
|
5 | + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheet |
|
6 |
- |
|
6 | + * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path |
|
7 |
|
|
7 | * |
|
8 |
|
|
8 | * You're free to add application-wide styles to this file and they'll appear at the top of the |
|
9 |
|
|
9 | * compiled file, but it's generally better to create a new file per style scope. |
|
10 |
|
|
10 | * |
|
11 |
|
|
11 | *= require_self |
|
12 | - *= require_tree . |
|
||
|
13 |
|
|
12 | */ |
|
|
13 | + | ||
|
|
14 | + body { | ||
|
|
15 | + background: white url(../images/topbg.jpg) repeat-x top center; | ||
|
|
16 | + font-size: 13px; | ||
|
|
17 | + font-family: Tahoma, "sans-serif"; | ||
|
|
18 | + margin: 10px; | ||
|
|
19 | + padding: 10px; } | ||
|
|
20 | + | ||
|
|
21 | + input { | ||
|
|
22 | + font-family: Tahoma, "sans-serif"; } | ||
|
|
23 | + | ||
|
|
24 | + h1 { | ||
|
|
25 | + font-size: 24px; | ||
|
|
26 | + color: #334488; | ||
|
|
27 | + line-height: 2em; } | ||
|
|
28 | + | ||
|
|
29 | + h2 { | ||
|
|
30 | + font-size: 18px; | ||
|
|
31 | + color: #5566bb; | ||
|
|
32 | + line-height: 1.5em; } | ||
|
|
33 | + | ||
|
|
34 | + hr { | ||
|
|
35 | + border-top: 1px solid #dddddd; | ||
|
|
36 | + border-bottom: 1px solid #eeeeee; } | ||
|
|
37 | + | ||
|
|
38 | + a { | ||
|
|
39 | + color: #6666cc; | ||
|
|
40 | + text-decoration: none; } | ||
|
|
41 | + a:link, a:visited { | ||
|
|
42 | + color: #6666cc; | ||
|
|
43 | + text-decoration: none; } | ||
|
|
44 | + a:hover, a:focus { | ||
|
|
45 | + color: #111166; | ||
|
|
46 | + text-decoration: none; } | ||
|
|
47 | + | ||
|
|
48 | + div.userbar { | ||
|
|
49 | + line-height: 1.5em; | ||
|
|
50 | + text-align: right; | ||
|
|
51 | + font-size: 12px; } | ||
|
|
52 | + div.title { | ||
|
|
53 | + padding: 10px 0px; | ||
|
|
54 | + line-height: 1.5em; | ||
|
|
55 | + font-size: 13px; } | ||
|
|
56 | + div.title span.contest-over-msg { | ||
|
|
57 | + font-size: 15px; | ||
|
|
58 | + color: red; } | ||
|
|
59 | + div.title table { | ||
|
|
60 | + width: 100%; | ||
|
|
61 | + font-weight: bold; } | ||
|
|
62 | + div.title td.left-col { | ||
|
|
63 | + text-align: left; | ||
|
|
64 | + vertical-align: top; | ||
|
|
65 | + color: #444444; } | ||
|
|
66 | + div.title td.right-col { | ||
|
|
67 | + text-align: right; | ||
|
|
68 | + vertical-align: top; | ||
|
|
69 | + font-size: 18px; | ||
|
|
70 | + color: #116699; } | ||
|
|
71 | + | ||
|
|
72 | + table.info { | ||
|
|
73 | + margin: 10px 0; | ||
|
|
74 | + border: 1px solid #666666; | ||
|
|
75 | + border-collapse: collapse; | ||
|
|
76 | + font-size: 12px; } | ||
|
|
77 | + table.info th { | ||
|
|
78 | + border: 1px solid #666666; | ||
|
|
79 | + line-height: 1.5em; | ||
|
|
80 | + padding: 0 0.5em; } | ||
|
|
81 | + table.info td { | ||
|
|
82 | + border-left: 1px solid #666666; | ||
|
|
83 | + border-right: 1px solid #666666; | ||
|
|
84 | + line-height: 1.5em; | ||
|
|
85 | + padding: 0 0.5em; } | ||
|
|
86 | + | ||
|
|
87 | + tr.info-head { | ||
|
|
88 | + background: #777777; | ||
|
|
89 | + color: white; } | ||
|
|
90 | + tr.info-odd { | ||
|
|
91 | + background: #eeeeee; } | ||
|
|
92 | + tr.info-even { | ||
|
|
93 | + background: #fcfcfc; } | ||
|
|
94 | + | ||
|
|
95 | + .infobox { | ||
|
|
96 | + background: #eeeeff; | ||
|
|
97 | + border: 1px dotted #99aaee; | ||
|
|
98 | + padding: 5px; | ||
|
|
99 | + margin: 10px 0px; | ||
|
|
100 | + color: black; | ||
|
|
101 | + font-size: 13px; } | ||
|
|
102 | + | ||
|
|
103 | + .submitbox { | ||
|
|
104 | + background: #eeeeff; | ||
|
|
105 | + border: 1px dotted #99aaee; | ||
|
|
106 | + padding: 5px; | ||
|
|
107 | + margin: 10px 0px; | ||
|
|
108 | + color: black; | ||
|
|
109 | + font-size: 13px; } | ||
|
|
110 | + | ||
|
|
111 | + .errorExplanation { | ||
|
|
112 | + border: 1px dotted gray; | ||
|
|
113 | + color: #bb2222; | ||
|
|
114 | + padding: 5px 15px 5px 15px; | ||
|
|
115 | + margin-bottom: 5px; | ||
|
|
116 | + background-color: white; | ||
|
|
117 | + font-weight: normal; } | ||
|
|
118 | + .errorExplanation h2 { | ||
|
|
119 | + color: #cc1111; | ||
|
|
120 | + font-weight: bold; } | ||
|
|
121 | + | ||
|
|
122 | + table.uinfo { | ||
|
|
123 | + border-collapse: collapse; | ||
|
|
124 | + border: 1px solid black; | ||
|
|
125 | + font-size: 13px; } | ||
|
|
126 | + | ||
|
|
127 | + td.uinfo { | ||
|
|
128 | + vertical-align: top; | ||
|
|
129 | + border: 1px solid black; | ||
|
|
130 | + padding: 5px; } | ||
|
|
131 | + | ||
|
|
132 | + th.uinfo { | ||
|
|
133 | + background: lightgreen; | ||
|
|
134 | + vertical-align: top; | ||
|
|
135 | + text-align: right; | ||
|
|
136 | + border: 1px solid black; | ||
|
|
137 | + padding: 5px; } | ||
|
|
138 | + | ||
|
|
139 | + div.compilermsgbody { | ||
|
|
140 | + font-family: monospace; } | ||
|
|
141 | + div.task-menu { | ||
|
|
142 | + text-align: center; | ||
|
|
143 | + font-size: 13px; | ||
|
|
144 | + line-height: 1.75em; | ||
|
|
145 | + font-weight: bold; | ||
|
|
146 | + border-top: 1px dashed gray; | ||
|
|
147 | + border-bottom: 1px dashed gray; | ||
|
|
148 | + margin-top: 2px; | ||
|
|
149 | + margin-bottom: 4px; } | ||
|
|
150 | + | ||
|
|
151 | + table.taskdesc { | ||
|
|
152 | + border: 2px solid #dddddd; | ||
|
|
153 | + border-collapse: collapse; | ||
|
|
154 | + margin: 10px auto; | ||
|
|
155 | + width: 90%; | ||
|
|
156 | + font-size: 13px; } | ||
|
|
157 | + table.taskdesc p { | ||
|
|
158 | + font-size: 13px; } | ||
|
|
159 | + table.taskdesc tr.name { | ||
|
|
160 | + border: 2px solid #dddddd; | ||
|
|
161 | + background: #dddddd; | ||
|
|
162 | + color: #333333; | ||
|
|
163 | + font-weight: bold; | ||
|
|
164 | + font-size: 14px; | ||
|
|
165 | + line-height: 1.5em; | ||
|
|
166 | + text-align: center; } | ||
|
|
167 | + table.taskdesc td.desc-odd { | ||
|
|
168 | + padding: 5px; | ||
|
|
169 | + padding-left: 20px; | ||
|
|
170 | + background: #fefeee; } | ||
|
|
171 | + table.taskdesc td.desc-even { | ||
|
|
172 | + padding: 5px; | ||
|
|
173 | + padding-left: 20px; | ||
|
|
174 | + background: #feeefe; } | ||
|
|
175 | + | ||
|
|
176 | + .announcementbox { | ||
|
|
177 | + margin: 10px 0px; | ||
|
|
178 | + background: #bbddee; | ||
|
|
179 | + padding: 1px; } | ||
|
|
180 | + .announcementbox span.title { | ||
|
|
181 | + font-weight: bold; | ||
|
|
182 | + color: #224455; | ||
|
|
183 | + padding-left: 10px; | ||
|
|
184 | + line-height: 1.6em; } | ||
|
|
185 | + | ||
|
|
186 | + .announcement { | ||
|
|
187 | + margin: 2px; | ||
|
|
188 | + background: white; | ||
|
|
189 | + padding: 1px; | ||
|
|
190 | + padding-left: 10px; | ||
|
|
191 | + padding-right: 10px; | ||
|
|
192 | + padding-top: 5px; | ||
|
|
193 | + padding-bottom: 5px; } | ||
|
|
194 | + | ||
|
|
195 | + .announcement p { | ||
|
|
196 | + font-size: 12px; | ||
|
|
197 | + margin: 2px; } | ||
|
|
198 | + | ||
|
|
199 | + .pub-info { | ||
|
|
200 | + text-align: right; | ||
|
|
201 | + font-style: italic; | ||
|
|
202 | + font-size: 9px; } | ||
|
|
203 | + .pub-info p { | ||
|
|
204 | + text-align: right; | ||
|
|
205 | + font-style: italic; | ||
|
|
206 | + font-size: 9px; } | ||
|
|
207 | + | ||
|
|
208 | + .announcement .toggles { | ||
|
|
209 | + font-weight: normal; | ||
|
|
210 | + float: right; | ||
|
|
211 | + font-size: 80%; } | ||
|
|
212 | + .announcement .announcement-title { | ||
|
|
213 | + font-weight: bold; } | ||
|
|
214 | + | ||
|
|
215 | + div.message { | ||
|
|
216 | + margin: 10px 0 0; } | ||
|
|
217 | + div.message div.message { | ||
|
|
218 | + margin: 0 0 0 30px; } | ||
|
|
219 | + div.message div.body { | ||
|
|
220 | + border: 2px solid #dddddd; | ||
|
|
221 | + background: #fff8f8; | ||
|
|
222 | + padding-left: 5px; } | ||
|
|
223 | + div.message div.reply-body { | ||
|
|
224 | + border: 2px solid #bbbbbb; | ||
|
|
225 | + background: #fffff8; | ||
|
|
226 | + padding-left: 5px; } | ||
|
|
227 | + div.message div.stat { | ||
|
|
228 | + font-size: 10px; | ||
|
|
229 | + line-height: 1.75em; | ||
|
|
230 | + padding: 0 5px; | ||
|
|
231 | + color: #333333; | ||
|
|
232 | + background: #dddddd; | ||
|
|
233 | + font-weight: bold; } | ||
|
|
234 | + div.message div.message div.stat { | ||
|
|
235 | + font-size: 10px; | ||
|
|
236 | + line-height: 1.75em; | ||
|
|
237 | + padding: 0 5px; | ||
|
|
238 | + color: #444444; | ||
|
|
239 | + background: #bbbbbb; | ||
|
|
240 | + font-weight: bold; } | ||
|
|
241 | + div.contest-title { | ||
|
|
242 | + color: white; | ||
|
|
243 | + text-align: center; | ||
|
|
244 | + line-height: 2em; } | ||
|
|
245 | + div.registration-desc, div.test-desc { | ||
|
|
246 | + border: 1px dotted gray; | ||
|
|
247 | + background: #f5f5f5; | ||
|
|
248 | + padding: 5px; | ||
|
|
249 | + margin: 10px 0; | ||
|
|
250 | + font-size: 12px; | ||
|
|
251 | + line-height: 1.5em; } | ||
|
|
252 | + | ||
|
|
253 | + h2.contest-title { | ||
|
|
254 | + margin-top: 5px; | ||
|
|
255 | + margin-bottom: 5px; } |
@@ -122,7 +122,12 | |||||
|
122 | </table> |
|
122 | </table> |
|
123 | </div> |
|
123 | </div> |
|
124 | TITLEBAR |
|
124 | TITLEBAR |
|
125 | result.html_safe |
|
125 | result.html_safe |
|
126 | end |
|
126 | end |
|
127 |
|
127 | ||
|
|
128 | + def markdown(text) | ||
|
|
129 | + markdown = RDiscount.new(text) | ||
|
|
130 | + markdown.to_html.html_safe | ||
|
128 | end |
|
131 | end |
|
|
132 | + | ||
|
|
133 | + end |
@@ -1,10 +1,6 | |||||
|
1 | - <% content_for :head do %> |
|
||
|
2 | - <%= javascript_include_tag :defaults %> |
|
||
|
3 | - <% end %> |
|
||
|
4 | - |
|
||
|
5 | <h1>Listing announcements</h1> |
|
1 | <h1>Listing announcements</h1> |
|
6 |
|
2 | ||
|
7 | <%= link_to 'New announcement', new_announcement_path %> |
|
3 | <%= link_to 'New announcement', new_announcement_path %> |
|
8 |
|
4 | ||
|
9 | <table class="info"> |
|
5 | <table class="info"> |
|
10 | <tr class="info-head"> |
|
6 | <tr class="info-head"> |
@@ -1,9 +1,6 | |||||
|
1 | - - content_for :head do |
|
||
|
2 | - = javascript_include_tag :defaults |
|
||
|
3 | - |
|
||
|
4 |
|
|
1 | %h1 System configuration |
|
5 |
|
2 | ||
|
6 | %table.info |
|
3 | %table.info |
|
7 | %tr.info-head |
|
4 | %tr.info-head |
|
8 | %th Key |
|
5 | %th Key |
|
9 | %th Type |
|
6 | %th Type |
@@ -4,28 +4,28 | |||||
|
4 |
|
4 | ||
|
5 | - if @num_contests>1 |
|
5 | - if @num_contests>1 |
|
6 | %b Multiple contests: |
|
6 | %b Multiple contests: |
|
7 | = "There are #{@num_contests} contests running." |
|
7 | = "There are #{@num_contests} contests running." |
|
8 | - else |
|
8 | - else |
|
9 | %b Single contest: |
|
9 | %b Single contest: |
|
10 | - = "[#{link_to 'Add/remove contests', :controller => 'contests', :action => 'index'}]" |
|
10 | + =raw "[#{link_to 'Add/remove contests', :controller => 'contests', :action => 'index'}]" |
|
11 |
|
11 | ||
|
12 | .infobox |
|
12 | .infobox |
|
13 | %b Web interface mode: |
|
13 | %b Web interface mode: |
|
14 | - if (not GraderConfiguration.contest_mode?) and (not GraderConfiguration.indv_contest_mode?) |
|
14 | - if (not GraderConfiguration.contest_mode?) and (not GraderConfiguration.indv_contest_mode?) |
|
15 | standard mode |
|
15 | standard mode |
|
16 | - elsif GraderConfiguration.contest_mode? |
|
16 | - elsif GraderConfiguration.contest_mode? |
|
17 | normal contest mode. |
|
17 | normal contest mode. |
|
18 | - else |
|
18 | - else |
|
19 | individual contest mode. |
|
19 | individual contest mode. |
|
20 |
|
20 | ||
|
21 | %br/ |
|
21 | %br/ |
|
22 | Change mode to: |
|
22 | Change mode to: |
|
23 | - = "[#{link_to 'standard', :action => 'change_contest_mode', :id => 'standard'}]" |
|
23 | + =raw "[#{link_to 'standard', :action => 'change_contest_mode', :id => 'standard'}]" |
|
24 | - = "[#{link_to 'contest', :action => 'change_contest_mode', :id => 'contest'}]" |
|
24 | + =raw "[#{link_to 'contest', :action => 'change_contest_mode', :id => 'contest'}]" |
|
25 | - = "[#{link_to 'individual contest', :action => 'change_contest_mode', :id => 'indv-contest'}]" |
|
25 | + =raw "[#{link_to 'individual contest', :action => 'change_contest_mode', :id => 'indv-contest'}]" |
|
26 |
|
26 | ||
|
27 | - if GraderConfiguration.indv_contest_mode? |
|
27 | - if GraderConfiguration.indv_contest_mode? |
|
28 | = render :partial => 'indv_contest_mode_index' |
|
28 | = render :partial => 'indv_contest_mode_index' |
|
29 |
|
29 | ||
|
30 | %br/ |
|
30 | %br/ |
|
31 |
|
31 |
@@ -1,10 +1,6 | |||||
|
1 | - <% content_for :head do %> |
|
||
|
2 | - <%= javascript_include_tag :defaults %> |
|
||
|
3 | - <% end %> |
|
||
|
4 | - |
|
||
|
5 | <h1>Listing contests</h1> |
|
1 | <h1>Listing contests</h1> |
|
6 |
|
2 | ||
|
7 | <div class="infobox"> |
|
3 | <div class="infobox"> |
|
8 | <b>Go back to:</b> [<%= link_to 'contest management', :controller => 'contest_management', :action => 'index' %>] |
|
4 | <b>Go back to:</b> [<%= link_to 'contest management', :controller => 'contest_management', :action => 'index' %>] |
|
9 | </div> |
|
5 | </div> |
|
10 |
|
6 |
@@ -8,22 +8,22 | |||||
|
8 | %br/ |
|
8 | %br/ |
|
9 |
|
9 | ||
|
10 | .submitbox |
|
10 | .submitbox |
|
11 | .item |
|
11 | .item |
|
12 | Grader control: |
|
12 | Grader control: |
|
13 | .item |
|
13 | .item |
|
14 |
- = form_for :clear |
|
14 | + = form_for :clear, :url => {:action => 'start_grading'} do |f| |
|
15 | = submit_tag 'Start graders in grading env' |
|
15 | = submit_tag 'Start graders in grading env' |
|
16 | .item |
|
16 | .item |
|
17 |
- = form_for :clear |
|
17 | + = form_for :clear, :url => {:action => 'start_exam'} do |f| |
|
18 | = submit_tag 'Start graders in exam env' |
|
18 | = submit_tag 'Start graders in exam env' |
|
19 | .item |
|
19 | .item |
|
20 |
- = form_for :clear |
|
20 | + = form_for :clear, :url => {:action => 'stop_all'} do |f| |
|
21 | = submit_tag 'Stop all running graders' |
|
21 | = submit_tag 'Stop all running graders' |
|
22 | .item |
|
22 | .item |
|
23 |
- = form_for :clear |
|
23 | + = form_for :clear, :url => {:action => 'clear_all'} do |f| |
|
24 | = submit_tag 'Clear all data' |
|
24 | = submit_tag 'Clear all data' |
|
25 | %br{:style => 'clear:both'}/ |
|
25 | %br{:style => 'clear:both'}/ |
|
26 |
|
26 | ||
|
27 | - if @last_task |
|
27 | - if @last_task |
|
28 | Last task: |
|
28 | Last task: |
|
29 | = link_to "#{@last_task.id}", :action => 'view', :id => @last_task.id, :type => 'Task' |
|
29 | = link_to "#{@last_task.id}", :action => 'view', :id => @last_task.id, :type => 'Task' |
@@ -42,10 +42,10 | |||||
|
42 | %h2 Stalled graders |
|
42 | %h2 Stalled graders |
|
43 |
|
43 | ||
|
44 | = render :partial => 'grader_list', :locals => {:grader_list => @stalled_processes} |
|
44 | = render :partial => 'grader_list', :locals => {:grader_list => @stalled_processes} |
|
45 |
|
45 | ||
|
46 | %h2 Terminated graders |
|
46 | %h2 Terminated graders |
|
47 |
|
47 | ||
|
48 |
- = form_for :clear |
|
48 | + = form_for :clear, :url => {:action => 'clear_terminated'} do |f| |
|
49 | = submit_tag 'Clear data for terminated graders' |
|
49 | = submit_tag 'Clear data for terminated graders' |
|
50 |
|
50 | ||
|
51 | = render :partial => 'grader_list', :locals => {:grader_list => @terminated_processes} |
|
51 | = render :partial => 'grader_list', :locals => {:grader_list => @terminated_processes} |
@@ -1,9 +1,9 | |||||
|
1 | - content_for :head do |
|
1 | - content_for :head do |
|
2 |
- = javascript_include_tag |
|
2 | + = javascript_include_tag "effects" |
|
3 |
- = javascript_include_tag |
|
3 | + = javascript_include_tag "announcement_refresh" |
|
4 |
|
4 | ||
|
5 | = user_title_bar(@user) |
|
5 | = user_title_bar(@user) |
|
6 |
|
6 | ||
|
7 | .announcementbox{:style => (@announcements.length==0 ? "display:none" : "")} |
|
7 | .announcementbox{:style => (@announcements.length==0 ? "display:none" : "")} |
|
8 | %span{:class => 'title'} |
|
8 | %span{:class => 'title'} |
|
9 | Announcements |
|
9 | Announcements |
@@ -11,13 +11,13 | |||||
|
11 | (1) **YES**, |
|
11 | (1) **YES**, |
|
12 | (2) <b>NO</b>, |
|
12 | (2) <b>NO</b>, |
|
13 | (3) **ANSWERED IN TASK DESCRIPTION (EXPLICITLY OR IMPLICITLY)**, |
|
13 | (3) **ANSWERED IN TASK DESCRIPTION (EXPLICITLY OR IMPLICITLY)**, |
|
14 | (4) **INVALID QUESTION**, and |
|
14 | (4) **INVALID QUESTION**, and |
|
15 | (5) **NO COMMENT**. |
|
15 | (5) **NO COMMENT**. |
|
16 |
|
16 | ||
|
17 |
- = form_for 'message' |
|
17 | + = form_for 'message', :url => { :action => 'create'} do |f| |
|
18 | %p |
|
18 | %p |
|
19 | %b New clarification request |
|
19 | %b New clarification request |
|
20 | = submit_tag "Post" |
|
20 | = submit_tag "Post" |
|
21 | %br/ |
|
21 | %br/ |
|
22 | = f.text_area :body, :rows => 5, :cols => 100 |
|
22 | = f.text_area :body, :rows => 5, :cols => 100 |
|
23 |
|
23 |
@@ -1,9 +1,8 | |||||
|
1 | - content_for :head do |
|
1 | - content_for :head do |
|
2 | = stylesheet_link_tag 'problems' |
|
2 | = stylesheet_link_tag 'problems' |
|
3 | - = javascript_include_tag :defaults |
|
||
|
4 |
|
3 | ||
|
5 | %h1 Import problems: successful |
|
4 | %h1 Import problems: successful |
|
6 |
|
5 | ||
|
7 | %p |
|
6 | %p |
|
8 | %b Problem: |
|
7 | %b Problem: |
|
9 | = "#{@problem.full_name} (#{@problem.name})" |
|
8 | = "#{@problem.full_name} (#{@problem.name})" |
@@ -1,9 +1,8 | |||||
|
1 | - content_for :head do |
|
1 | - content_for :head do |
|
2 | = stylesheet_link_tag 'problems' |
|
2 | = stylesheet_link_tag 'problems' |
|
3 | - = javascript_include_tag :defaults |
|
||
|
4 |
|
3 | ||
|
5 | %h1 Import problems |
|
4 | %h1 Import problems |
|
6 |
|
5 | ||
|
7 | %p= link_to '[Back to problem list]', :action => 'list' |
|
6 | %p= link_to '[Back to problem list]', :action => 'list' |
|
8 |
|
7 | ||
|
9 | - if @problem and @problem.errors |
|
8 | - if @problem and @problem.errors |
@@ -1,9 +1,8 | |||||
|
1 | <% content_for :head do %> |
|
1 | <% content_for :head do %> |
|
2 | <%= stylesheet_link_tag 'problems' %> |
|
2 | <%= stylesheet_link_tag 'problems' %> |
|
3 | - <%= javascript_include_tag :defaults %> |
|
||
|
4 | <% end %> |
|
3 | <% end %> |
|
5 |
|
4 | ||
|
6 | <h1>Listing problems</h1> |
|
5 | <h1>Listing problems</h1> |
|
7 |
|
6 | ||
|
8 | <p> |
|
7 | <p> |
|
9 | <%= link_to '[New problem]', :action => 'new' %> |
|
8 | <%= link_to '[New problem]', :action => 'new' %> |
@@ -50,13 +49,13 | |||||
|
50 | <% if GraderConfiguration.multicontests? %> |
|
49 | <% if GraderConfiguration.multicontests? %> |
|
51 | <td> |
|
50 | <td> |
|
52 | <%= problem.contests.collect { |c| c.name }.join(', ') %> |
|
51 | <%= problem.contests.collect { |c| c.name }.join(', ') %> |
|
53 | </td> |
|
52 | </td> |
|
54 | <% end %> |
|
53 | <% end %> |
|
55 |
|
54 | ||
|
56 |
- <td><%= link_to |
|
55 | + <td><%= link_to '[Toggle]', {:action => 'toggle', :id => problem.id }, :remote => true %></td> |
|
57 | <td><%= link_to '[Stat]', :action => 'stat', :id => problem.id %></td> |
|
56 | <td><%= link_to '[Stat]', :action => 'stat', :id => problem.id %></td> |
|
58 | <td><%= link_to '[Show]', :action => 'show', :id => problem %></td> |
|
57 | <td><%= link_to '[Show]', :action => 'show', :id => problem %></td> |
|
59 | <td><%= link_to '[Edit]', :action => 'edit', :id => problem %></td> |
|
58 | <td><%= link_to '[Edit]', :action => 'edit', :id => problem %></td> |
|
60 | <td><%= link_to '[Destroy]', { :action => 'destroy', :id => problem }, :confirm => 'Are you sure?', :method => :post %></td> |
|
59 | <td><%= link_to '[Destroy]', { :action => 'destroy', :id => problem }, :confirm => 'Are you sure?', :method => :post %></td> |
|
61 | </tr> |
|
60 | </tr> |
|
62 | <% end %> |
|
61 | <% end %> |
@@ -1,9 +1,8 | |||||
|
1 | - content_for :head do |
|
1 | - content_for :head do |
|
2 | = stylesheet_link_tag 'problems' |
|
2 | = stylesheet_link_tag 'problems' |
|
3 | - = javascript_include_tag :defaults |
|
||
|
4 |
|
3 | ||
|
5 | %h1 Manage problems |
|
4 | %h1 Manage problems |
|
6 |
|
5 | ||
|
7 | %p= link_to '[Back to problem list]', :action => 'list' |
|
6 | %p= link_to '[Back to problem list]', :action => 'list' |
|
8 |
|
7 | ||
|
9 | = form_tag :action=>'do_manage' do |
|
8 | = form_tag :action=>'do_manage' do |
@@ -37,13 +37,13 | |||||
|
37 | } |
|
37 | } |
|
38 | </script> |
|
38 | </script> |
|
39 |
|
39 | ||
|
40 | <% if GraderConfiguration.show_submitbox_to?(@user) and GraderConfiguration.allow_test_request(@user) %> |
|
40 | <% if GraderConfiguration.show_submitbox_to?(@user) and GraderConfiguration.allow_test_request(@user) %> |
|
41 | <div class="submitbox"> |
|
41 | <div class="submitbox"> |
|
42 | <%= error_messages_for 'submitted_test_request' %> |
|
42 | <%= error_messages_for 'submitted_test_request' %> |
|
43 |
- <%= form_for :test_request, |
|
43 | + <%= form_for :test_request, |
|
44 | :url => { :action => 'submit'}, |
|
44 | :url => { :action => 'submit'}, |
|
45 | :html => { :multipart => true } do |f| %> |
|
45 | :html => { :multipart => true } do |f| %> |
|
46 | <table> |
|
46 | <table> |
|
47 | <tr> |
|
47 | <tr> |
|
48 | <td>Task:</td> |
|
48 | <td>Task:</td> |
|
49 | <td> |
|
49 | <td> |
@@ -1,9 +1,6 | |||||
|
1 | - - content_for :head do |
|
||
|
2 | - = javascript_include_tag :defaults |
|
||
|
3 | - |
|
||
|
4 |
|
|
1 | = user_title_bar(@user) |
|
5 |
|
2 | ||
|
6 | %h1 Your account settings |
|
3 | %h1 Your account settings |
|
7 |
|
4 | ||
|
8 | -#%p |
|
5 | -#%p |
|
9 | -#You can edit your alias and e-mails. Just click on the text and edit it. |
|
6 | -#You can edit your alias and e-mails. Just click on the text and edit it. |
@@ -51,12 +51,12 | |||||
|
51 | # This will create an empty whitelist of attributes available for mass-assignment for all models |
|
51 | # This will create an empty whitelist of attributes available for mass-assignment for all models |
|
52 | # in your app. As such, your models will need to explicitly whitelist or blacklist accessible |
|
52 | # in your app. As such, your models will need to explicitly whitelist or blacklist accessible |
|
53 | # parameters by using an attr_accessible or attr_protected declaration. |
|
53 | # parameters by using an attr_accessible or attr_protected declaration. |
|
54 | config.active_record.whitelist_attributes = false |
|
54 | config.active_record.whitelist_attributes = false |
|
55 |
|
55 | ||
|
56 | # Enable the asset pipeline |
|
56 | # Enable the asset pipeline |
|
57 |
- config.assets.enabled = |
|
57 | + config.assets.enabled = true |
|
58 |
|
58 | ||
|
59 | # Version of your assets, change this if you want to expire all your assets |
|
59 | # Version of your assets, change this if you want to expire all your assets |
|
60 | config.assets.version = '1.0' |
|
60 | config.assets.version = '1.0' |
|
61 | end |
|
61 | end |
|
62 | end |
|
62 | end |
deleted file |
deleted file |
deleted file | |||||
This diff has been collapsed as it changes many lines, (963 lines changed) Show them Hide them |
deleted file | |||||
This diff has been collapsed as it changes many lines, (973 lines changed) Show them Hide them |
deleted file | |||||
This diff has been collapsed as it changes many lines, (1128 lines changed) Show them Hide them |
deleted file |
deleted file |
You need to be logged in to leave comments.
Login now