/**
 * This is a mutex (semaphore) for sending the formular. Its important since
 * without the mutex, the form will be sent immediately and skips some files queued from upload
 */
var uploadInProgress = false;
var globalSwf;

/**
 * When an error occures while queue a file, this function is beeing called
 * 
 * @param fileObj
 * @param error_code
 * @param message
 */
function fileQueueError(fileObj, error_code, message)  {
	try {
		// Handle this error separately because we don't want to create a FileProgress element for it.
		switch(error_code) {
			case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:
				alert("You have attempted to queue too many files.\n" + (message == 0 ? "You have reached the upload limit." : "You may select " + (message > 1 ? "up to " + message + " files." : "one file.")));
				return;
				break;
			case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
				alert("Die ausgewählte Datei ist zu groß.");
				this.debug("Error Code: File too big, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
				return;
				break;
			case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
				alert("Die ausgewählte Datei hat keinen Inhalt.  Bitte wählen Sie eine andere aus.");
				this.debug("Error Code: Zero byte file, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
				return;
				break;
			case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
				alert("Die ausgewählte Datei ist nicht vom gew�nschten Dateityp.");
				this.debug("Error Code: Invalid File Type, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
				return;
				break;
			default:
				alert("Beim Hochladen der Dateien ging etwas schief. Bitte versuchen Sie es sp�ter noch einmal.");
				this.debug("Error Code: " + error_code + ", File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
				return;
				break;
		}
	} catch (e) {}
}

/**
 * Get the textFileName-Object for this swf uploader
 * 
 * @param fileObj
 * @returns object
 */
function getTxtFileNameObject(fileObj) {
	var idTokens, objectId;
	
	// Ermitteln der Object-Id vom Uploader
	idTokens = fileObj.id.split("_");
	objectId = idTokens[0] + '_' + idTokens[1];
	
	// Vorheriges Textfeld ist Uploader-Textfeld
	return $("#" + objectId).prev();
}

/**
 * Get the identification string for this swf uploader
 * 
 * @param fileObj
 * @returns string
 */
function getInstanceId(fileObj) {
	var txtFile, attribTokens;
	
	txtFile = getTxtFileNameObject(fileObj);
	attribTokens = $(txtFile).attr("id").split("_");
	
	return attribTokens[1];
}

/**
 * Get the object for the hidden file field for this swf uploader
 * 
 * @param fileObj
 * @returns object
 */
function getHidFileObject(fileObj) {
	var idTokens, objectId, html;
	
	idTokens = fileObj.id.split("_");
	objectId = idTokens[0] + '_' + idTokens[1];
	
	//next field is hidFile
	html = $('#' + objectId).next().html();
	
	return $(html).first();
}

/**
 * When a file is queued, then it will be linked into the file list here
 * 
 * @param fileObj
 */
function fileQueued(fileObj) {
	try {
		var txtField, listitem, id, self = this;
			
		txtField = getTxtFileNameObject(fileObj);
		txtField.val(fileObj.name);

		id = getInstanceId(fileObj);
		
		listitem = "<li>" +
				"		<input id='inputFileList_" + id + fileObj.id + "' type='text' name=" + fileObj.id + " value='" + fileObj.name + "' />" +
				"			<div class='progressbar' id='fsUploadProgressBar_" + fileObj.id + "'>" +
				"				<span class='progressbarinfo' id='fsUploadProgressBarInfo_" + fileObj.id + "' />" +			
				"			</div>" +
				"	</li>";
		$('#log_' + id).append(listitem);
		$('#inputFileList_' + id + fileObj.id).bind('change', function(e) {
			var newname = $('#inputFileList_' + id + fileObj.id).val();
			self.addFileParam(fileObj.id, "NewFileName", newname);
    	});
		
	} catch (e) { 
		console.log(e); 
	}

}

/**
 * 
 * @param numFilesUploaded
 */
function queueComplete(numFilesUploaded) {
	var status = document.getElementById("divStatus");
	status.innerHTML = numFilesUploaded + " file" + (numFilesUploaded === 1 ? "" : "s") + " uploaded.";
	console.log("queueComplete");
}

/**
 * Draw the progress bar, this function will be called multiple times
 * 
 * @param fileObj
 * @param bytesLoaded
 * @param bytesTotal
 */
function uploadProgress(fileObj, bytesLoaded, bytesTotal) {
	uploadInProgress = true;
	$('#senden').attr("disabled", "true");
	try {
		var percent = Math.ceil((bytesLoaded / bytesTotal) * 100);
		$('#fsUploadProgressBar_'+fileObj.id).css('width', (percent /100 *98) + '%');
		$('#fsUploadProgressBarInfo_'+fileObj.id).html(percent + "%");
	}
	catch (e) { 
		//
	}
}

/**
 * 
 * @param fileObj
 * @param server_data
 */
var uploadSuccess = function(fileObj, server_data, receivedResponse) {
	// load up further files from queue
	generateUploadFolder(this);
}

/**
 * 
 * @param file
 */
function uploadComplete(file) {
	generateUploadFolder(this);
	// unset the mutex!
	$(window).unbind("beforeunload");
	$('#mainForm').unbind('submit');
	$('#mainForm').submit();
	uploadInProgress = false;
}

/**
 * 
 * @param fileObj
 * @param error_code
 * @param message
 */
function uploadError(fileObj, error_code, message) {
	try {
		var txtFileName = getTxtFileNameObject(fileObj);
		txtFileName.val("");
		validateForm();
		
		// Handle this error separately because we don't want to create a FileProgress element for it.
		switch(error_code) {
			case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:
				alert("There was a configuration error.  You will not be able to upload a resume at this time.");
				this.debug("Error Code: No backend file, File name: " + file.name + ", Message: " + message);
				return;
				break;
			case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
				alert("You may only upload 1 file.");
				this.debug("Error Code: Upload Limit Exceeded, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
				return;
				break;
			case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
			case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
				break;
			default:
				alert("An error occurred in the upload. Try again later.");
				this.debug("Error Code: " + error_code + ", File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
				return;
				break;
		}

		fileObj.id = "singlefile";	// This makes it so FileProgress only makes a single UI element, instead of one for each file
		var progress = new FileProgress(fileObj, this.customSettings.progress_target);
		progress.SetError();
		progress.ToggleCancel(false);

		switch(error_code) {
			case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:
				progress.SetStatus("Upload Error");
				this.debug("Error Code: HTTP Error, File name: " + file.name + ", Message: " + message);
				break;
			case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:
				progress.SetStatus("Upload Failed.");
				this.debug("Error Code: Upload Failed, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
				break;
			case SWFUpload.UPLOAD_ERROR.IO_ERROR:
				progress.SetStatus("Server (IO) Error");
				this.debug("Error Code: IO Error, File name: " + file.name + ", Message: " + message);
				break;
			case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:
				progress.SetStatus("Security Error");
				this.debug("Error Code: Security Error, File name: " + file.name + ", Message: " + message);
				break;
			case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
				progress.SetStatus("Upload Cancelled");
				this.debug("Error Code: Upload Cancelled, File name: " + file.name + ", Message: " + message);
				break;
			case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
				progress.SetStatus("Upload Stopped");
				this.debug("Error Code: Upload Stopped, File name: " + file.name + ", Message: " + message);
				break;
		}
	} catch (e) {}
}


/**
 * When the file dialog is beeing closed, this function is called
 * 
 * @param numFilesSelected
 * @param numFilesQueued
 */
function fileDialogComplete(numFilesSelected, numFilesQueued) {
	try {
		var self = this;
		globalSwf = self;
	
		/* I want auto start the upload and I can do that here */
//		$('#senden')
//			.unbind('click', function() {
//				generateUploadFolder(self);
//			})
//			.bind('click', function () {
//				generateUploadFolder(self);
//		});
		
		//this.startUpload();
	}
	catch (ex)  {
        this.debug(ex);
	}
}

/**
 * 
 * This callback function is called any time, a file starts its upload
 * 
 * @param swf
 */
function generateUploadFolder(swf) {
	var name,
		filename,
		phpSessId;
	
	name = $('#UploadCenter-kunde').val();
	if (name === '') {
		return false;
	}
	
	phpSessId = $('#UploadCenter-phpsessid').val();
	filename = $('input[id^="txtFileName"]').val();
	
	$('#UploadCenter-filename').val(filename);
	
	swf.setPostParams({"name" : name,
					   "filename" : filename,
					   "uniqueId" : phpSessId});
	
	swf.startUpload();
}
 
/**
 * 
 * @param file
 * @returns {Boolean}
 */
function uploadStart(file) {
	try {
		/* I don't want to do any file validation or anything,  I'll just update the UI and
		return true to indicate that the upload should start.
		It's important to update the UI here because in Linux no uploadProgress events are called. The best
		we can do is say we are uploading.
		 */
		var progress = new FileProgress(file, this.customSettings.progressTarget);
		progress.setStatus("Uploading...");
		progress.toggleCancel(true, this);
	}
	catch (ex) {}
	
	return true;
}
