if(typeof console == 'undefined') {
	console = {};
	console.log = function() {};
}

function fileQueueError(file, errorCode, message) {
	try {
		var imageName = "error.gif";
		var errorName = "";
		if (errorCode === SWFUpload.errorCode_QUEUE_LIMIT_EXCEEDED) {
			errorName = "You have attempted to queue too many files.";
		}

		if (errorName !== "") {
			alert(errorName);
			return;
		}

		switch (errorCode) {
		case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
			imageName = "zerobyte.gif";
			break;
		case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
			imageName = "toobig.gif";
			break;
		case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
		case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
		default:
			console.log(message, errorCode);
			
			break;
		}

	} catch (ex) {
		this.debug(ex);
	}

}

function fileDialogComplete(numFilesSelected, numFilesQueued) {
	try {
		if (numFilesQueued > 0) {
			this.startUpload();
		}
	} catch (ex) {
		this.debug(ex);
	}
}

function uploadProgress(file, bytesLoaded) {
	
	try {
		var percent = Math.ceil((bytesLoaded / file.size) * 100);

		var progress = new FileProgress(file,  this.customSettings.upload_target);
		progress.setProgress(file, percent);
		if (percent === 100) {
			progress.setStatus("...");
			progress.toggleCancel(false, this);
		} else {
			progress.setStatus("Uploading...");
			progress.toggleCancel(true, this);
		}
	} catch (ex) {
		this.debug(ex);
	}
}

function uploadSuccess(file, serverData) {
	
	try {
		var progress = new FileProgress(file,  this.customSettings.upload_target);

		try {
			eval('var json = ' + serverData + ';');
		} catch(ex) {
			progress.setStatus("Error.");
			progress.toggleCancel(false);
			return;
		}
		
		switch(json.responseType) {
		case 'error':
			alert('error: '+json.message);
			this.UPLOAD_ERROR_HAPPENED = true;
			progress.setError();
			progress.setStatus(json.message);
			progress.toggleCancel(false);
			
			break;
        case 'success':
		default:
		json = json.data;
		progress.setStatus("File Uploaded.");
		progress.toggleCancel(false);
		
		/** @todo show preview */
		var newFile = $('<div class="uploadedFile" id="' + json.file_name + '"> \
			<input type="hidden" name="uploads[]" value="' + json.file_name + '" /> \
			<span class="name">' + json.original_file_name +'</span> \
			<span class="delete">Delete</span><div style="clear:both;"></div></div>'
		);
		 
		if(json.thumbnail !== null) {
			newFile.prepend($('<img src="'+json.thumbnail+'" alt="' + json.file_name + '" />'));
		}
		
		newFile.find('span.delete').click(function(){
			var field = $(this).siblings(':hidden');
			field.attr('name', 'uploads_deleted[]');
			$(this).parent().hide();
			
			if($('#uploadedFiles div.uploadedFile:visible').length == 0) {
				var p = $('#divFileProgress');
				p.get(0).firstChild.className ='progressContainer noFiles';
				p.find('.progressName').text(' ');
				p.find('.progressBarStatus').text('No files have been uploaded.');
				
				$('#uploadedFiles').hide();

			}
		});

		$('#uploadedFiles').show().append(newFile);
	} //end switch

	} catch (ex) {
		this.debug(ex);
	}
}

function uploadComplete(file) {
	try {
		if(!this.UPLOAD_ERROR_HAPPENED) {
			/*  I want the next upload to continue automatically so I'll call startUpload here */
			if (this.getStats().files_queued > 0) {
				this.startUpload();
			} else {
				var progress = new FileProgress(file,  this.customSettings.upload_target);
				progress.setComplete();
				progress.setStatus("All files received.");
				progress.toggleCancel(false);
			}
		}
	} catch (ex) {
		this.debug(ex);
	}
}

function uploadError(file, errorCode, message) {
	//console.log(message, errorCode);

	var progress;
	try {

		progress = new FileProgress(file,  this.customSettings.upload_target);
		progress.setError();
		progress.setStatus(message);
		progress.toggleCancel(false);


	} catch (ex3) {
		this.debug(ex3);
	}

}



/* ******************************************
 *	FileProgress Object
 *	Control object for displaying file info
 * ****************************************** */

function FileProgress(file, targetID) {
	$("#divFileProgress, #divFileProgressContainer").show();
	this.fileProgressID = "divFileProgress";
	
	this.fileProgressWrapper = $('#' + this.fileProgressID);

	this.fileElement = $('#fileElement');
	this.progressCancel = this.fileElement.find('.progressCancel'); 
	this.progressName = this.fileElement.find('.progressName'); 
	this.progressSpeed = this.fileElement.find('.progressSpeed'); 
	this.progressBarStatus = this.fileElement.find('.progressBarStatus');
	this.progressBar = $('#progressBar');
	
	
	this.progressName.text(file.name);
	this.height = this.fileProgressWrapper.offsetHeight;

} 
FileProgress.prototype.setProgress = function (file, percentage) {
	var speed = ''+Math.ceil(((file.movingAverageSpeed / 1024) /8))+ 'kB/s';
	var time = SWFUpload.speed.formatTime(file.timeRemaining);
	this.progressSpeed.html('<span class="speed">Avg. upload speed: '+speed+'</span><span class="time">Est. time remaining: '+time+'</span>');

	this.fileElement.attr('class', "progressContainer uploading");
	this.progressBar.attr('class', "progressBarInProgress")
					.css({width: percentage + "%"});
};
FileProgress.prototype.setComplete = function () {
	this.fileElement.attr('class', "progressContainer complete");
	this.progressBar.attr('class', "progressBarComplete")
					.css({width: 0});

};
FileProgress.prototype.setError = function () {
	this.fileElement.attr('class', "progressContainer error");
	this.progressBar.attr('class', "progressBarError")
					.css({width: 0});
};
FileProgress.prototype.setCancelled = function () {
	this.fileElement.attr('class', "progressContainer");
	this.progressBar.attr('class', "progressBarError")
					.css({width: 0});

};
FileProgress.prototype.setStatus = function (status) {
	this.progressBarStatus.html(status);
};

FileProgress.prototype.toggleCancel = function (show, swfuploadInstance) {
	this.progressCancel.get(0).style.visibility = show ? "visible" : "hidden";
	if (swfuploadInstance) {
		var fileID = this.fileProgressID;
		this.progressCancel.get(0).onclick = function () {
			swfuploadInstance.cancelUpload(fileID);
			return false;
		};
	}
};
