sproutit-sproutcore 1.0.20090721145251 → 1.0.20090721145280

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/Rakefile +3 -3
  2. data/VERSION.yml +2 -2
  3. data/frameworks/sproutcore/Buildfile +0 -1
  4. data/gen/app/templates/apps/@target_name@/core.js +27 -0
  5. data/gen/app/templates/apps/@target_name@/english.lproj/loading.rhtml +9 -0
  6. data/gen/app/templates/apps/@target_name@/english.lproj/main_page.js +22 -0
  7. data/gen/app/templates/apps/@target_name@/english.lproj/strings.js +15 -0
  8. data/gen/app/templates/apps/@target_name@/main.js +30 -0
  9. data/gen/controller/templates/controllers/@filename@.js +18 -0
  10. data/gen/controller/templates/tests/controllers/@filename@.js +15 -0
  11. data/gen/framework/templates/frameworks/@target_name@/core.js +21 -0
  12. data/gen/framework/templates/frameworks/@target_name@/english.lproj/strings.js +15 -0
  13. data/gen/language/templates/@filename@/strings.js +14 -0
  14. data/gen/model/templates/fixtures/@filename@.js +35 -0
  15. data/gen/model/templates/models/@filename@.js +19 -0
  16. data/gen/model/templates/tests/models/@filename@.js +15 -0
  17. data/gen/project/templates/@filename@/Buildfile +7 -0
  18. data/gen/project/templates/@filename@/README +7 -0
  19. data/gen/test/templates/tests/@filename@.js +15 -0
  20. data/gen/theme/templates/themes/@target_name@/english.lproj/strings.js +15 -0
  21. data/gen/view/templates/tests/views/@filename@.js +15 -0
  22. data/gen/view/templates/views/@filename@.js +18 -0
  23. data/lib/sproutcore/models/generator.rb +2 -2
  24. metadata +21 -33
  25. data/frameworks/sproutcore/frameworks/deprecated/core.js +0 -59
  26. data/frameworks/sproutcore/frameworks/deprecated/lib/button_views.rb +0 -330
  27. data/frameworks/sproutcore/frameworks/deprecated/lib/collection_view.rb +0 -83
  28. data/frameworks/sproutcore/frameworks/deprecated/lib/core_views.rb +0 -326
  29. data/frameworks/sproutcore/frameworks/deprecated/lib/form_views.rb +0 -253
  30. data/frameworks/sproutcore/frameworks/deprecated/lib/index.rhtml +0 -75
  31. data/frameworks/sproutcore/frameworks/deprecated/lib/menu_views.rb +0 -93
  32. data/frameworks/sproutcore/frameworks/deprecated/server/rails_server.js +0 -80
  33. data/frameworks/sproutcore/frameworks/deprecated/server/rest_server.js +0 -178
  34. data/frameworks/sproutcore/frameworks/deprecated/server/server.js +0 -673
  35. data/frameworks/sproutcore/frameworks/deprecated/system/animator.js +0 -679
  36. data/frameworks/sproutcore/frameworks/deprecated/system/binding.js +0 -36
  37. data/frameworks/sproutcore/frameworks/deprecated/system/browser.js +0 -75
  38. data/frameworks/sproutcore/frameworks/deprecated/system/classic_responder.js +0 -312
  39. data/frameworks/sproutcore/frameworks/deprecated/system/event.js +0 -58
  40. data/frameworks/sproutcore/frameworks/deprecated/system/globals.js +0 -20
  41. data/frameworks/sproutcore/frameworks/deprecated/system/misc.js +0 -58
  42. data/frameworks/sproutcore/frameworks/deprecated/system/node_descriptor.js +0 -72
  43. data/frameworks/sproutcore/frameworks/deprecated/system/object.js +0 -122
  44. data/frameworks/sproutcore/frameworks/deprecated/system/path_module.js +0 -432
  45. data/frameworks/sproutcore/frameworks/deprecated/system/string.js +0 -107
  46. data/frameworks/sproutcore/frameworks/deprecated/tests/application/application.rhtml +0 -125
  47. data/frameworks/sproutcore/frameworks/deprecated/tests/views/classic_view/clippingFrame.rhtml +0 -401
  48. data/frameworks/sproutcore/frameworks/deprecated/tests/views/classic_view/frame.rhtml +0 -357
  49. data/frameworks/sproutcore/frameworks/deprecated/tests/views/classic_view/isVisibleInWindow.rhtml +0 -147
  50. data/frameworks/sproutcore/frameworks/deprecated/tests/views/collection/base.rhtml +0 -298
  51. data/frameworks/sproutcore/frameworks/deprecated/tests/views/collection/incremental_rendering.rhtml +0 -260
  52. data/frameworks/sproutcore/frameworks/deprecated/tests/views/collection/source_list_rendering.rhtml +0 -143
  53. data/frameworks/sproutcore/frameworks/deprecated/tests/views/popup_button.rhtml +0 -128
  54. data/frameworks/sproutcore/frameworks/deprecated/tests/views/text_field.rhtml +0 -37
  55. data/frameworks/sproutcore/frameworks/deprecated/views/collection.js +0 -24
