-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJSFX_FadingRollovers.js
413 lines (380 loc) · 11.4 KB
/
JSFX_FadingRollovers.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
/*******************************************************************
* File : JSFX_ImageFadeSwap.js © JavaScript-FX.com
* Created : 2001/08/31
* Author : Roy Whittle ([email protected]) www.Roy.Whittle.com
* Purpose : To create a more dynamic image swap using opacity
* History
* Date Version Description
* 2001-08-09 1.0 First version
* 2001-08-31 1.1 Got it working with NS6 - You must use opaque
* GIF's and use a STYLE attrib in the main
* HTML Page - Thanks Owl.
* 2001-08-31 1.2 Added different FadIn/FadeOut and converted
* all vars to JSFX name space.
* 2001-09-01 1.3 Make it so you only need one onMouseOver
* onMouseOut in the main document.
* 2001-09-09 1.4 Allow you to do a "Swap Other Image" so
* you can swap the same image with different pictures.
* 2001-09-17 1.5 Create the pre-loading object - just like
* simple rollovers and animated rollovers.
* allows for a similar interface to all.
* 2001-09-18 1.6 The code contains so much of SimpleRollovers that
* I added imgOn and imgOff so you can mix rollovers
* without having to include 2 ".js" files.
* 2002-02-08 1.7 If the ON image is already loaded don't reload it.
* This should help with the IE bug that reloads images
* from the server even though they are pre-cached.
* (will not work for swapping multiple pictures into same Image object)
* 2002-02-13 1.8 Corrected a bug in JSFX.findImg
* 2002-04-23 1.9 Write out the style tag.
* 2002-06-09 1.10 Attempt fix for IE on a Mac
* 2002-08-27 1.11 Fix a bug whereby opacity may go over 100 which
* may be causing a bug in IE6
* 2002-08-29 1.12 Thanks to piglet (http://homepage.ntlworld.com/thepiglet/)
* I now have a partial fix for NS7 and Mozilla 1.1.
***********************************************************************/
/****** User may alter these to change the fade effect ********/
var FadeInStep = 20;
var FadeOutStep = 20;
/****** Don't alter anything else **************/
document.write('<STYLE TYPE="text/css">.imgFader{ position:relative; filter:alpha(opacity=0); -moz-opacity:0.0 }</STYLE>');
if(!window.JSFX)
JSFX=new Object();
JSFX.RolloverObjects=new Array();
JSFX.Rollover = function(name, img)
{
JSFX.RolloverObjects[name]=new Image();
JSFX.RolloverObjects[name].img_src = img;
if(!JSFX.Rollover.postLoad)
JSFX.RolloverObjects[name].src = img;
}
JSFX.Rollover.postLoad = false;
JSFX.Rollover.loadImages = function()
{
var i;
for(i in JSFX.RolloverObjects)
{
r=JSFX.RolloverObjects[i];
r.src=r.img_src;
}
}
JSFX.Rollover.error = function(n)
{
alert("JSFX.Rollover - An Error has been detected\n"
+ "----------------------------------\n"
+ "You must define a JSFX.Rollover in your document\n"
+ "JSFX.Rollover(\""+n+"\",\"your_on_img.gif\")\n"
+ "(check the spelling of your JSFX.Rollovers)");
}
/*******************************************************************
*
* Function : getImg
*
* Description : In Netscape 4 images could be in layers so we might
* have to recurse the layers to find the image
*
*****************************************************************/
JSFX.getImg = function(n, d)
{
var img = d.images[n];
if(!img && d.layers)
for(var i=0 ; !img && i<d.layers.length ; i++)
img=JSFX.getImg(n,d.layers[i].document);
return img;
}
/*******************************************************************
*
* Function : findImg
*
* Description : gets the image from the document and reports an
* error if it cannot find it.
*
*****************************************************************/
JSFX.findImg = function(n, d)
{
var img = JSFX.getImg(n, d);
/*** Stop emails because the image was named incorrectly ***/
if(!img)
{
alert("JSFX.findImg - An Error has been detected\n"
+ "----------------------------------\n"
+ "You must define an image in your document\n"
+ "<IMG SRC=_your_image.ext/_.html NAME=\""+n+"\">\n"
+ "(check the NAME= attribute of your images)");
return(new Image());
}
return img;
}
JSFX.ImageFadeRunning=false;
JSFX.ImageFadeInterval=30;
/*******************************************************************
*
* Function : imgFadeIn
*
* Description : This function is based on the turn_on() function
* of animate2.js (animated rollovers from www.roy.whittle.com).
* Each image object is given a state.
* OnMouseOver the state is switched depending on the current state.
* Current state -> Switch to
* ===========================
* null -> OFF.
* OFF -> FADE_IN
* FADE_OUT -> FADE_IN
* FADE_OUT -> FADE_OUT_IN (if the new image is different)
* FADE_IN_OUT-> FADE_IN (if the image is the same)
*****************************************************************/
JSFX.imgFadeIn = function(img, imgSrc)
{
if(img)
{
if(img.state == null)
{
img.state = "OFF";
img.index = 0;
img.next_on = null;
}
if(img.state == "OFF")
{
/*** Vers 1.7 only load the ON image once ever ***/
if(img.src.indexOf(imgSrc) == -1)
img.src=imgSrc;
img.currSrc = imgSrc;
img.state = "FADE_IN";
JSFX.startFading();
}
else if( img.state == "FADE_IN_OUT"
|| img.state == "FADE_OUT_IN"
|| img.state == "FADE_OUT")
{
if(img.currSrc == imgSrc)
img.state = "FADE_IN";
else
{
img.next_on = imgSrc;
img.state="FADE_OUT_IN";
}
}
}
}
/*******************************************************************
*
* Function : imgFadeOut
*
* Description : This function is based on the turn_off function
* of animate2.js (animated rollovers from www.roy.whittle.com).
* Each image object is given a state.
* OnMouseOut the state is switched depending on the current state.
* Current state -> Switch to
* ===========================
* ON -> FADE_OUT.
* FADE_IN -> FADE_IN_OUT.
* FADE_OUT_IN -> FADE_IN. (after swapping to the next image)
*****************************************************************/
JSFX.imgFadeOut = function(img)
{
if(img)
{
if(img.state=="ON")
{
img.state="FADE_OUT";
JSFX.startFading();
}
else if(img.state == "FADE_IN")
{
img.state="FADE_IN_OUT";
}
else if(img.state=="FADE_OUT_IN")
{
img.next_on == null;
img.state = "FADE_OUT";
}
}
}
/*******************************************************************
*
* Function : startFading
*
* Description : This function is based on the start_animating() function
* of animate2.js (animated rollovers from www.roy.whittle.com).
* If the timer is not currently running, it is started.
* Only 1 timer is used for all objects
*****************************************************************/
JSFX.startFading = function()
{
if(!JSFX.ImageFadeRunning)
JSFX.ImageFadeAnimation();
}
/*******************************************************************
*
* Function : ImageFadeAnimation
*
* Description : This function is based on the Animate function
* of animate2.js (animated rollovers from www.roy.whittle.com).
* Each image object has a state. This function
* modifies each object and (possibly) changes its state.
*****************************************************************/
JSFX.ImageFadeAnimation = function()
{
JSFX.ImageFadeRunning = false;
for(i=0 ; i<document.images.length ; i++)
{
var img = document.images[i];
if(img.state)
{
if(img.state == "FADE_IN")
{
img.index+=FadeInStep;
if(img.index > 100)
img.index = 100;
if(img.filters)
img.filters.alpha.opacity = img.index;
else
img.style.MozOpacity = img.index/101;
if(img.index == 100)
img.state="ON";
else
JSFX.ImageFadeRunning = true;
}
else if(img.state == "FADE_IN_OUT")
{
img.index+=FadeInStep;
if(img.index > 100)
img.index = 100;
if(img.filters)
img.filters.alpha.opacity = img.index;
else
img.style.MozOpacity = img.index/101;
if(img.index == 100)
img.state="FADE_OUT";
JSFX.ImageFadeRunning = true;
}
else if(img.state == "FADE_OUT")
{
img.index-=FadeOutStep;
if(img.index < 0)
img.index = 0;
if(img.filters)
img.filters.alpha.opacity = img.index;
else
img.style.MozOpacity = img.index/101;
if(img.index == 0)
img.state="OFF";
else
JSFX.ImageFadeRunning = true;
}
else if(img.state == "FADE_OUT_IN")
{
img.index-=FadeOutStep;
if(img.index < 0)
img.index = 0;
if(img.filters)
img.filters.alpha.opacity = img.index;
else
img.style.MozOpacity = img.index/101;
if(img.index == 0)
{
img.src = img.next_on;
img.currSrc = img.next_on;
img.state="FADE_IN";
}
JSFX.ImageFadeRunning = true;
}
}
}
/*** Check to see if we need to animate any more frames. ***/
if(JSFX.ImageFadeRunning)
setTimeout("JSFX.ImageFadeAnimation()", JSFX.ImageFadeInterval);
}
/*******************************************************************
*
* Function : hasOpacity
*
* Description : Tests if the browser allows Opacity
*
*****************************************************************/
JSFX.hasOpacity = function(obj)
{
if(document.layers)
return false;
if(window.opera)
return false;
if(navigator.userAgent.toLowerCase().indexOf("firefox") != -1)
return true;
if(navigator.userAgent.toLowerCase().indexOf("camino") != -1)
return true;
if(navigator.userAgent.toLowerCase().indexOf("safari") != -1)
return false;
if(navigator.userAgent.toLowerCase().indexOf("konqueror") != -1)
return false;
if(navigator.userAgent.toLowerCase().indexOf("mac") != -1)
return false;
return true;
}
/*******************************************************************
*
* Function : fadeIn /fadeOut
*
* Description : Detects browser that can do opacity and fades the images
* For browsers that do not support opacity it just does an image swap.
* (I only know about NS4 but maybe IE on a Mac also ?)
* For these functions to work you need to name the image
* e.g. for an image named "home" you need
* <IMG .... NAME="home">
* and you need 2 images, the on and the off image
*****************************************************************/
JSFX.fadeIn = function(imgName, rollName)
{
if(rollName == null)
rollName=imgName;
/*** Stop emails because the rollover was named incorrectly ***/
if(!JSFX.RolloverObjects[rollName])
{
JSFX.Rollover.error(rollName);
return;
}
var img = JSFX.findImg(imgName, document);
if(JSFX.hasOpacity(img))
JSFX.imgFadeIn(img, JSFX.RolloverObjects[rollName].img_src);
else
{
if(img.offSrc==null)
img.offSrc=img.src;
img.src=JSFX.RolloverObjects[rollName].img_src;
}
}
JSFX.fadeOut = function(imgName)
{
var img = JSFX.findImg(imgName, document);
if(JSFX.hasOpacity(img))
JSFX.imgFadeOut(img);
else
img.src=img.offSrc;
}
/*******************************************************************
*
* Function : imgOn /imgOff
*
* Description : Included these functions so you can mix simple and
* fading rollovers without having to include 2 ".js" files
*
*****************************************************************/
JSFX.imgOn = function(imgName, rollName)
{
if(rollName == null)
rollName=imgName;
/*** Stop emails because the rollover was named incorrectly ***/
if(!JSFX.RolloverObjects[rollName])
{
JSFX.Rollover.error(rollName);
return;
}
var img = JSFX.findImg(imgName,document);
if(img.offSrc==null)
img.offSrc=img.src;
img.src=JSFX.RolloverObjects[rollName].img_src;
}
JSFX.imgOff = function(imgName)
{
var img = JSFX.findImg(imgName,document);
img.src=img.offSrc;
}