Ok, code explanation:
First, Flash defines the functions:
[AS]function continueFade(mc, speed) {…}
fadeMC(mcnr, speed) {…}
function fadeOut(startboxnr,speed) {…}[/AS]
After that, it creates the boxes:
[AS]
for (i=1; i<=20; i++) {
_root.box._visible = false;
duplicateMovieClip(_root.box, “box”+i, i);
_root[“box”+i]._x = 17i;
}
[/AS]
The boxes will have the instance names box1,box2,box3,… until box20. And, the x position of box i equals 17i. So it takes box i, and sets its _x value to 17*i. And that, it does for each box.
Then, it calls the function fadeOut with the vars 1 and 10, where one is the number of the box to start fading at and 10 is the speed of fading. A higher number will make them fade faster.
[AS]
fadeOut(1, 10);
[/AS]
Flash enters the function fadeOut, and calls the function fadeMC with the same vars (1 and 10).
[AS]
function fadeOut(startboxnr, speed) {
fadeMC(startboxnr, speed);
}[/AS]
Flash enters the function fadeMC with the values it got from fadeOut, which are the values fadeOut received.
[AS]
function fadeMC(mcnr, speed) {
[/AS]
_root[“box”+mcnr] is the path to the mc with the instance name “box”+mcnr, where mcnr is the value received from fadeOut.
So that box, here it’s still box1, since the var received is 1. So onEnterFrame box1 calls an anonymous function.
[AS]
_root[“box”+mcnr].onEnterFrame = function() {
[/AS]
It decreases the alpha value of box+mcnr (so still box1) with the value received ‘speed’. This is 10, since we assigned that value to it when we called fadeOut. This line is in the anonymous onEnterFrame function.
[AS]
_root[“box”+mcnr]._alpha -= speed;
[/AS]This is also in the onEnterFrame function. It checks if _alpha is equal or less than 50, and if so, it sets the onEnterFrame of the _root.box+mcnr (which is still box1 because mcnr is still 1) to null, which is basically the same as delete _root[“box”+mcnr].onEnterFrame.
Then it calls the function continueFade with the functions _root[“box”+mcnr"] (so the current box) and speed (still 10). Then it increases mcnr with one. While this is done, continueFade is running. I think you can figure that one out yourself, so I wont be explaining it. And then, it calls fadeOut with the values mcnr+1 and speed, which will do this whole explanation over only with _root.box2. And, it ends the anonymous onEnterFrame function.
[AS]
if (_root[“box”+mcnr]._alpha<=50) {
_root[“box”+mcnr].onEnterFrame = null;
continueFade(_root[“box”+mcnr], speed);
mcnr += 1;
fadeOut(mcnr, speed);
}
};
}
[/AS]
About the continuefade: the system actually works like this: it decreases the value of the currentbox (let’s take for example box4 as the currentbox) to 50, and then starts decreasing box5 to 50, but before it does that, it calls continuefade, which will make box4 fade out completely. And so, we have what you wanted 
Also, notice: I always used _root[“box”+mcnr].onEnterFrame. I can’t really explain good, but this is what happens to the onEnterFrames, maybe that will give you an idea of what I mean.
Let’s say the currentbox is one.
_root.box1.onEnterFrame is created.
_root.box1.onEnterFrame is deleted (=null)
The above is the essential part: _root.box1.onEnterFrame is emptied. In continuefade, I redefine it because it has to continue fading, but in continuefade it has to be currentbox.onEnterFrame, otherwise another mc would fade. That’s why I always use _root[“box”+mcnr].onEnterFrame.