var uploadForm = Class.create();
uploadForm.prototype =
{
	initialize: function(fieldContainer, listContainer, statusContainer)
	{
		this.fieldContainer = $(fieldContainer);
		this.listContainer = $(listContainer);
		this.statusContainer = $(statusContainer);
		this.statusContainer.innerHTML = 'Click on Browse to select a image. Click browse again to add more images.';
		this.fieldCount = 0;
		this.selectedFiles = new Array();
		this.options = new Array();
		this.setOptions({iconURL:'', fieldSize:40, allowedTypes:new Array(), publicUploader:false});
		this.zipWarning = false;
	},

	display: function()
	{
		this.addField();
	},

	setOptions: function(options)
	{
		Object.extend(this.options, options || {});
	},

	getSelectedCount: function()
	{
		return this.selectedFiles.length;
	},

	addField: function()
	{
		var field = document.createElement('input');
		field.type = 'file';
		field.name = 'file_' + this.fieldCount;
		field.size = this.options.fieldSize;
		field.onchange = this.__onchange.bind(this, field);
		this.fieldCount++;
		this.fieldContainer.appendChild(field);
	},

	showFiles: function()
	{
		this.listContainer.innerHTML = '';
		var ul = document.createElement('ul');
		for(var i = 0; i < this.selectedFiles.length; ++i)
		{
			var file = this.selectedFiles[i];
			var li = document.createElement('li');
			var leftSpan = document.createElement('span');
			var rightSpan = document.createElement('span');
			var spacer = document.createElement('div');
			spacer.className = 'spacer';
			leftSpan.className = 'left';
			rightSpan.className = 'right';
			li.className = i & 1 ? 'odd' : 'even';
			leftSpan.innerHTML = '<img src="' + this.options.iconURL+get_icon(get_extension(file.name)) + '" class="img1" alt="icon" title="'+file.path+'" />&nbsp; ' + file.name;
			rightSpan.innerHTML = 'Remove';
			rightSpan.onclick = this.removeFile.bind(this, i);
			li.appendChild(leftSpan);
			li.appendChild(rightSpan);
			li.appendChild(spacer);
			ul.appendChild(li);
		}
		this.listContainer.appendChild(ul);
		ul.style.display = this.selectedFiles.length ? 'block' : 'none';
		this.statusContainer.innerHTML = this.selectedFiles.length ? this.selectedFiles.length + ' files selected.' : 'Click on Browse to select a image. Click browse again to add more images.';
	},

	removeFile: function(index)
	{
		this.fieldContainer.removeChild(this.selectedFiles[index].uploadField);
		this.selectedFiles.splice(index, 1);
		this.showFiles();
	},

	isSelected: function(filePath)
	{
		for(var i = 0; i < this.selectedFiles.length; ++i)
			if(this.selectedFiles[i].path == filePath) return true;
		return false;
	},

	checkExtension: function(extension)
	{
		for(var i = 0; i < this.options.allowedTypes.length; ++i)
			if(this.options.allowedTypes[i] == extension) return true;
		return false;
	},

	__onchange: function(field)
	{
		var filePath = field.value;
		if(this.isSelected(filePath))
		{
			alert('You have already selected ' + this.__basename(filePath));
			field.value = '';
			return false;
		}
		var filename = this.__basename(filePath);
		var extension = get_extension(filename);

		if ( filename != 'batch.zip' && filename != 'upload.zip' )
		{
			if ( this.options.publicUploader )
			{
				if ( this.options.allowedTypes.length && !this.checkExtension(extension) )
				{
					uplAlert("You can only upload the following file types (or a Zip file named upload.zip containing these types):\n" + this.options.allowedTypes.join(', '), 'File type not allowed');
					return false;
				}
			}
			else
			{
				if ( extension == 'zip' && !this.zipWarning )
				{
					uplAlert('You have selected a Zip file. Remember to check on "Extract Zip Files" if you want to extract this file.', 'Upload tip');
					this.zipWarning = true;
				}

				if ( extension != 'zip' && this.options.allowedTypes.length && !this.checkExtension(extension) )
				{
					uplAlert("You can only upload the following file types (or a Zip file named upload.zip containing these types):\n" + this.options.allowedTypes.join(', '), 'File type not allowed');
					return false;
				}
			}
		}

		this.selectedFiles.push({name: this.__basename(filePath), path: filePath, uploadField: field});
		this.__hideField(field);
		this.addField();
		this.showFiles();
		return true;
	},

	__hideField: function(field)
	{
		field.style.position = 'absolute';
		field.style.top = '0px';
		field.style.left = '0px';
		field.style.visibility = 'hidden';
	},

	__basename: function(s)
	{
		var p=-1;for(var i=0;i<s.length;i++)if(s.charAt(i)=='\\'||s.charAt(i)=='/')p=i;if(p<0)return s;return s.substr(p+1,s.length-p);
	}
};