@@ -1,679 +0,0 @@
1
- /*
2
- Animator.js 1.1.9
3
-
4
- This library is released under the BSD license:
5
-
6
- Copyright (c) 2006, Bernard Sumption. All rights reserved.
7
-
8
- Redistribution and use in source and binary forms, with or without
9
- modification, are permitted provided that the following conditions are met:
10
-
11
- Redistributions of source code must retain the above copyright notice, this
12
- list of conditions and the following disclaimer. Redistributions in binary
13
- form must reproduce the above copyright notice, this list of conditions and
14
- the following disclaimer in the documentation and/or other materials
15
- provided with the distribution. Neither the name BernieCode nor
16
- the names of its contributors may be used to endorse or promote products
17
- derived from this software without specific prior written permission.
18
-
19
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
23
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
29
- DAMAGE.
30
-
31
- */
32
-
33
-
34
- // Applies a sequence of numbers between 0 and 1 to a number of subjects
35
- // construct - see setOptions for parameters
36
- function Animator(options) {
37
- this.setOptions(options);
38
- var _this = this;
39
- this.timerDelegate = function(){_this.onTimerEvent();};
40
- this.subjects = [];
41
- this.target = 0;
42
- this.state = 0;
43
- this.lastTime = null;
44
- };
45
- Animator.prototype = {
46
- // apply defaults
47
- setOptions: function(options) {
48
- this.options = Animator.applyDefaults({
49
- interval: 20, // time between animation frames
50
- duration: 400, // length of animation
51
- onComplete: function(){},
52
- onStep: function(){},
53
- transition: Animator.tx.easeInOut
54
- }, options);
55
- },
56
- // animate from the current state to provided value
57
- seekTo: function(to) {
58
- this.seekFromTo(this.state, to);
59
- },
60
- // animate from the current state to provided value
61
- seekFromTo: function(from, to) {
62
- this.target = Math.max(0, Math.min(1, to));
63
- this.state = Math.max(0, Math.min(1, from));
64
- this.lastTime = new Date().getTime();
65
- if (!this.intervalId) {
66
- // this.intervalId = this.setInterval(this.timerDelegate, this.options.interval);
67
-
68
- this.intervalId = SC.Timer.schedule({
69
- target: this,
70
- action: this.timerDelegate,
71
- interval: this.options.interval,
72
- repeats: YES
73
- }) ;
74
-
75
- }
76
- },
77
- // animate from the current state to provided value
78
- jumpTo: function(to) {
79
- this.target = this.state = Math.max(0, Math.min(1, to));
80
- this.propagate();
81
- },
82
- // seek to the opposite of the current target
83
- toggle: function() {
84
- this.seekTo(1 - this.target);
85
- },
86
- // add a function or an object with a method setState(state) that will be called with a number
87
- // between 0 and 1 on each frame of the animation
88
- addSubject: function(subject) {
89
- this.subjects[this.subjects.length] = subject;
90
- return this;
91
- },
92
- // remove all subjects
93
- clearSubjects: function() {
94
- this.subjects = [];
95
- },
96
- // forward the current state to the animation subjects
97
- propagate: function() {
98
- var value = this.options.transition(this.state);
99
- for (var i=0; i<this.subjects.length; i++) {
100
- if (this.subjects[i].setState) {
101
- this.subjects[i].setState(value);
102
- } else {
103
- this.subjects[i](value);
104
- }
105
- }
106
- },
107
- // called once per frame to update the current state
108
- onTimerEvent: function() {
109
- var now = new Date().getTime();
110
- var timePassed = now - this.lastTime;
111
- this.lastTime = now;
112
- var movement = (timePassed / this.options.duration) * (this.state < this.target ? 1 : -1);
113
- if (Math.abs(movement) >= Math.abs(this.state - this.target)) {
114
- this.state = this.target;
115
- } else {
116
- this.state += movement;
117
- }
118
-
119
- try {
120
- this.propagate();
121
- } finally {
122
- this.options.onStep.call(this);
123
- if (this.target == this.state) {
124
- // window.clearInterval(this.intervalId);
125
- this.intervalId.invalidate();
126
- this.intervalId = null;
127
- this.options.onComplete.call(this);
128
- }
129
- }
130
- },
131
- // shortcuts
132
- play: function() {this.seekFromTo(0, 1);},
133
- reverse: function() {this.seekFromTo(1, 0);},
134
- // return a string describing this Animator, for debugging
135
- inspect: function() {
136
- var str = "#<Animator:\n";
137
- for (var i=0; i<this.subjects.length; i++) {
138
- str += this.subjects[i].inspect();
139
- }
140
- str += ">";
141
- return str;
142
- }
143
- };
144
- // merge the properties of two objects
145
- Animator.applyDefaults = function(defaults, prefs) {
146
- prefs = prefs || {};
147
- var prop, result = {};
148
- for (prop in defaults) result[prop] = prefs[prop] !== undefined ? prefs[prop] : defaults[prop];
149
- return result;
150
- };
151
- // make an array from any object
152
- Animator.makeArray = function(o) {
153
- if (o == null) return [];
154
- if (!o.length) return [o];
155
- var result = [];
156
- for (var i=0; i<o.length; i++) result[i] = o[i];
157
- return result;
158
- };
159
- // convert a dash-delimited-property to a camelCaseProperty (c/o Prototype, thanks Sam!)
160
- Animator.camelize = function(string) {
161
- var oStringList = string.split('-');
162
- if (oStringList.length == 1) return oStringList[0];
163
-
164
- var camelizedString = string.indexOf('-') == 0
165
- ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
166
- : oStringList[0];
167
-
168
- for (var i = 1, len = oStringList.length; i < len; i++) {
169
- var s = oStringList[i];
170
- camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
171
- }
172
- return camelizedString;
173
- };
174
- // syntactic sugar for creating CSSStyleSubjects
175
- Animator.apply = function(el, style, options) {
176
- if (style instanceof Array) {
177
- return new Animator(options).addSubject(new CSSStyleSubject(el, style[0], style[1]));
178
- }
179
- return new Animator(options).addSubject(new CSSStyleSubject(el, style));
180
- };
181
- // make a transition function that gradually accelerates. pass a=1 for smooth
182
- // gravitational acceleration, higher values for an exaggerated effect
183
- Animator.makeEaseIn = function(a) {
184
- return function(state) {
185
- return Math.pow(state, a*2);
186
- };
187
- };
188
- // as makeEaseIn but for deceleration
189
- Animator.makeEaseOut = function(a) {
190
- return function(state) {
191
- return 1 - Math.pow(1 - state, a*2);
192
- };
193
- };
194
- // make a transition function that, like an object with momentum being attracted to a point,
195
- // goes past the target then returns
196
- Animator.makeElastic = function(bounces) {
197
- return function(state) {
198
- state = Animator.tx.easeInOut(state);
199
- return ((1-Math.cos(state * Math.PI * bounces)) * (1 - state)) + state;
200
- };
201
- };
202
- // make an Attack Decay Sustain Release envelope that starts and finishes on the same level
203
- //
204
- Animator.makeADSR = function(attackEnd, decayEnd, sustainEnd, sustainLevel) {
205
- if (sustainLevel == null) sustainLevel = 0.5;
206
- return function(state) {
207
- if (state < attackEnd) {
208
- return state / attackEnd;
209
- }
210
- if (state < decayEnd) {
211
- return 1 - ((state - attackEnd) / (decayEnd - attackEnd) * (1 - sustainLevel));
212
- }
213
- if (state < sustainEnd) {
214
- return sustainLevel;
215
- }
216
- return sustainLevel * (1 - ((state - sustainEnd) / (1 - sustainEnd)));
217
- };
218
- };
219
- // make a transition function that, like a ball falling to floor, reaches the target and/
220
- // bounces back again
221
- Animator.makeBounce = function(bounces) {
222
- var fn = Animator.makeElastic(bounces);
223
- return function(state) {
224
- state = fn(state);
225
- return state <= 1 ? state : 2-state;
226
- };
227
- };
228
-
229
- // pre-made transition functions to use with the 'transition' option
230
- Animator.tx = {
231
- easeInOut: function(pos){
232
- return ((-Math.cos(pos*Math.PI)/2) + 0.5);
233
- },
234
- linear: function(x) {
235
- return x;
236
- },
237
- easeIn: Animator.makeEaseIn(1.5),
238
- easeOut: Animator.makeEaseOut(1.5),
239
- strongEaseIn: Animator.makeEaseIn(2.5),
240
- strongEaseOut: Animator.makeEaseOut(2.5),
241
- elastic: Animator.makeElastic(1),
242
- veryElastic: Animator.makeElastic(3),
243
- bouncy: Animator.makeBounce(1),
244
- veryBouncy: Animator.makeBounce(3)
245
- };
246
-
247
- // animates a pixel-based style property between two integer values
248
- function NumericalStyleSubject(els, property, from, to, units) {
249
- this.els = Animator.makeArray(els);
250
- if (property == 'opacity' && window.ActiveXObject) {
251
- this.property = 'filter';
252
- } else {
253
- this.property = Animator.camelize(property);
254
- }
255
- this.from = parseFloat(from);
256
- this.to = parseFloat(to);
257
- this.units = units != null ? units : 'px';
258
- };
259
- NumericalStyleSubject.prototype = {
260
- setState: function(state) {
261
- var style = this.getStyle(state);
262
- var visibility = (this.property == 'opacity' && state == 0) ? 'hidden' : '';
263
- var j=0;
264
- for (var i=0; i<this.els.length; i++) {
265
- try {
266
- this.els[i].style[this.property] = style;
267
- } catch (e) {
268
- // ignore fontWeight - intermediate numerical values cause exeptions in firefox
269
- if (this.property != 'fontWeight') throw e;
270
- }
271
- if (j++ > 20) return;
272
- }
273
- },
274
- getStyle: function(state) {
275
- state = this.from + ((this.to - this.from) * state);
276
- if (this.property == 'filter') return "alpha(opacity=" + Math.round(state*100) + ")";
277
- if (this.property == 'opacity') return state;
278
- return Math.round(state) + this.units;
279
- },
280
- inspect: function() {
281
- return "\t" + this.property + "(" + this.from + this.units + " to " + this.to + this.units + ")\n";
282
- }
283
- };
284
-
285
- // animates a colour based style property between two hex values
286
- function ColorStyleSubject(els, property, from, to) {
287
- this.els = Animator.makeArray(els);
288
- this.property = Animator.camelize(property);
289
- this.to = this.expandColor(to);
290
- this.from = this.expandColor(from);
291
- this.origFrom = from;
292
- this.origTo = to;
293
- };
294
-
295
- ColorStyleSubject.prototype = {
296
- // parse "#FFFF00" to [256, 256, 0]
297
- expandColor: function(color) {
298
- var hexColor, red, green, blue;
299
- hexColor = ColorStyleSubject.parseColor(color);
300
- if (hexColor) {
301
- red = parseInt(hexColor.slice(1, 3), 16);
302
- green = parseInt(hexColor.slice(3, 5), 16);
303
- blue = parseInt(hexColor.slice(5, 7), 16);
304
- return [red,green,blue];
305
- }
306
- if (window.DEBUG) {
307
- alert("Invalid colour: '" + color + "'");
308
- }
309
- },
310
- getValueForState: function(color, state) {
311
- return Math.round(this.from[color] + ((this.to[color] - this.from[color]) * state));
312
- },
313
- setState: function(state) {
314
- var color = '#'
315
- + ColorStyleSubject.toColorPart(this.getValueForState(0, state))
316
- + ColorStyleSubject.toColorPart(this.getValueForState(1, state))
317
- + ColorStyleSubject.toColorPart(this.getValueForState(2, state));
318
- for (var i=0; i<this.els.length; i++) {
319
- this.els[i].style[this.property] = color;
320
- }
321
- },
322
- inspect: function() {
323
- return "\t" + this.property + "(" + this.origFrom + " to " + this.origTo + ")\n";
324
- }
325
- };
326
-
327
- // return a properly formatted 6-digit hex colour spec, or false
328
- ColorStyleSubject.parseColor = function(string) {
329
- var color = '#', match;
330
- if(match = ColorStyleSubject.parseColor.rgbRe.exec(string)) {
331
- var part;
332
- for (var i=1; i<=3; i++) {
333
- part = Math.max(0, Math.min(255, parseInt(match[i],0)));
334
- color += ColorStyleSubject.toColorPart(part);
335
- }
336
- return color;
337
- }
338
- if (match = ColorStyleSubject.parseColor.hexRe.exec(string)) {
339
- if(match[1].length == 3) {
340
- for (var i=0; i<3; i++) {
341
- color += match[1].charAt(i) + match[1].charAt(i);
342
- }
343
- return color;
344
- }
345
- return '#' + match[1];
346
- }
347
- return false;
348
- };
349
- // convert a number to a 2 digit hex string
350
- ColorStyleSubject.toColorPart = function(number) {
351
- if (number > 255) number = 255;
352
- var digits = number.toString(16);
353
- if (number < 16) return '0' + digits;
354
- return digits;
355
- };
356
- ColorStyleSubject.parseColor.rgbRe = /^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i;
357
- ColorStyleSubject.parseColor.hexRe = /^\#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
358
-
359
- // Animates discrete styles, i.e. ones that do not scale but have discrete values
360
- // that can't be interpolated
361
- function DiscreteStyleSubject(els, property, from, to, threshold) {
362
- this.els = Animator.makeArray(els);
363
- this.property = Animator.camelize(property);
364
- this.from = from;
365
- this.to = to;
366
- this.threshold = threshold || 0.5;
367
- };
368
-
369
- DiscreteStyleSubject.prototype = {
370
- setState: function(state) {
371
- var j=0;
372
- for (var i=0; i<this.els.length; i++) {
373
- this.els[i].style[this.property] = state <= this.threshold ? this.from : this.to;
374
- }
375
- },
376
- inspect: function() {
377
- return "\t" + this.property + "(" + this.from + " to " + this.to + " @ " + this.threshold + ")\n";
378
- }
379
- };
380
-
381
- // animates between two styles defined using CSS.
382
- // if style1 and style2 are present, animate between them, if only style1
383
- // is present, animate between the element's current style and style1
384
- function CSSStyleSubject(els, style1, style2) {
385
- els = Animator.makeArray(els);
386
- this.subjects = [];
387
- if (els.length == 0) return;
388
- var prop, toStyle, fromStyle;
389
- if (style2) {
390
- fromStyle = this.parseStyle(style1, els[0]);
391
- toStyle = this.parseStyle(style2, els[0]);
392
- } else {
393
- toStyle = this.parseStyle(style1, els[0]);
394
- fromStyle = {};
395
- for (prop in toStyle) {
396
- fromStyle[prop] = CSSStyleSubject.getStyle(els[0], prop);
397
- }
398
- }
399
- // remove unchanging properties
400
- var prop;
401
- for (prop in fromStyle) {
402
- if (fromStyle[prop] == toStyle[prop]) {
403
- delete fromStyle[prop];
404
- delete toStyle[prop];
405
- }
406
- }
407
- // discover the type (numerical or colour) of each style
408
- var prop, units, match, type, from, to;
409
- for (prop in fromStyle) {
410
- var fromProp = String(fromStyle[prop]);
411
- var toProp = String(toStyle[prop]);
412
- if (toStyle[prop] == null) {
413
- if (window.DEBUG) alert("No to style provided for '" + prop + '"');
414
- continue;
415
- }
416
-
417
- if (from = ColorStyleSubject.parseColor(fromProp)) {
418
- to = ColorStyleSubject.parseColor(toProp);
419
- type = ColorStyleSubject;
420
- } else if (fromProp.match(CSSStyleSubject.numericalRe)
421
- && toProp.match(CSSStyleSubject.numericalRe)) {
422
- from = parseFloat(fromProp);
423
- to = parseFloat(toProp);
424
- type = NumericalStyleSubject;
425
- match = CSSStyleSubject.numericalRe.exec(fromProp);
426
- var reResult = CSSStyleSubject.numericalRe.exec(toProp);
427
- if (match[1] != null) {
428
- units = match[1];
429
- } else if (reResult[1] != null) {
430
- units = reResult[1];
431
- } else {
432
- units = reResult;
433
- }
434
- } else if (fromProp.match(CSSStyleSubject.discreteRe)
435
- && toProp.match(CSSStyleSubject.discreteRe)) {
436
- from = fromProp;
437
- to = toProp;
438
- type = DiscreteStyleSubject;
439
- units = 0; // hack - how to get an animator option down to here
440
- } else {
441
- if (window.DEBUG) {
442
- alert("Unrecognised format for value of "
443
- + prop + ": '" + fromStyle[prop] + "'");
444
- }
445
- continue;
446
- }
447
- this.subjects[this.subjects.length] = new type(els, prop, from, to, units);
448
- }
449
- };
450
-
451
- CSSStyleSubject.prototype = {
452
- // parses "width: 400px; color: #FFBB2E" to {width: "400px", color: "#FFBB2E"}
453
- parseStyle: function(style, el) {
454
- var rtn = {};
455
- // if style is a rule set
456
- if (style.indexOf(":") != -1) {
457
- var styles = style.split(";");
458
- for (var i=0; i<styles.length; i++) {
459
- var parts = CSSStyleSubject.ruleRe.exec(styles[i]);
460
- if (parts) {
461
- rtn[parts[1]] = parts[2];
462
- }
463
- }
464
- }
465
- // else assume style is a class name
466
- else {
467
- var prop, value, oldClass;
468
- oldClass = el.className;
469
- el.className = style;
470
- for (var i=0; i<CSSStyleSubject.cssProperties.length; i++) {
471
- prop = CSSStyleSubject.cssProperties[i];
472
- value = CSSStyleSubject.getStyle(el, prop);
473
- if (value != null) {
474
- rtn[prop] = value;
475
- }
476
- }
477
- el.className = oldClass;
478
- }
479
- return rtn;
480
-
481
- },
482
- setState: function(state) {
483
- for (var i=0; i<this.subjects.length; i++) {
484
- this.subjects[i].setState(state);
485
- }
486
- },
487
- inspect: function() {
488
- var str = "";
489
- for (var i=0; i<this.subjects.length; i++) {
490
- str += this.subjects[i].inspect();
491
- }
492
- return str;
493
- }
494
- };
495
- // get the current value of a css property,
496
- CSSStyleSubject.getStyle = function(el, property){
497
- var style;
498
- if(document.defaultView && document.defaultView.getComputedStyle){
499
- style = document.defaultView.getComputedStyle(el, "").getPropertyValue(property);
500
- if (style) {
501
- return style;
502
- }
503
- }
504
- property = Animator.camelize(property);
505
- if(el.currentStyle){
506
- style = el.currentStyle[property];
507
- }
508
- return style || el.style[property];
509
- };
510
-
511
-
512
- CSSStyleSubject.ruleRe = /^\s*([a-zA-Z\-]+)\s*:\s*(\S(.+\S)?)\s*$/;
513
- CSSStyleSubject.numericalRe = /^-?\d+(?:\.\d+)?(%|[a-zA-Z]{2})?$/;
514
- CSSStyleSubject.discreteRe = /^\w+$/;
515
-
516
- // required because the style object of elements isn't enumerable in Safari
517
- /*
518
- CSSStyleSubject.cssProperties = ['background-color','border','border-color','border-spacing',
519
- 'border-style','border-top','border-right','border-bottom','border-left','border-top-color',
520
- 'border-right-color','border-bottom-color','border-left-color','border-top-width','border-right-width',
521
- 'border-bottom-width','border-left-width','border-width','bottom','color','font-size','font-size-adjust',
522
- 'font-stretch','font-style','height','left','letter-spacing','line-height','margin','margin-top',
523
- 'margin-right','margin-bottom','margin-left','marker-offset','max-height','max-width','min-height',
524
- 'min-width','orphans','outline','outline-color','outline-style','outline-width','overflow','padding',
525
- 'padding-top','padding-right','padding-bottom','padding-left','quotes','right','size','text-indent',
526
- 'top','width','word-spacing','z-index','opacity','outline-offset'];*/
527
-
528
-
529
- CSSStyleSubject.cssProperties = ['azimuth','background','background-attachment','background-color','background-image','background-position','background-repeat','border-collapse','border-color','border-spacing','border-style','border-top','border-top-color','border-right-color','border-bottom-color','border-left-color','border-top-style','border-right-style','border-bottom-style','border-left-style','border-top-width','border-right-width','border-bottom-width','border-left-width','border-width','bottom','clear','clip','color','content','cursor','direction','display','elevation','empty-cells','css-float','font','font-family','font-size','font-size-adjust','font-stretch','font-style','font-variant','font-weight','height','left','letter-spacing','line-height','list-style','list-style-image','list-style-position','list-style-type','margin','margin-top','margin-right','margin-bottom','margin-left','max-height','max-width','min-height','min-width','orphans','outline','outline-color','outline-style','outline-width','overflow','padding','padding-top','padding-right','padding-bottom','padding-left','pause','position','right','size','table-layout','text-align','text-decoration','text-indent','text-shadow','text-transform','top','vertical-align','visibility','white-space','width','word-spacing','z-index','opacity','outline-offset','overflow-x','overflow-y'];
530
-
531
-
532
- // chains several Animator objects together
533
- function AnimatorChain(animators, options) {
534
- this.animators = animators;
535
- this.setOptions(options);
536
- for (var i=0; i<this.animators.length; i++) {
537
- this.listenTo(this.animators[i]);
538
- }
539
- this.forwards = false;
540
- this.current = 0;
541
- };
542
-
543
- AnimatorChain.prototype = {
544
- // apply defaults
545
- setOptions: function(options) {
546
- this.options = Animator.applyDefaults({
547
- // by default, each call to AnimatorChain.play() calls jumpTo(0) of each animator
548
- // before playing, which can cause flickering if you have multiple animators all
549
- // targeting the same element. Set this to false to avoid this.
550
- resetOnPlay: true
551
- }, options);
552
- },
553
- // play each animator in turn
554
- play: function() {
555
- this.forwards = true;
556
- this.current = -1;
557
- if (this.options.resetOnPlay) {
558
- for (var i=0; i<this.animators.length; i++) {
559
- this.animators[i].jumpTo(0);
560
- }
561
- }
562
- this.advance();
563
- },
564
- // play all animators backwards
565
- reverse: function() {
566
- this.forwards = false;
567
- this.current = this.animators.length;
568
- if (this.options.resetOnPlay) {
569
- for (var i=0; i<this.animators.length; i++) {
570
- this.animators[i].jumpTo(1);
571
- }
572
- }
573
- this.advance();
574
- },
575
- // if we have just play()'d, then call reverse(), and vice versa
576
- toggle: function() {
577
- if (this.forwards) {
578
- this.seekTo(0);
579
- } else {
580
- this.seekTo(1);
581
- }
582
- },
583
- // internal: install an event listener on an animator's onComplete option
584
- // to trigger the next animator
585
- listenTo: function(animator) {
586
- var oldOnComplete = animator.options.onComplete;
587
- var _this = this;
588
- animator.options.onComplete = function() {
589
- if (oldOnComplete) oldOnComplete.call(animator);
590
- _this.advance();
591
- };
592
- },
593
- // play the next animator
594
- advance: function() {
595
- if (this.forwards) {
596
- if (this.animators[this.current + 1] == null) return;
597
- this.current++;
598
- this.animators[this.current].play();
599
- } else {
600
- if (this.animators[this.current - 1] == null) return;
601
- this.current--;
602
- this.animators[this.current].reverse();
603
- }
604
- },
605
- // this function is provided for drop-in compatibility with Animator objects,
606
- // but only accepts 0 and 1 as target values
607
- seekTo: function(target) {
608
- if (target <= 0) {
609
- this.forwards = false;
610
- this.animators[this.current].seekTo(0);
611
- } else {
612
- this.forwards = true;
613
- this.animators[this.current].seekTo(1);
614
- }
615
- }
616
- };
617
-
618
- // an Accordion is a class that creates and controls a number of Animators. An array of elements is passed in,
619
- // and for each element an Animator and a activator button is created. When an Animator's activator button is
620
- // clicked, the Animator and all before it seek to 0, and all Animators after it seek to 1. This can be used to
621
- // create the classic Accordion effect, hence the name.
622
- // see setOptions for arguments
623
- function Accordion(options) {
624
- this.setOptions(options);
625
- var selected = this.options.initialSection, current;
626
- if (this.options.rememberance) {
627
- current = document.location.hash.substring(1);
628
- }
629
- this.rememberanceTexts = [];
630
- this.ans = [];
631
- var _this = this;
632
- for (var i=0; i<this.options.sections.length; i++) {
633
- var el = this.options.sections[i];
634
- var an = new Animator(this.options.animatorOptions);
635
- var from = this.options.from + (this.options.shift * i);
636
- var to = this.options.to + (this.options.shift * i);
637
- an.addSubject(new NumericalStyleSubject(el, this.options.property, from, to, this.options.units));
638
- an.jumpTo(0);
639
- var activator = this.options.getActivator(el);
640
- activator.index = i;
641
- activator.onclick = function(){_this.show(this.index);};
642
- this.ans[this.ans.length] = an;
643
- this.rememberanceTexts[i] = activator.innerHTML.replace(/\s/g, "");
644
- if (this.rememberanceTexts[i] === current) {
645
- selected = i;
646
- }
647
- }
648
- this.show(selected);
649
- };
650
-
651
- Accordion.prototype = {
652
- // apply defaults
653
- setOptions: function(options) {
654
- this.options = SC.mixin({
655
- // REQUIRED: an array of elements to use as the accordion sections
656
- sections: null,
657
- // a function that locates an activator button element given a section element.
658
- // by default it takes a button id from the section's "activator" attibute
659
- getActivator: function(el) {return document.getElementById(el.getAttribute("activator"));},
660
- // shifts each animator's range, for example with options {from:0,to:100,shift:20}
661
- // the animators' ranges will be 0-100, 20-120, 40-140 etc.
662
- shift: 0,
663
- // the first page to show
664
- initialSection: 0,
665
- // if set to true, document.location.hash will be used to preserve the open section across page reloads
666
- rememberance: true,
667
- // constructor arguments to the Animator objects
668
- animatorOptions: {}
669
- }, options || {});
670
- },
671
- show: function(section) {
672
- for (var i=0; i<this.ans.length; i++) {
673
- this.ans[i].seekTo(i > section ? 1 : 0);
674
- }
675
- if (this.options.rememberance) {
676
- document.location.hash = this.rememberanceTexts[section];
677
- }
678
- }
679
- };