function uploadProgress()
{
	var self = this;

	// Assign values to private members.
	var _storage		= '';
	var _query			= '';
	var _forceKB		= 0;

	var	_started		= false;
	var _completed		= false;
	var	_iteration		= 0;

	var _progressMeter			= '';
	var _transferRate			= '';
	var _progressMeterBarDone	= '';
	var _progressMeterText		= '';

	var _progressPercent		= '';

	var _donet, _dones, _leftt, _lefts, _totalt, _totals;


	// Private method.
	this.do_request = function(){

		if( ! _completed )
		{
			$.ajax({
				url:'http://'+_storage+'/status/'+_query+'?callback=?',
				dataType:'json',
				data:{
					rand: Math.ceil(100000*Math.random())
				},
				jsonp:'callback',
				jsonpCallback:'upload_progress',
				success:function(data, textStatus){
					self.update_table(data);
				},
				type:'GET'
			});
		}

		setTimeout(function(){
			self.do_request();
		}, 2500);
	};

	this.update_table = function(data){

		_progressMeter.show();

		_progressPercent = Math.ceil((data.progress/data.size)*100);

		if( _progressPercent >= 100 )
		{
			_completed = true;
		}

		_progressMeterBarDone.css({
			width:_progressPercent+'%'
		});
		_progressMeterText.text('Закачано: '+_progressPercent+'%');


		var totaltime 						= parseInt((data.elapsedtime*100)/_progressPercent);
		var totaltime_forprint 				= self.format_timespan_with_unit(totaltime,"&nbsp;");
		var remainingtime_forprint			= self.format_timespan_with_unit((totaltime-data.elapsedtime),"&nbsp;");
		var elapsedtime_forprint			= self.format_timespan_with_unit(data.elapsedtime,"&nbsp;");
		var force_MB						= data.size > 999999 ? 1 : 0;
		var total_upload_size_forprint		= self.format_filesize_with_unit(data.size,"&nbsp;",force_MB);
		var remaining_upload_size_forprint	= self.format_filesize_with_unit((data.size-data.progress),"&nbsp;",force_MB);
		var completed_upload_size_forprint	= self.format_filesize_with_unit(data.progress,"&nbsp;",force_MB);
		var transfer_rate					= self.format_filesize_with_unit((data.progress/data.elapsedtime),"&nbsp;",force_MB);

		if(_donet.size())
		{
			_donet.html(elapsedtime_forprint);
		}

		if(_dones.size())
		{
			_dones.html(completed_upload_size_forprint);
		}

		if(_leftt.size())
		{
			_leftt.html(remainingtime_forprint);
		}

		if( _lefts.size() )
		{
			_lefts.html(remaining_upload_size_forprint);
		}

		if(_totalt.size())
		{
			_totalt.html(totaltime_forprint);
		}

		if(_totals.size())
		{
			_totals.html(total_upload_size_forprint);
		}

		if( _transferRate.size() )
		{
			_transferRate.html("Скорость закачки: "+transfer_rate+"/s");
		}
	};

	this.format_filesize_with_unit = function(num,space,forceMB){
		var unit;
		if(((num>999999)||forceMB)&&!_forceKB)
		{
			num=num/(1024*1024);
			num=num.toString();
			var testnum=num.replace(/^(\d+\.\d).*/,"$1");
			if(testnum=="0.0")
			{
				testnum=num.replace(/^(\d+\.\d\d).*/,"$1")
			}
			if(testnum=="0.00")
			{
				testnum=num.replace(/^(\d+\.\d\d\d).*/,"$1")
			}
			num=testnum;
			unit="MB"
		}
		else
		{
			num=parseInt(num/(1024));
			unit="KB"
		}
		return num+space+unit
	};

	this.format_timespan_with_unit = function(num,space){

		var unit;
		if(num>=(60*60))
		{
			var secs_left=num%(60*60);
			var mins_left=secs_left/60;
			mins_left=mins_left.toString();
			mins_left=mins_left.replace(/^(\d+)\..*/,"$1");
			mins_left=mins_left.replace(/^(\d)$/,"0$1");
			num=num/(60*60);
			num=num.toString();
			num=num.replace(/^(\d+)\..*/,"$1");
			num=num+space+"h"+space+mins_left+space+"m";
			space="";
			unit="";
		}
		else
		{
			if(num>=60)
			{
				var secs_left = num%60;
				secs_left = secs_left.toString().replace(/^(\d)$/,"0$1");
				num = num/60;
				num = num.toString();
				num = num.replace(/^(\d+)\..*/,"$1");
				num = num.replace(/^(\d)$/,"0$1");
				num = num+space+"m"+space+secs_left+space+"s";
				space = "";
				unit = "";
			}
			else
			{
				unit = "s";
			}
		}
		return num+space+unit
	}

	// Public methods.
	return{
		start: function(){

			if( ! $('#show_progress_bar').is(':checked') )
			{
				_storage 				= $('#upload_host').val();
				_query					= $('#progress_bar').val();

				_progressMeter			= $('#progressMeter');
				_transferRate			= $('#transferRate');
				_progressMeterBarDone	= $('#progressMeterBarDone');
				_progressMeterText		= $('#progressMeterText');

				_donet					= $('#donet');
				_dones					= $('#dones');
				_leftt					= $('#leftt');
				_lefts					= $('#lefts');
				_totalt					= $('#totalt');
				_totals					= $('#totals');

				self.do_request();
			}

		}
	}
}