ruby-openid 2.2.3 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +11 -0
- data/README.md +1 -2
- data/examples/rails_openid/Gemfile +41 -0
- data/examples/rails_openid/README.rdoc +261 -0
- data/examples/rails_openid/Rakefile +4 -7
- data/examples/rails_openid/app/assets/images/rails.png +0 -0
- data/examples/rails_openid/app/assets/javascripts/application.js +15 -0
- data/examples/rails_openid/app/assets/stylesheets/application.css +13 -0
- data/examples/rails_openid/app/controllers/application_controller.rb +3 -0
- data/examples/rails_openid/app/controllers/consumer_controller.rb +1 -0
- data/examples/rails_openid/app/helpers/application_helper.rb +0 -1
- data/examples/rails_openid/app/views/consumer/{index.rhtml → index.html.erb} +0 -0
- data/examples/rails_openid/app/views/layouts/{server.rhtml → server.html.erb} +4 -2
- data/examples/rails_openid/app/views/login/{index.rhtml → index.html.erb} +0 -0
- data/examples/rails_openid/app/views/server/{decide.rhtml → decide.html.erb} +1 -0
- data/examples/rails_openid/config.ru +4 -0
- data/examples/rails_openid/config/application.rb +62 -0
- data/examples/rails_openid/config/boot.rb +4 -17
- data/examples/rails_openid/config/database.yml +15 -64
- data/examples/rails_openid/config/environment.rb +4 -53
- data/examples/rails_openid/config/environments/development.rb +32 -14
- data/examples/rails_openid/config/environments/production.rb +61 -13
- data/examples/rails_openid/config/environments/test.rb +33 -15
- data/examples/rails_openid/config/initializers/backtrace_silencers.rb +7 -0
- data/examples/rails_openid/config/initializers/inflections.rb +15 -0
- data/examples/rails_openid/config/initializers/mime_types.rb +5 -0
- data/examples/rails_openid/config/initializers/rails_root.rb +1 -0
- data/examples/rails_openid/config/initializers/secret_token.rb +7 -0
- data/examples/rails_openid/config/initializers/session_store.rb +8 -0
- data/examples/rails_openid/config/initializers/wrap_parameters.rb +14 -0
- data/examples/rails_openid/config/locales/en.yml +5 -0
- data/examples/rails_openid/config/routes.rb +65 -18
- data/examples/rails_openid/db/development.sqlite3 +0 -0
- data/examples/rails_openid/db/seeds.rb +7 -0
- data/examples/rails_openid/doc/README_FOR_APP +1 -1
- data/examples/rails_openid/log/development.log +2052 -0
- data/examples/rails_openid/public/404.html +23 -5
- data/examples/rails_openid/public/422.html +26 -0
- data/examples/rails_openid/public/500.html +22 -5
- data/examples/rails_openid/public/javascripts/application.js +2 -0
- data/examples/rails_openid/public/javascripts/controls.js +586 -373
- data/examples/rails_openid/public/javascripts/dragdrop.js +575 -186
- data/examples/rails_openid/public/javascripts/effects.js +763 -489
- data/examples/rails_openid/public/javascripts/prototype.js +3420 -885
- data/examples/rails_openid/public/robots.txt +5 -1
- data/examples/rails_openid/script/rails +6 -0
- data/examples/rails_openid/test/performance/browsing_test.rb +12 -0
- data/examples/rails_openid/test/test_helper.rb +7 -22
- data/lib/openid/association.rb +1 -1
- data/lib/openid/consumer/checkid_request.rb +1 -1
- data/lib/openid/consumer/discovery.rb +1 -1
- data/lib/openid/consumer/html_parse.rb +3 -1
- data/lib/openid/consumer/idres.rb +1 -1
- data/lib/openid/extensions/ax.rb +2 -3
- data/lib/openid/extensions/ui.rb +3 -3
- data/lib/openid/extras.rb +2 -2
- data/lib/openid/server.rb +2 -2
- data/lib/openid/store/memory.rb +1 -2
- data/lib/openid/store/nonce.rb +1 -1
- data/lib/openid/trustroot.rb +1 -1
- data/lib/openid/util.rb +2 -2
- data/lib/openid/version.rb +1 -1
- data/lib/openid/yadis/xrds.rb +1 -1
- data/test/test_accept.rb +20 -21
- data/test/test_association.rb +4 -8
- data/test/test_associationmanager.rb +1 -1
- data/test/test_ax.rb +0 -1
- data/test/test_checkid_request.rb +7 -8
- data/test/test_dh.rb +1 -1
- data/test/test_discover.rb +7 -8
- data/test/test_extension.rb +1 -1
- data/test/test_fetchers.rb +7 -11
- data/test/test_filters.rb +0 -4
- data/test/test_idres.rb +5 -5
- data/test/test_kvpost.rb +0 -1
- data/test/test_message.rb +10 -11
- data/test/test_parsehtml.rb +0 -1
- data/test/test_server.rb +11 -30
- data/test/test_stores.rb +2 -2
- data/test/test_trustroot.rb +1 -1
- data/test/test_urinorm.rb +1 -1
- data/test/test_xrds.rb +1 -1
- data/test/test_yadis_discovery.rb +0 -2
- metadata +34 -33
- data/examples/rails_openid/app/controllers/application.rb +0 -4
- data/examples/rails_openid/script/about +0 -3
- data/examples/rails_openid/script/breakpointer +0 -3
- data/examples/rails_openid/script/console +0 -3
- data/examples/rails_openid/script/destroy +0 -3
- data/examples/rails_openid/script/generate +0 -3
- data/examples/rails_openid/script/performance/benchmarker +0 -3
- data/examples/rails_openid/script/performance/profiler +0 -3
- data/examples/rails_openid/script/plugin +0 -3
- data/examples/rails_openid/script/process/reaper +0 -3
- data/examples/rails_openid/script/process/spawner +0 -3
- data/examples/rails_openid/script/process/spinner +0 -3
- data/examples/rails_openid/script/runner +0 -3
- data/examples/rails_openid/script/server +0 -3
|
@@ -1,110 +1,120 @@
|
|
|
1
|
-
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
|
1
|
+
// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
|
2
2
|
// Contributors:
|
|
3
3
|
// Justin Palmer (http://encytemedia.com/)
|
|
4
4
|
// Mark Pilgrim (http://diveintomark.org/)
|
|
5
5
|
// Martin Bialasinki
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
/* ------------- element ext -------------- */
|
|
10
|
-
|
|
11
|
-
// converts rgb() and #xxx to #xxxxxx format,
|
|
12
|
-
// returns self (or first argument) if not convertable
|
|
13
|
-
String.prototype.parseColor = function() {
|
|
14
|
-
var color = '#';
|
|
15
|
-
if(this.slice(0,4) == 'rgb(') {
|
|
16
|
-
var cols = this.slice(4,this.length-1).split(',');
|
|
17
|
-
var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
|
|
18
|
-
} else {
|
|
19
|
-
if(this.slice(0,1) == '#') {
|
|
20
|
-
if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
|
|
21
|
-
if(this.length==7) color = this.toLowerCase();
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return(color.length==7 ? color : (arguments[0] || this));
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
Element.collectTextNodesIgnoreClass = function(element, ignoreclass) {
|
|
28
|
-
var children = $(element).childNodes;
|
|
29
|
-
var text = '';
|
|
30
|
-
var classtest = new RegExp('^([^ ]+ )*' + ignoreclass+ '( [^ ]+)*$','i');
|
|
31
|
-
|
|
32
|
-
for (var i = 0; i < children.length; i++) {
|
|
33
|
-
if(children[i].nodeType==3) {
|
|
34
|
-
text+=children[i].nodeValue;
|
|
35
|
-
} else {
|
|
36
|
-
if((!children[i].className.match(classtest)) && children[i].hasChildNodes())
|
|
37
|
-
text += Element.collectTextNodesIgnoreClass(children[i], ignoreclass);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return text;
|
|
42
|
-
}
|
|
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/
|
|
43
9
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
+
};
|
|
48
25
|
|
|
49
|
-
|
|
50
|
-
Element.setStyle(element, {fontSize: (percent/100) + 'em'});
|
|
51
|
-
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
|
|
52
|
-
}
|
|
26
|
+
/*--------------------------------------------------------------------------*/
|
|
53
27
|
|
|
54
|
-
Element.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return 1.0;
|
|
61
|
-
}
|
|
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
|
+
};
|
|
62
34
|
|
|
63
|
-
Element.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});
|
|
71
|
-
} else {
|
|
72
|
-
if(value < 0.00001) value = 0;
|
|
73
|
-
Element.setStyle(element, {opacity: value});
|
|
74
|
-
if(/MSIE/.test(navigator.userAgent))
|
|
75
|
-
Element.setStyle(element,
|
|
76
|
-
{ filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
|
|
77
|
-
'alpha(opacity='+value*100+')' });
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
Element.getInlineOpacity = function(element){
|
|
82
|
-
return $(element).style.opacity || '';
|
|
83
|
-
}
|
|
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
|
+
};
|
|
84
42
|
|
|
85
|
-
Element.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
+
};
|
|
89
49
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
+
};
|
|
94
62
|
|
|
95
63
|
/*--------------------------------------------------------------------------*/
|
|
96
64
|
|
|
97
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
|
+
},
|
|
98
107
|
tagifyText: function(element) {
|
|
99
108
|
var tagifyStyle = 'position:relative';
|
|
100
|
-
if(
|
|
109
|
+
if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
|
|
110
|
+
|
|
101
111
|
element = $(element);
|
|
102
112
|
$A(element.childNodes).each( function(child) {
|
|
103
|
-
if(child.nodeType==3) {
|
|
113
|
+
if (child.nodeType==3) {
|
|
104
114
|
child.nodeValue.toArray().each( function(character) {
|
|
105
115
|
element.insertBefore(
|
|
106
|
-
|
|
107
|
-
character == ' ' ? String.fromCharCode(160) : character),
|
|
116
|
+
new Element('span', {style: tagifyStyle}).update(
|
|
117
|
+
character == ' ' ? String.fromCharCode(160) : character),
|
|
108
118
|
child);
|
|
109
119
|
});
|
|
110
120
|
Element.remove(child);
|
|
@@ -113,176 +123,194 @@ var Effect = {
|
|
|
113
123
|
},
|
|
114
124
|
multiple: function(element, effect) {
|
|
115
125
|
var elements;
|
|
116
|
-
if(((typeof element == 'object') ||
|
|
117
|
-
(
|
|
126
|
+
if (((typeof element == 'object') ||
|
|
127
|
+
Object.isFunction(element)) &&
|
|
118
128
|
(element.length))
|
|
119
129
|
elements = element;
|
|
120
130
|
else
|
|
121
131
|
elements = $(element).childNodes;
|
|
122
|
-
|
|
132
|
+
|
|
123
133
|
var options = Object.extend({
|
|
124
134
|
speed: 0.1,
|
|
125
135
|
delay: 0.0
|
|
126
|
-
}, arguments[2] || {});
|
|
136
|
+
}, arguments[2] || { });
|
|
127
137
|
var masterDelay = options.delay;
|
|
128
138
|
|
|
129
139
|
$A(elements).each( function(element, index) {
|
|
130
140
|
new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
|
|
131
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);
|
|
132
156
|
}
|
|
133
157
|
};
|
|
134
158
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
/* ------------- transitions ------------- */
|
|
138
|
-
|
|
139
|
-
Effect.Transitions = {}
|
|
140
|
-
|
|
141
|
-
Effect.Transitions.linear = function(pos) {
|
|
142
|
-
return pos;
|
|
143
|
-
}
|
|
144
|
-
Effect.Transitions.sinoidal = function(pos) {
|
|
145
|
-
return (-Math.cos(pos*Math.PI)/2) + 0.5;
|
|
146
|
-
}
|
|
147
|
-
Effect.Transitions.reverse = function(pos) {
|
|
148
|
-
return 1-pos;
|
|
149
|
-
}
|
|
150
|
-
Effect.Transitions.flicker = function(pos) {
|
|
151
|
-
return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
|
|
152
|
-
}
|
|
153
|
-
Effect.Transitions.wobble = function(pos) {
|
|
154
|
-
return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
|
|
155
|
-
}
|
|
156
|
-
Effect.Transitions.pulse = function(pos) {
|
|
157
|
-
return (Math.floor(pos*10) % 2 == 0 ?
|
|
158
|
-
(pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
|
|
159
|
-
}
|
|
160
|
-
Effect.Transitions.none = function(pos) {
|
|
161
|
-
return 0;
|
|
162
|
-
}
|
|
163
|
-
Effect.Transitions.full = function(pos) {
|
|
164
|
-
return 1;
|
|
165
|
-
}
|
|
159
|
+
Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;
|
|
166
160
|
|
|
167
161
|
/* ------------- core effects ------------- */
|
|
168
162
|
|
|
169
|
-
Effect.
|
|
170
|
-
|
|
163
|
+
Effect.ScopedQueue = Class.create(Enumerable, {
|
|
164
|
+
initialize: function() {
|
|
165
|
+
this.effects = [];
|
|
166
|
+
this.interval = null;
|
|
167
|
+
},
|
|
171
168
|
_each: function(iterator) {
|
|
172
169
|
this.effects._each(iterator);
|
|
173
170
|
},
|
|
174
|
-
interval: null,
|
|
175
171
|
add: function(effect) {
|
|
176
172
|
var timestamp = new Date().getTime();
|
|
177
|
-
|
|
178
|
-
|
|
173
|
+
|
|
174
|
+
var position = Object.isString(effect.options.queue) ?
|
|
175
|
+
effect.options.queue : effect.options.queue.position;
|
|
176
|
+
|
|
177
|
+
switch(position) {
|
|
179
178
|
case 'front':
|
|
180
|
-
// move unstarted effects after this effect
|
|
179
|
+
// move unstarted effects after this effect
|
|
181
180
|
this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
|
|
182
181
|
e.startOn += effect.finishOn;
|
|
183
182
|
e.finishOn += effect.finishOn;
|
|
184
183
|
});
|
|
185
184
|
break;
|
|
185
|
+
case 'with-last':
|
|
186
|
+
timestamp = this.effects.pluck('startOn').max() || timestamp;
|
|
187
|
+
break;
|
|
186
188
|
case 'end':
|
|
187
189
|
// start effect after last queued effect has finished
|
|
188
190
|
timestamp = this.effects.pluck('finishOn').max() || timestamp;
|
|
189
191
|
break;
|
|
190
192
|
}
|
|
191
|
-
|
|
193
|
+
|
|
192
194
|
effect.startOn += timestamp;
|
|
193
195
|
effect.finishOn += timestamp;
|
|
194
|
-
|
|
195
|
-
if(!this.
|
|
196
|
-
this.
|
|
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);
|
|
197
202
|
},
|
|
198
203
|
remove: function(effect) {
|
|
199
204
|
this.effects = this.effects.reject(function(e) { return e==effect });
|
|
200
|
-
if(this.effects.length == 0) {
|
|
205
|
+
if (this.effects.length == 0) {
|
|
201
206
|
clearInterval(this.interval);
|
|
202
207
|
this.interval = null;
|
|
203
208
|
}
|
|
204
209
|
},
|
|
205
210
|
loop: function() {
|
|
206
211
|
var timePos = new Date().getTime();
|
|
207
|
-
this.effects.
|
|
212
|
+
for(var i=0, len=this.effects.length;i<len;i++)
|
|
213
|
+
this.effects[i] && this.effects[i].loop(timePos);
|
|
208
214
|
}
|
|
209
|
-
}
|
|
210
|
-
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
Effect.Queues = {
|
|
218
|
+
instances: $H(),
|
|
219
|
+
get: function(queueName) {
|
|
220
|
+
if (!Object.isString(queueName)) return queueName;
|
|
211
221
|
|
|
212
|
-
|
|
213
|
-
|
|
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({
|
|
214
229
|
position: null,
|
|
215
|
-
setOptions: function(options) {
|
|
216
|
-
this.options = Object.extend({
|
|
217
|
-
transition: Effect.Transitions.sinoidal,
|
|
218
|
-
duration: 1.0, // seconds
|
|
219
|
-
fps: 25.0, // max. 25fps due to Effect.Queue implementation
|
|
220
|
-
sync: false, // true for combining
|
|
221
|
-
from: 0.0,
|
|
222
|
-
to: 1.0,
|
|
223
|
-
delay: 0.0,
|
|
224
|
-
queue: 'parallel'
|
|
225
|
-
}, options || {});
|
|
226
|
-
},
|
|
227
230
|
start: function(options) {
|
|
228
|
-
|
|
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 || { });
|
|
229
239
|
this.currentFrame = 0;
|
|
230
240
|
this.state = 'idle';
|
|
231
241
|
this.startOn = this.options.delay*1000;
|
|
232
|
-
this.finishOn = this.startOn
|
|
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
|
+
|
|
233
272
|
this.event('beforeStart');
|
|
234
|
-
if(!this.options.sync)
|
|
273
|
+
if (!this.options.sync)
|
|
274
|
+
Effect.Queues.get(Object.isString(this.options.queue) ?
|
|
275
|
+
'global' : this.options.queue.scope).add(this);
|
|
235
276
|
},
|
|
236
277
|
loop: function(timePos) {
|
|
237
|
-
if(timePos >= this.startOn) {
|
|
238
|
-
if(timePos >= this.finishOn) {
|
|
278
|
+
if (timePos >= this.startOn) {
|
|
279
|
+
if (timePos >= this.finishOn) {
|
|
239
280
|
this.render(1.0);
|
|
240
281
|
this.cancel();
|
|
241
282
|
this.event('beforeFinish');
|
|
242
|
-
if(this.finish) this.finish();
|
|
283
|
+
if (this.finish) this.finish();
|
|
243
284
|
this.event('afterFinish');
|
|
244
|
-
return;
|
|
285
|
+
return;
|
|
245
286
|
}
|
|
246
|
-
var pos = (timePos - this.startOn) /
|
|
247
|
-
|
|
248
|
-
if(frame > this.currentFrame) {
|
|
287
|
+
var pos = (timePos - this.startOn) / this.totalTime,
|
|
288
|
+
frame = (pos * this.totalFrames).round();
|
|
289
|
+
if (frame > this.currentFrame) {
|
|
249
290
|
this.render(pos);
|
|
250
291
|
this.currentFrame = frame;
|
|
251
292
|
}
|
|
252
293
|
}
|
|
253
294
|
},
|
|
254
|
-
render: function(pos) {
|
|
255
|
-
if(this.state == 'idle') {
|
|
256
|
-
this.state = 'running';
|
|
257
|
-
this.event('beforeSetup');
|
|
258
|
-
if(this.setup) this.setup();
|
|
259
|
-
this.event('afterSetup');
|
|
260
|
-
}
|
|
261
|
-
if(this.state == 'running') {
|
|
262
|
-
if(this.options.transition) pos = this.options.transition(pos);
|
|
263
|
-
pos *= (this.options.to-this.options.from);
|
|
264
|
-
pos += this.options.from;
|
|
265
|
-
this.position = pos;
|
|
266
|
-
this.event('beforeUpdate');
|
|
267
|
-
if(this.update) this.update(pos);
|
|
268
|
-
this.event('afterUpdate');
|
|
269
|
-
}
|
|
270
|
-
},
|
|
271
295
|
cancel: function() {
|
|
272
|
-
if(!this.options.sync)
|
|
296
|
+
if (!this.options.sync)
|
|
297
|
+
Effect.Queues.get(Object.isString(this.options.queue) ?
|
|
298
|
+
'global' : this.options.queue.scope).remove(this);
|
|
273
299
|
this.state = 'finished';
|
|
274
300
|
},
|
|
275
301
|
event: function(eventName) {
|
|
276
|
-
if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
|
|
277
|
-
if(this.options[eventName]) this.options[eventName](this);
|
|
302
|
+
if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
|
|
303
|
+
if (this.options[eventName]) this.options[eventName](this);
|
|
278
304
|
},
|
|
279
305
|
inspect: function() {
|
|
280
|
-
|
|
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() + '>';
|
|
281
310
|
}
|
|
282
|
-
}
|
|
311
|
+
});
|
|
283
312
|
|
|
284
|
-
Effect.Parallel = Class.create(
|
|
285
|
-
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
|
|
313
|
+
Effect.Parallel = Class.create(Effect.Base, {
|
|
286
314
|
initialize: function(effects) {
|
|
287
315
|
this.effects = effects || [];
|
|
288
316
|
this.start(arguments[1]);
|
|
@@ -295,423 +323,458 @@ Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
|
|
|
295
323
|
effect.render(1.0);
|
|
296
324
|
effect.cancel();
|
|
297
325
|
effect.event('beforeFinish');
|
|
298
|
-
if(effect.finish) effect.finish(position);
|
|
326
|
+
if (effect.finish) effect.finish(position);
|
|
299
327
|
effect.event('afterFinish');
|
|
300
328
|
});
|
|
301
329
|
}
|
|
302
330
|
});
|
|
303
331
|
|
|
304
|
-
Effect.
|
|
305
|
-
|
|
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, {
|
|
306
355
|
initialize: function(element) {
|
|
307
356
|
this.element = $(element);
|
|
357
|
+
if (!this.element) throw(Effect._elementDoesNotExistError);
|
|
308
358
|
// make this work on IE on elements without 'layout'
|
|
309
|
-
if(
|
|
310
|
-
|
|
359
|
+
if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
|
|
360
|
+
this.element.setStyle({zoom: 1});
|
|
311
361
|
var options = Object.extend({
|
|
312
|
-
from:
|
|
362
|
+
from: this.element.getOpacity() || 0.0,
|
|
313
363
|
to: 1.0
|
|
314
|
-
}, arguments[1] || {});
|
|
364
|
+
}, arguments[1] || { });
|
|
315
365
|
this.start(options);
|
|
316
366
|
},
|
|
317
367
|
update: function(position) {
|
|
318
|
-
|
|
368
|
+
this.element.setOpacity(position);
|
|
319
369
|
}
|
|
320
370
|
});
|
|
321
371
|
|
|
322
|
-
Effect.
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
this.element
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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);
|
|
329
382
|
},
|
|
330
383
|
setup: function() {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
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
|
+
}
|
|
338
391
|
},
|
|
339
392
|
update: function(position) {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
393
|
+
this.element.setStyle({
|
|
394
|
+
left: (this.options.x * position + this.originalLeft).round() + 'px',
|
|
395
|
+
top: (this.options.y * position + this.originalTop).round() + 'px'
|
|
343
396
|
});
|
|
344
397
|
}
|
|
345
398
|
});
|
|
346
399
|
|
|
347
|
-
|
|
348
|
-
|
|
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, {
|
|
349
407
|
initialize: function(element, percent) {
|
|
350
|
-
this.element = $(element)
|
|
408
|
+
this.element = $(element);
|
|
409
|
+
if (!this.element) throw(Effect._elementDoesNotExistError);
|
|
351
410
|
var options = Object.extend({
|
|
352
411
|
scaleX: true,
|
|
353
412
|
scaleY: true,
|
|
354
413
|
scaleContent: true,
|
|
355
414
|
scaleFromCenter: false,
|
|
356
|
-
scaleMode: 'box', // 'box' or 'contents' or {} with provided values
|
|
415
|
+
scaleMode: 'box', // 'box' or 'contents' or { } with provided values
|
|
357
416
|
scaleFrom: 100.0,
|
|
358
417
|
scaleTo: percent
|
|
359
|
-
}, arguments[2] || {});
|
|
418
|
+
}, arguments[2] || { });
|
|
360
419
|
this.start(options);
|
|
361
420
|
},
|
|
362
421
|
setup: function() {
|
|
363
422
|
this.restoreAfterFinish = this.options.restoreAfterFinish || false;
|
|
364
|
-
this.elementPositioning =
|
|
365
|
-
|
|
366
|
-
this.originalStyle = {};
|
|
423
|
+
this.elementPositioning = this.element.getStyle('position');
|
|
424
|
+
|
|
425
|
+
this.originalStyle = { };
|
|
367
426
|
['top','left','width','height','fontSize'].each( function(k) {
|
|
368
427
|
this.originalStyle[k] = this.element.style[k];
|
|
369
428
|
}.bind(this));
|
|
370
|
-
|
|
429
|
+
|
|
371
430
|
this.originalTop = this.element.offsetTop;
|
|
372
431
|
this.originalLeft = this.element.offsetLeft;
|
|
373
|
-
|
|
374
|
-
var fontSize =
|
|
375
|
-
['em','px','%'].each( function(fontSizeType) {
|
|
376
|
-
if(fontSize.indexOf(fontSizeType)>0) {
|
|
432
|
+
|
|
433
|
+
var fontSize = this.element.getStyle('font-size') || '100%';
|
|
434
|
+
['em','px','%','pt'].each( function(fontSizeType) {
|
|
435
|
+
if (fontSize.indexOf(fontSizeType)>0) {
|
|
377
436
|
this.fontSize = parseFloat(fontSize);
|
|
378
437
|
this.fontSizeType = fontSizeType;
|
|
379
438
|
}
|
|
380
439
|
}.bind(this));
|
|
381
|
-
|
|
440
|
+
|
|
382
441
|
this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
|
|
383
|
-
|
|
442
|
+
|
|
384
443
|
this.dims = null;
|
|
385
|
-
if(this.options.scaleMode=='box')
|
|
444
|
+
if (this.options.scaleMode=='box')
|
|
386
445
|
this.dims = [this.element.offsetHeight, this.element.offsetWidth];
|
|
387
|
-
if(/^content/.test(this.options.scaleMode))
|
|
446
|
+
if (/^content/.test(this.options.scaleMode))
|
|
388
447
|
this.dims = [this.element.scrollHeight, this.element.scrollWidth];
|
|
389
|
-
if(!this.dims)
|
|
448
|
+
if (!this.dims)
|
|
390
449
|
this.dims = [this.options.scaleMode.originalHeight,
|
|
391
450
|
this.options.scaleMode.originalWidth];
|
|
392
451
|
},
|
|
393
452
|
update: function(position) {
|
|
394
453
|
var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
|
|
395
|
-
if(this.options.scaleContent && this.fontSize)
|
|
396
|
-
|
|
454
|
+
if (this.options.scaleContent && this.fontSize)
|
|
455
|
+
this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
|
|
397
456
|
this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
|
|
398
457
|
},
|
|
399
458
|
finish: function(position) {
|
|
400
|
-
if (this.restoreAfterFinish)
|
|
459
|
+
if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
|
|
401
460
|
},
|
|
402
461
|
setDimensions: function(height, width) {
|
|
403
|
-
var d = {};
|
|
404
|
-
if(this.options.scaleX) d.width = width + 'px';
|
|
405
|
-
if(this.options.scaleY) d.height = height + 'px';
|
|
406
|
-
if(this.options.scaleFromCenter) {
|
|
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) {
|
|
407
466
|
var topd = (height - this.dims[0])/2;
|
|
408
467
|
var leftd = (width - this.dims[1])/2;
|
|
409
|
-
if(this.elementPositioning == 'absolute') {
|
|
410
|
-
if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
|
|
411
|
-
if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
|
|
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';
|
|
412
471
|
} else {
|
|
413
|
-
if(this.options.scaleY) d.top = -topd + 'px';
|
|
414
|
-
if(this.options.scaleX) d.left = -leftd + 'px';
|
|
472
|
+
if (this.options.scaleY) d.top = -topd + 'px';
|
|
473
|
+
if (this.options.scaleX) d.left = -leftd + 'px';
|
|
415
474
|
}
|
|
416
475
|
}
|
|
417
|
-
|
|
476
|
+
this.element.setStyle(d);
|
|
418
477
|
}
|
|
419
478
|
});
|
|
420
479
|
|
|
421
|
-
Effect.Highlight = Class.create(
|
|
422
|
-
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
|
|
480
|
+
Effect.Highlight = Class.create(Effect.Base, {
|
|
423
481
|
initialize: function(element) {
|
|
424
482
|
this.element = $(element);
|
|
425
|
-
|
|
483
|
+
if (!this.element) throw(Effect._elementDoesNotExistError);
|
|
484
|
+
var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
|
|
426
485
|
this.start(options);
|
|
427
486
|
},
|
|
428
487
|
setup: function() {
|
|
429
488
|
// Prevent executing on elements not in the layout flow
|
|
430
|
-
if(
|
|
489
|
+
if (this.element.getStyle('display')=='none') { this.cancel(); return; }
|
|
431
490
|
// Disable background image during the effect
|
|
432
|
-
this.oldStyle = {
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
if(!this.options.
|
|
438
|
-
this.options.
|
|
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');
|
|
439
500
|
// init color calculations
|
|
440
501
|
this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
|
|
441
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));
|
|
442
503
|
},
|
|
443
504
|
update: function(position) {
|
|
444
|
-
|
|
445
|
-
return m+(
|
|
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)) });
|
|
446
507
|
},
|
|
447
508
|
finish: function() {
|
|
448
|
-
|
|
509
|
+
this.element.setStyle(Object.extend(this.oldStyle, {
|
|
449
510
|
backgroundColor: this.options.restorecolor
|
|
450
511
|
}));
|
|
451
512
|
}
|
|
452
513
|
});
|
|
453
514
|
|
|
454
|
-
Effect.ScrollTo =
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
document.documentElement.clientHeight : document.body.clientHeight);
|
|
469
|
-
this.scrollStart = Position.deltaY;
|
|
470
|
-
this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
|
|
471
|
-
},
|
|
472
|
-
update: function(position) {
|
|
473
|
-
Position.prepare();
|
|
474
|
-
window.scrollTo(Position.deltaX,
|
|
475
|
-
this.scrollStart + (position*this.delta));
|
|
476
|
-
}
|
|
477
|
-
});
|
|
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
|
+
};
|
|
478
529
|
|
|
479
530
|
/* ------------- combination effects ------------- */
|
|
480
531
|
|
|
481
532
|
Effect.Fade = function(element) {
|
|
482
|
-
|
|
533
|
+
element = $(element);
|
|
534
|
+
var oldOpacity = element.getInlineOpacity();
|
|
483
535
|
var options = Object.extend({
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
}, arguments[1] || {});
|
|
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] || { });
|
|
491
543
|
return new Effect.Opacity(element,options);
|
|
492
|
-
}
|
|
544
|
+
};
|
|
493
545
|
|
|
494
546
|
Effect.Appear = function(element) {
|
|
547
|
+
element = $(element);
|
|
495
548
|
var options = Object.extend({
|
|
496
|
-
from: (
|
|
549
|
+
from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
|
|
497
550
|
to: 1.0,
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
},
|
|
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] || { });
|
|
502
558
|
return new Effect.Opacity(element,options);
|
|
503
|
-
}
|
|
559
|
+
};
|
|
504
560
|
|
|
505
561
|
Effect.Puff = function(element) {
|
|
506
562
|
element = $(element);
|
|
507
|
-
var oldStyle = {
|
|
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
|
+
};
|
|
508
571
|
return new Effect.Parallel(
|
|
509
|
-
[ new Effect.Scale(element, 200,
|
|
510
|
-
{ sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
|
|
511
|
-
new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
|
|
512
|
-
Object.extend({ duration: 1.0,
|
|
513
|
-
beforeSetupInternal: function(effect) {
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
}, arguments[1] || {})
|
|
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] || { })
|
|
519
582
|
);
|
|
520
|
-
}
|
|
583
|
+
};
|
|
521
584
|
|
|
522
585
|
Effect.BlindUp = function(element) {
|
|
523
586
|
element = $(element);
|
|
524
|
-
|
|
525
|
-
return new Effect.Scale(element, 0,
|
|
526
|
-
Object.extend({ scaleContent: false,
|
|
527
|
-
scaleX: false,
|
|
587
|
+
element.makeClipping();
|
|
588
|
+
return new Effect.Scale(element, 0,
|
|
589
|
+
Object.extend({ scaleContent: false,
|
|
590
|
+
scaleX: false,
|
|
528
591
|
restoreAfterFinish: true,
|
|
529
|
-
afterFinishInternal: function(effect) {
|
|
530
|
-
|
|
531
|
-
|
|
592
|
+
afterFinishInternal: function(effect) {
|
|
593
|
+
effect.element.hide().undoClipping();
|
|
594
|
+
}
|
|
595
|
+
}, arguments[1] || { })
|
|
532
596
|
);
|
|
533
|
-
}
|
|
597
|
+
};
|
|
534
598
|
|
|
535
599
|
Effect.BlindDown = function(element) {
|
|
536
600
|
element = $(element);
|
|
537
|
-
var
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
setStyle(effect.element, {height: oldHeight});
|
|
553
|
-
}}
|
|
554
|
-
}, arguments[1] || {})
|
|
555
|
-
);
|
|
556
|
-
}
|
|
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
|
+
};
|
|
557
616
|
|
|
558
617
|
Effect.SwitchOff = function(element) {
|
|
559
618
|
element = $(element);
|
|
560
|
-
var oldOpacity =
|
|
561
|
-
return new Effect.Appear(element, {
|
|
619
|
+
var oldOpacity = element.getInlineOpacity();
|
|
620
|
+
return new Effect.Appear(element, Object.extend({
|
|
562
621
|
duration: 0.4,
|
|
563
622
|
from: 0,
|
|
564
623
|
transition: Effect.Transitions.flicker,
|
|
565
624
|
afterFinishInternal: function(effect) {
|
|
566
|
-
new Effect.Scale(effect.element, 1, {
|
|
625
|
+
new Effect.Scale(effect.element, 1, {
|
|
567
626
|
duration: 0.3, scaleFromCenter: true,
|
|
568
627
|
scaleX: false, scaleContent: false, restoreAfterFinish: true,
|
|
569
|
-
beforeSetup: function(effect) {
|
|
570
|
-
|
|
571
|
-
}
|
|
572
|
-
afterFinishInternal: function(effect) {
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
})
|
|
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
|
+
});
|
|
577
635
|
}
|
|
578
|
-
});
|
|
579
|
-
}
|
|
636
|
+
}, arguments[1] || { }));
|
|
637
|
+
};
|
|
580
638
|
|
|
581
639
|
Effect.DropOut = function(element) {
|
|
582
640
|
element = $(element);
|
|
583
641
|
var oldStyle = {
|
|
584
|
-
top:
|
|
585
|
-
left:
|
|
586
|
-
opacity:
|
|
642
|
+
top: element.getStyle('top'),
|
|
643
|
+
left: element.getStyle('left'),
|
|
644
|
+
opacity: element.getInlineOpacity() };
|
|
587
645
|
return new Effect.Parallel(
|
|
588
|
-
[ new Effect.
|
|
646
|
+
[ new Effect.Move(element, {x: 0, y: 100, sync: true }),
|
|
589
647
|
new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
|
|
590
648
|
Object.extend(
|
|
591
649
|
{ duration: 0.5,
|
|
592
|
-
beforeSetup: function(effect) {
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
}
|
|
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
|
+
};
|
|
599
658
|
|
|
600
659
|
Effect.Shake = function(element) {
|
|
601
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;
|
|
602
667
|
var oldStyle = {
|
|
603
|
-
top:
|
|
604
|
-
left:
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
}
|
|
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
|
+
};
|
|
621
685
|
|
|
622
686
|
Effect.SlideDown = function(element) {
|
|
623
|
-
element = $(element);
|
|
624
|
-
Element.cleanWhitespace(element);
|
|
687
|
+
element = $(element).cleanWhitespace();
|
|
625
688
|
// SlideDown need to have the content of the element wrapped in a container element with fixed height!
|
|
626
|
-
var oldInnerBottom =
|
|
627
|
-
var elementDimensions =
|
|
628
|
-
return new Effect.Scale(element, 100, Object.extend({
|
|
629
|
-
scaleContent: false,
|
|
630
|
-
scaleX: false,
|
|
631
|
-
scaleFrom: 0,
|
|
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,
|
|
632
695
|
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
|
|
633
696
|
restoreAfterFinish: true,
|
|
634
|
-
afterSetup: function(effect) {
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
if(window.opera)
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
afterFinishInternal: function(effect) {
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }}
|
|
649
|
-
}, arguments[1] || {})
|
|
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] || { })
|
|
650
711
|
);
|
|
651
|
-
}
|
|
652
|
-
|
|
712
|
+
};
|
|
713
|
+
|
|
653
714
|
Effect.SlideUp = function(element) {
|
|
654
|
-
element = $(element);
|
|
655
|
-
|
|
656
|
-
var
|
|
657
|
-
return new Effect.Scale(element, 0,
|
|
658
|
-
Object.extend({ scaleContent: false,
|
|
659
|
-
scaleX: false,
|
|
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,
|
|
660
721
|
scaleMode: 'box',
|
|
661
722
|
scaleFrom: 100,
|
|
723
|
+
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
|
|
662
724
|
restoreAfterFinish: true,
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
if(window.opera)
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
afterUpdateInternal: function(effect) {
|
|
670
|
-
|
|
671
|
-
(effect.dims[0] - effect.element.clientHeight) + 'px' });
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
}, arguments[1] || {})
|
|
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] || { })
|
|
678
740
|
);
|
|
679
|
-
}
|
|
741
|
+
};
|
|
680
742
|
|
|
681
|
-
// Bug in opera makes the TD containing this element expand for a instance after finish
|
|
743
|
+
// Bug in opera makes the TD containing this element expand for a instance after finish
|
|
682
744
|
Effect.Squish = function(element) {
|
|
683
|
-
return new Effect.Scale(element, window.opera ? 1 : 0,
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
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
|
+
}
|
|
690
753
|
});
|
|
691
|
-
}
|
|
754
|
+
};
|
|
692
755
|
|
|
693
756
|
Effect.Grow = function(element) {
|
|
694
757
|
element = $(element);
|
|
695
758
|
var options = Object.extend({
|
|
696
759
|
direction: 'center',
|
|
697
|
-
|
|
760
|
+
moveTransition: Effect.Transitions.sinoidal,
|
|
698
761
|
scaleTransition: Effect.Transitions.sinoidal,
|
|
699
762
|
opacityTransition: Effect.Transitions.full
|
|
700
|
-
}, arguments[1] || {});
|
|
763
|
+
}, arguments[1] || { });
|
|
701
764
|
var oldStyle = {
|
|
702
765
|
top: element.style.top,
|
|
703
766
|
left: element.style.left,
|
|
704
767
|
height: element.style.height,
|
|
705
768
|
width: element.style.width,
|
|
706
|
-
opacity:
|
|
769
|
+
opacity: element.getInlineOpacity() };
|
|
707
770
|
|
|
708
|
-
var dims =
|
|
771
|
+
var dims = element.getDimensions();
|
|
709
772
|
var initialMoveX, initialMoveY;
|
|
710
773
|
var moveX, moveY;
|
|
711
|
-
|
|
774
|
+
|
|
712
775
|
switch (options.direction) {
|
|
713
776
|
case 'top-left':
|
|
714
|
-
initialMoveX = initialMoveY = moveX = moveY = 0;
|
|
777
|
+
initialMoveX = initialMoveY = moveX = moveY = 0;
|
|
715
778
|
break;
|
|
716
779
|
case 'top-right':
|
|
717
780
|
initialMoveX = dims.width;
|
|
@@ -736,52 +799,52 @@ Effect.Grow = function(element) {
|
|
|
736
799
|
moveY = -dims.height / 2;
|
|
737
800
|
break;
|
|
738
801
|
}
|
|
739
|
-
|
|
740
|
-
return new Effect.
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
}
|
|
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
|
+
},
|
|
747
810
|
afterFinishInternal: function(effect) {
|
|
748
811
|
new Effect.Parallel(
|
|
749
812
|
[ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
|
|
750
|
-
new Effect.
|
|
813
|
+
new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
|
|
751
814
|
new Effect.Scale(effect.element, 100, {
|
|
752
|
-
scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
|
|
815
|
+
scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
|
|
753
816
|
sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
|
|
754
817
|
], Object.extend({
|
|
755
|
-
beforeSetup: function(effect) {
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
afterFinishInternal: function(effect) {
|
|
759
|
-
|
|
760
|
-
|
|
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
|
+
}
|
|
761
824
|
}, options)
|
|
762
|
-
)
|
|
825
|
+
);
|
|
763
826
|
}
|
|
764
827
|
});
|
|
765
|
-
}
|
|
828
|
+
};
|
|
766
829
|
|
|
767
830
|
Effect.Shrink = function(element) {
|
|
768
831
|
element = $(element);
|
|
769
832
|
var options = Object.extend({
|
|
770
833
|
direction: 'center',
|
|
771
|
-
|
|
834
|
+
moveTransition: Effect.Transitions.sinoidal,
|
|
772
835
|
scaleTransition: Effect.Transitions.sinoidal,
|
|
773
836
|
opacityTransition: Effect.Transitions.none
|
|
774
|
-
}, arguments[1] || {});
|
|
837
|
+
}, arguments[1] || { });
|
|
775
838
|
var oldStyle = {
|
|
776
839
|
top: element.style.top,
|
|
777
840
|
left: element.style.left,
|
|
778
841
|
height: element.style.height,
|
|
779
842
|
width: element.style.width,
|
|
780
|
-
opacity:
|
|
843
|
+
opacity: element.getInlineOpacity() };
|
|
781
844
|
|
|
782
|
-
var dims =
|
|
845
|
+
var dims = element.getDimensions();
|
|
783
846
|
var moveX, moveY;
|
|
784
|
-
|
|
847
|
+
|
|
785
848
|
switch (options.direction) {
|
|
786
849
|
case 'top-left':
|
|
787
850
|
moveX = moveY = 0;
|
|
@@ -798,38 +861,40 @@ Effect.Shrink = function(element) {
|
|
|
798
861
|
moveX = dims.width;
|
|
799
862
|
moveY = dims.height;
|
|
800
863
|
break;
|
|
801
|
-
case 'center':
|
|
864
|
+
case 'center':
|
|
802
865
|
moveX = dims.width / 2;
|
|
803
866
|
moveY = dims.height / 2;
|
|
804
867
|
break;
|
|
805
868
|
}
|
|
806
|
-
|
|
869
|
+
|
|
807
870
|
return new Effect.Parallel(
|
|
808
871
|
[ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
|
|
809
872
|
new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
|
|
810
|
-
new Effect.
|
|
811
|
-
], Object.extend({
|
|
812
|
-
beforeStartInternal: function(effect) {
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
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); }
|
|
817
880
|
}, options)
|
|
818
881
|
);
|
|
819
|
-
}
|
|
882
|
+
};
|
|
820
883
|
|
|
821
884
|
Effect.Pulsate = function(element) {
|
|
822
885
|
element = $(element);
|
|
823
|
-
var options = arguments[1] || {}
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
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}); }
|
|
831
896
|
}, options), {transition: reverser}));
|
|
832
|
-
}
|
|
897
|
+
};
|
|
833
898
|
|
|
834
899
|
Effect.Fold = function(element) {
|
|
835
900
|
element = $(element);
|
|
@@ -838,17 +903,226 @@ Effect.Fold = function(element) {
|
|
|
838
903
|
left: element.style.left,
|
|
839
904
|
width: element.style.width,
|
|
840
905
|
height: element.style.height };
|
|
841
|
-
|
|
842
|
-
return new Effect.Scale(element, 5, Object.extend({
|
|
906
|
+
element.makeClipping();
|
|
907
|
+
return new Effect.Scale(element, 5, Object.extend({
|
|
843
908
|
scaleContent: false,
|
|
844
909
|
scaleX: false,
|
|
845
910
|
afterFinishInternal: function(effect) {
|
|
846
|
-
new Effect.Scale(element, 1, {
|
|
847
|
-
scaleContent: false,
|
|
911
|
+
new Effect.Scale(element, 1, {
|
|
912
|
+
scaleContent: false,
|
|
848
913
|
scaleY: false,
|
|
849
|
-
afterFinishInternal: function(effect) {
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
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
|
+
};
|
|
854
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);
|