Upload = {
	// constants
	UPDATE_INTERVAL : 500,
	MAX_SIZE_PER_MESSAGE: 20971520,
	
	_getDomain: function() {
		var d = document.domain.split('.');
		return 'http://upload.' + d[d.length - 2] + '.' + d[d.length - 1];
	},
	_getHash: function() {
		var re = '';
		for (var i = 0; i < 40; i ++) {
			re += Math.floor(Math.random() * 36).toString(36);
		}
		return re;
	},
	_getSize: function(bytes){
		if (bytes >= 1073741824) {
			return Math.round(bytes / 1073741824 * 100) / 100 + ' GB';
		}
		else if(bytes >= 1048576){
			return Math.round(bytes / 1048576 * 100) / 100 + ' MB';
		}
		else if(bytes >= 1024){
			return Math.round(bytes / 1024 * 100) / 100 + ' KB';
		}
		else { 
			return bytes + ' B';
		}
	},
	_fileName: function(filename){
		filename = filename.replace(/^\s|\s$/g, '');
		
		var name = '';
		var extension = '';
		
		if (/\.\w+$/.test(filename)) {
			if (filename.match(/([^\/\\]+)\.(\w+)$/)) {
				name = RegExp.$1;
				extension = RegExp.$2;
			}
		}
		else {
			if (filename.match(/([^\/\\]+)$/)) {
				name = RegExp.$1;
			}
		}
		
		if (name.length > 65) {
			name = name.substr(0, 35) + '...' + name.substr(name.length - 30);
		}
		
		return name + (extension.length > 0 ? '.' + extension: '');
	},
	_checkStatus: function(hash) {
		$.get('/progress', {
			'X-Progress-ID': hash
		},
		function(d) {
			var progress = eval(d);

			var custom_state = false;
			switch (progress.state) {
				case 'starting':
					$('#MsgUploadItem' + hash).addClass('starting');
					setTimeout(function() { Upload._checkStatus(hash) }, Upload.UPDATE_INTERVAL);
					if ($('#MsgUploadItem' + hash).hasClass('is_default')) {
						$('#MsgUploadItem' + hash).insertBefore($('#MsgFormUploadContent .upload_item:has(a.file_label)'));
					}

					$('#MsgUploadItem' + hash).show();
					$('#MsgUploadItem' + hash).removeClass('is_default');
					$('#upload_' + hash).remove();

					break;
				case 'uploading':
					$('#MsgUploadItem' + hash).addClass('uploading');
					$('#MsgUploadItem' + hash).removeClass('starting');
					$('#MsgUploadItem' + hash + ' .file_size').text('(' + Upload._getSize(progress.size) + ')');
					$('#MsgUploadItem' + hash + ' .progressbar_content').width(progressbar_width = Math.round(progress.received / progress.size * 100) + '%');
					setTimeout(function() { Upload._checkStatus(hash) }, Upload.UPDATE_INTERVAL);
					$('#MsgUploadBox' + hash).attr({'disabled':true, 'checked':false});

					$('#MsgUploadItem' + hash).show();
					$('#MsgUploadItem' + hash).removeClass('is_default');
					$('#upload_' + hash).remove();

					break;
				case 'done':
					$('#MsgUploadItem' + hash).addClass('done');
					$('#MsgUploadItem' + hash).removeClass('starting uploading');
					$('#MsgUploadItem' + hash + ' .file_size').text('(' + Upload._getSize(progress.size) + ')');
					$('#MsgUploadItem' + hash + ' .progressbar_content').width('100%');
					$('#MsgUploadBox' + hash).attr({'disabled':false, 'checked':true});
					break;
				case 'error':
					$('#MsgUploadItem' + hash).addClass('error');
					$('#MsgUploadItem' + hash).removeClass('starting uploading done');
					$('#MsgUploadItem' + hash + ' .progressbar').hide();
					$('#MsgUploadBox' + hash).attr({'disabled':true, 'checked':false});

					$('#MsgUploadItem' + hash + ' .file_size').html('(' + xMss['upload_error_510'] + ')');
					break;
			}
		});
	},
	
	addUploadItem: function(is_button, is_secondary) {
		var hash = Upload._getHash();

		var upload_form = '<iframe style="position: absolute; top: -10000px; width: 1px; height: 1px;" name="upload_' + hash + '" frameborder="0"></iframe>' + 
		'<form action="' + Upload._getDomain() + '/upload.php?DS=' + sessid + '&amp;X-Progress-ID=' + hash + '" target="upload_' + hash + '" encoding="multipart/form-data" enctype="multipart/form-data" method="post" id="upload_' + hash + '"><label class="file_input" for="MsgFileInput' + hash + '"><a class="file_label">' + xMss['add_file'] + '</a><input class="file_input" size="1" name="file" type="file" id="MsgFileInput' + hash + '" /></label></form>';
		var container = '#MsgUploadItem' + hash;
		var container_def = '#MsgUploadItem' + hash;

		if (is_button) {
			$('#MsgFormBtnAttach').append(upload_form);

			upload_form = '';
			container_def = '#MsgFormBtnAttach';
		}

		var item = '<div class="upload_item ' + (is_button ? 'is_default' : '') + '" id="MsgUploadItem' + hash + '"' + (is_button ? ' style="display:none"' : '') + '>' +
		'<div class="progressbar"><div class="progressbar_content"></div></div>' + 
		'<div class="file_properties"><span class="file_name"></span><span class="file_size"></span></div>' +
		upload_form +
		'<input type="checkbox" name="msg_attachments[' + hash + ']" id="MsgUploadBox' + hash + '" class="file_checkbox" disabled="disabled" />' + 
		'</div>';

		$('#MsgFormUploadContent').append(item);

		$(container_def).find('form').bind('submit', function(e) {
			Upload._checkStatus(hash);
		});

		$(container_def).find('input.file_input').bind('change', function() {
			var filename_parts = $(this).val().split('\\');
			var filename = filename_parts[filename_parts.length - 1];
			filename = Upload._fileName(filename);

			$(container).find('.file_name').text(filename);

			$(container_def).find('form').submit();

			$(container_def).find('label.file_input').hide();

			if ($('#MsgFormUploadContent .upload_item').length > 1) {
				$('#MsgFormUploadLine h2 .attachment').hide();
				$('#MsgFormUploadLine h2 .attachments').show();
			}

			if (!is_secondary) { 
				Upload.addLinkUploadItem();
			}

			if (is_button) {
				if ($('#MsgForm').hasClass('msie7') || $('#MsgForm').hasClass('msie8')) {
					$('#MsgFormBtnAttach').remove();
				}
				else {	
					Upload.addButtonUploadItem();
				}
			}
			
			$('#MsgFormUploadLine').show();
		});
	},
	
	addFirstUploadItem: function() {
		Upload.addUploadItem(true);
	},
	addButtonUploadItem: function() {
		Upload.addUploadItem(true, true);
	},
	addLinkUploadItem: function() {
		Upload.addUploadItem();
	}
};