localSuffix = 1;
/*
 * @return the form element
 */
uploadForm = function (myClass, folder, bigFormSubmit, errorMsg, name, multiplemode, value) {
	var sfx = localSuffix++; // garantisce un suffisso unico nella pagina
	var upEl = document.createElement("div");
	Element.addClassName(upEl, myClass);
	
	var frameStr = '<iframe id="uploadTrg'+sfx+'" name="uploadTrg'+sfx+'" height="0" width="0" frameborder="0" scrolling="yes">';
	frameStr += '</iframe>';
	upEl.innerHTML = frameStr;
	var frame = upEl.firstChild;
	
	var initIframe = function () {
		if (typeof value != 'undefined') setFrameContent(frame, value);
		handleUploadFinished(bigFormSubmit, sfx, folder);
		Event.stopObserving(frame, 'load', initIframe);
		Event.observe(frame, 'load', function(){handleUploadFinished(bigFormSubmit, sfx, folder);})
	}
	Event.observe(frame, 'load', initIframe);
	
		var formStr = '<form id="fileuploadform'+sfx+'" enctype="multipart/form-data" method="post" action="/servlet/upload" target="uploadTrg'+sfx+'"></form>';
		new Insertion.Bottom(upEl, formStr);
		var form = upEl.lastChild;
				
			var divErr = document.createElement('div');
			Element.addClassName(divErr, 'error_message');
			divErr.setStyle({display: 'none'});
			divErr.innerHTML = errorMsg;
			form.appendChild(divErr);
			
			var inputFile = document.createElement('input');
			inputFile.setAttribute('type', 'file');
			inputFile.setAttribute('id', name);
			inputFile.setAttribute('name', name);
			Event.observe(inputFile, 'change', function() {
													if (multiplemode)
														upEl.parentNode.appendChild(uploadForm(myClass, folder, bigFormSubmit, errorMsg, name, multiplemode));
													uploadFile(form, bigFormSubmit);
													return false;
												});
			form.appendChild(inputFile);
	
			var inputFolder = document.createElement('input');
			inputFolder.setAttribute('type', 'hidden');
			inputFolder.setAttribute('id', 'folder');
			inputFolder.setAttribute('name', 'folder');
			inputFolder.setAttribute('value', folder);
			form.appendChild(inputFolder);
		upEl.appendChild(form);		
		
		var uploaded = document.createElement('div');
		uploaded.setAttribute('id', 'fileuploaded' + sfx);
		Element.setStyle(uploaded, {display: 'none'});
			var checkStr = '<input type="checkbox" checked="checked" id="deletefileuploaded'+sfx+'" name="deletefileuploaded'+sfx+'"/>';
			new Insertion.Bottom(uploaded, checkStr);
			var check = uploaded.lastChild;
			
			Event.observe(check, 'click', function (){
												deleteFile(folder + '/' + frameContent(frame), sfx, multiplemode);
												Event.stop(arguments[0]);
												return false;
											});
			uploaded.appendChild(check);
			
			var fileName = document.createElement('span');
			fileName.setAttribute('id', 'filename' + sfx);
				var fileLink = document.createElement('a');
				fileLink.setAttribute('target', '_blank');
				fileLink.setAttribute('href', '');
				fileName.appendChild(fileLink);
			uploaded.appendChild(fileName);
		upEl.appendChild(uploaded);
	return upEl;
}

handleUploadFinished = function (bigFormSubmit, suffix, folder){
	if (frameContent('uploadTrg'+suffix) == '') return;
	bigFormSubmit.disabled = null;
	if (frameContent('uploadTrg'+suffix) == 'error') {
		var mess = $$('#fileuploadform'+suffix+' .error_message');
		mess = $A(mess);
		Element.show(mess[0]);
		Form.reset($('fileuploadform'+suffix));
		Form.enable($('fileuploadform'+suffix));
	} else {
		Form.reset($('fileuploadform'+suffix));
		Form.enable($('fileuploadform'+suffix));
		Element.hide($('fileuploadform'+suffix));
		$('filename'+suffix).firstChild.href = '/servlet/download/' + folder + '/' + frameContent('uploadTrg'+suffix);
		$('filename'+suffix).firstChild.innerHTML = removeDate(frameContent('uploadTrg'+suffix));
		$('fileuploaded'+suffix).show();
	}
}

/* @param form form di invio file
 * @param bigFormSubmit submit della form che rimane in attesa della fine dell'upload
 */
uploadFile = function (form, bigFormSubmit) {
	form.submit();
	Form.disable(form);
	bigFormSubmit.disabled = "disabled";
}

deleteFile = function (filename, suffix, multiplemode) {
	var pars = 'fileDelendum=' + filename;
	eraseFrameContent('uploadTrg'+suffix);
	$('fileuploaded'+suffix).hide();
	if (!multiplemode)
		$('fileuploadform'+suffix).show();
	/*new Ajax.Request(
		'/servlet/delete', 
		{
			method: 'post',
			parameters: pars,
			onComplete: restoreForm
		});
	*/
}

/*
 * Toglie da una stringa (generalmente il nome di un file) il timestamp iniziale.
 */
removeDate = function (str) {
	return str.replace(/^\d{12,12}-/g, '');
}

/* Get content of a frame.
 * The first 5 characters and the last 6 are relative to the open and close tag <pre> and </pre>
 * inserted in the frame due to an internet explorer 6 bug which collapse the white spaces.
 * @param frame: frame element or frame name
 * @see setFrameContent
 * @see eraseFrameContent
 */
frameContent = function (frame) {
	if (typeof frame == 'string')
		frame = $(frame);
	var ret = '';
	if (frame.contentDocument) {
		ret = frame.contentDocument.body.innerHTML;
	} else {
		ret = document.frames[frame.name].document.body.innerHTML;
	}
	return ret.substring(5, ret.length - 6);
}
/* Erase content of a frame
 * @param frame: frame element or frame name
 * @see setFrameContent
 * @see frameContent
 */
eraseFrameContent = function (frame) {
	setFrameContent(frame, '');
}
/* Set the content of a frame
 * The <pre> tag is inserted due to a IE bug concerning collapsing white spaces.
 * @see frameContent
 * @see eraseFrameContent
 */
setFrameContent = function (frame, htmlStr) {
	if (typeof frame == 'string')
		frame = $(frame);
	if (frame.contentDocument) {
		var frameDoc = frame.contentDocument;
	} else {
		var frameDoc = document.frames[frame.name].document;
	}
	frameDoc.body.innerHTML = '<pre>' + htmlStr + '</pre>';
}

uploadFormContent = function (className) {
	var arr = $A($$('.' + className));
	var ret = Array();
	arr.each(function(el){
				var n = frameContent(el.firstChild);
				if (n != '') ret.push(n);
			});
	return ret;
}
