Jumpy progress bar during upload

Here’s a screencast of my uploader in progress -

You’ll notice that the progress bar jumps all over the place during upload.
Is it trying to show the progress for each individual files rather than all the files at a whole?

I’m not thinking its the latter, because you’ll notice its set to put a green check next to a file when a file is done. However the jumpyness of the progress bar and when the checks appear aren’t syncing.


import flash.net.FileReferenceList;
import flash.net.FileReference;

var listener:Object = new Object();


fileList._x = browseButton._x + 20;
fileList._y = browseButton._y + 30;

progress._visible = false;
uploadButton._alpha = 25;

_global.yCounter = browseButton._y;

// dont let uploadButton work at start...only enable once browse has been called
uploadButton.enabled = false;

// holds the list of files
_global.files = new Array();



listener.onSelect = function(fileRefList:FileReferenceList) {
	
	uploadButton.enabled = true;
	uploadButton._alpha = 100;
	
	// clear all the old checks if we had just done an upload
	for(i=0; i < _global.howManyChecksToClear; i++) {
		removeMovieClip("done_"+i);
	}
	
	// fileRefList.fileList == what was just selected in the browse window
	// concatenate that to our existing list of files
	// because array files should hold all the files
	var list:Array = fileRefList.fileList;
	_global.files = _global.files.concat(list);
	
	// a file reference holds information about a file from the fileList (ex name, size?)
	
	
	
	// clear the file list text box so we can reprint everything
	fileList.text = "";
	
	// go through the files
	for (i = 0; i<_global.files.length; i++) {
		
		var item:FileReference;

		// put file in item
		item = _global.files*;
		
		// have to call this AFITER item has file - otherwise the first one will be undefined
		trace(item.addListener(this));
		
		// print the name of that file
		fileList.text += item.name+"
"; // print files on screen
		
		// create a new delete button
		var newDeleteButton = _root.attachMovie("deleteButton", "box_"+i, i);
		newDeleteButton.id = i;
		newDeleteButton._y =fileList._y + (i*17); // this started at the y pos of the browse button (to line things up)
		newDeleteButton._x = fileList._x - 13; // static
		
		// DELETE FILE
		// 1. clear the file display list
		// 2. remove item from array
		// 3. reprint list of files
		// 4. get rid of its "x" delete button
		newDeleteButton.onRelease = function() {
			// clear our display list of files
			fileList.text = "";

			// take out this file from our array of files
			_global.files.splice(this.id,1);
			
			// reprint our list of files
			for (var i = 0; i<_global.files.length; i++) {
				item = _global.files*;
				fileList.text += item.name+"
";
				
			}
			// get rid of the x
			removeMovieClip("box_"+i);
			
			
			
		};
		
		
		
			
	}
};

//listener.onProgress = function(file:FileReference, bytesLoaded:Number, bytesTotal:Number):Void {
 //   trace("onProgress with bytesLoaded: " + bytesLoaded + " bytesTotal: " + bytesTotal);
//}



listener.onProgress = function(file:FileReference, bytesLoaded:Number, bytesTotal:Number):Void {
	// only show the progress bar if files are big enough to reach onProgress function
	progress._visible = true;
	progress.mode = "manual";
	progress.setProgress(bytesLoaded, bytesTotal);
	trace("bytesLoaded: " + bytesLoaded + " bytesTotal: " + bytesTotal);
	
	
	if(bytesLoaded < (bytesTotal*.25) && bytesLoaded > (bytesTotal*.10)) {
		uploadStatus.text = "Pretty snazzy image you're uploading there.";
		
	}
	
	if(bytesLoaded < (bytesTotal*.50) && bytesLoaded >= (bytesTotal*.25)) {
		uploadStatus.text = "This will totally be worth the wait.";
		
	}
	
	
	if(bytesLoaded < (bytesTotal*.75) && bytesLoaded >= (bytesTotal*.50)) {
		uploadStatus.text = "Almost there...!";
		
	}
	
	
	
	if(bytesLoaded == bytesTotal) {
		uploadStatus.text = "Just about done! Give us a couple more seconds to wrap things up";
		progress.setProgress(99, 100);
	}
	
}


listener.onComplete = function(file:FileReference):Void  {
	
	
	/// check marks
	
	i = _global.fileCount;
	_global.fileCount ++;
	var newDoneIcon = _root.attachMovie("doneIcon", "done_"+i, i);
	newDoneIcon.id = i;
	newDoneIcon._y = fileList._y + (i*17); // this started at the y pos of the browse button (to line things up)
	newDoneIcon._x = fileList._x - 13; // static
	
	trace("onComplete: "+file.name);	
	
	
	// WHEN ALL FILES ARE DONE
	if(i == (_global.files.length - 1)) {
		trace("ALL FILES HAVE BEEN UPLOADED");
		
		var sendVars:LoadVars = new LoadVars();
		for (var i:Number = 0; i<_global.files.length; i++) {
			var item:FileReference;
			item = _global.files*;
			
			// weird workaround for first file being undefined...
			// have to use == instead of += for first one
			if(i==0) {
				sendVars.files = item.name + ":";
			}
			else {
				sendVars.files += item.name;
				sendVars.files += ":";
			}
			
			
		}
		
		sendVars.howManyFiles = _global.files.length;
		
		
		sendVars.send("http://photojojo.com/imageEditor/vinyls/showAll.php", "_self", "POST");
		
	
	
		// now clear the list since we're all done uploading.
		_global.files.splice(0);
	}
	
	
};







listener.onHTTPError = function(file:FileReference, httpError:Number):Void {
    trace("HTTP Error :" + httpError);
    // Write code here to do corrective actions
}


listener.onIOError = function(file:FileReference):Void {
    trace("An IO Error occured");
}

listener.onSecurityError = function(file:FileReference, errorString:String):Void {
   trace("SecurityError: " + file.name + " ErrorString: " + errorString);
}





var fileRef:FileReferenceList = new FileReferenceList();
fileRef.addListener(listener);

browseButton.onRelease = function() {
	upload.enabled = true;
	fileRef.browse([{description:"Image files", extension:"*.jpg;*.gif;*.png"}]);
};

uploadButton.onRelease = function() {
	
	// go through the array of files uploading each one
	this.enabled = false;
	
	
	
	// clear fileCount - used in onComplete for putting checks
	_global.fileCount = 0;
	
	for (var i:Number = 0; i<_global.files.length; i++) {
		item = _global.files*;
		trace("uploadButtonRelease: " + item.name);
		item.upload("upload.php");
		
		// get rid of delete x icons
		removeMovieClip("box_"+i);
		
		
		
	}
	
	// before we clear the file list, get how long it is - this is how many checks we'll have to delete next time they click "browse"
	_global.howManyChecksToClear = _global.files.length;
	
	
	// before we delete file list, make a copy of it for other functions
	
	
	// moved this to onProgress
	// now clear the list since we're all done uploading.
	//_global.files.splice(0);
	
	
};