var theRequest        = false;
var total_upload_size = 1;
var total_file_count  = 1;
var forceKB           = 1;
var cgi_limit         = 1887436800;
var script_name       = "/mover/include/ajaxupload.cgi";


function goajax(page, handlerscript)
{
	theRequest = false;

/*
// if webkit (Safari/Chrome) we can't do an ajax call during the post
// so we will use an iframe instead
 */
	if (jQuery.browser.webkit) {
		var iframe = jQuery('#progressiframe');
		if (!iframe || !iframe.length) {
			iframe = jQuery('<iframe name="progressiframe" id="progressiframe" class="hidden" src="about:none" />');
			jQuery('div#progressiframehider').append(iframe);

			iframe.load(
				function() {
					var iframeContents = jQuery('#progressiframe')[0].contentDocument.body.innerHTML;
					processUpdateValues(iframeContents);
				}
			)
		}

		var callScript = script_name + "?jscontext=1&items=" + total_file_count + "&serial=" + serial + "&action=get_progress_and_size&maxsize=" + max_size;

		iframe[0].src = callScript;
	}

	if(window.XMLHttpRequest)
	{
		theRequest = new XMLHttpRequest();
		if(theRequest.overrideMimeType)
		{
			theRequest.overrideMimeType('text/xml');
		}
	}
	else if(window.ActiveXObject)
	{
		try
		{
			theRequest = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try
			{
				theRequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if(!theRequest)
	{
		alert('Error: could not create XMLHTTP object.');
		return false;
	}

	theRequest.onreadystatechange = handlerscript;
	theRequest.open('GET', page, true);
	theRequest.send(null);
}


function updateProgress()
{
	if(theRequest.readyState == 4)
	{
		if(theRequest.status == 200)
		{
			processUpdateValues(theRequest.responseText);
		}
		else
		{
			alert('Error: A bad status code was seen (' + theRequest.status + '). Your upload will continue but the progress bar will not be updated.');
		}
	}
}

function processUpdateValues(responseText) {
	var update = new Array();
	update = responseText.split('|');

	if(update[1] != 0)
	{
		total_upload_size = update[1];
	}

	if(update[5] == 'exceeds_post_max')
	{
		document.getElementById('progressMeter' + serial).innerHTML = '<div style="padding: 0 15px 0 15px; font-size: 1.1em">' +
			'<span class="error" style="font-size: 1.6em;">error!</span>You are trying to send ' +
			format_filesize_with_unit(total_upload_size, ' ', 0) +
			', which exceeds the maximum file size supported by the web interface (' +
			format_filesize_with_unit(cgi_limit, ' ', 0) +
			'). The upload will not complete.  Please hit the stop button in your browser.</div>'
		return null;
	}
	else if (update[5] == 'exceeds_quota')
	{
		document.getElementById('progressMeter' + serial).innerHTML = '<div style="padding: 0 15px 0 15px; font-size: 1.1em">' + 
			'<span class="error" style="font-size: 1.6em;">error!</span><br />You are trying to send ' +
			format_filesize_with_unit(total_upload_size, ' ', 0) +
			', which exceeds your remaining storage space (' +
			format_filesize_with_unit(max_size, ' ', 0) +
			'). The upload will not complete.  Please hit the stop button in your browser.</div>'
		return null;
	}

	var completed_upload_size = update[0];
	var elapsedtime = update[2];
	var numfinishedfiles = update[3];
	var numtotalfiles = update[4];

	var progressPercent = Math.ceil((completed_upload_size/total_upload_size)*100);

	document.getElementById('progressMeterText' + serial).innerHTML = '<strong>' + progressPercent + '%</strong>';

	document.getElementById('progressMeterBarDone' + serial).style.width = parseInt(progressPercent*3.5) + 'px';


	var totaltime = parseInt((elapsedtime * 100) / progressPercent);
	var totaltime_forprint = format_timespan_with_unit(totaltime, '&nbsp;');
	var remainingtime_forprint = format_timespan_with_unit(eval(totaltime - elapsedtime), '&nbsp;');
	var elapsedtime_forprint = format_timespan_with_unit(elapsedtime, '&nbsp;');

	var force_MB = total_upload_size > 999999 ? 1 : 0;
	var total_upload_size_forprint = format_filesize_with_unit(total_upload_size, '&nbsp;', force_MB);
	var remaining_upload_size_forprint = format_filesize_with_unit(total_upload_size - completed_upload_size, '&nbsp;', force_MB);
	var completed_upload_size_forprint = format_filesize_with_unit(completed_upload_size, '&nbsp;', force_MB);

	var transfer_rate = format_filesize_with_unit(completed_upload_size/elapsedtime, '&nbsp;', force_MB);

	document.getElementById('transferRate' + serial).innerHTML = '<strong>' + transfer_rate + '/s</strong> (time remaining: <strong>' + remainingtime_forprint + '</strong>)';

	if(progressPercent >= 100)
	{
	     document.getElementById('transferRate' + serial).innerHTML = '<span style=\"font-weight: bold\">Your upload is now being processed.  Please be patient.</span>';
	     window.setTimeout("goajax('" + script_name + "?items=" + total_file_count + "&serial=" + serial + "&action=process_upload&maxsize=" + max_size + "', finishUpload)", 700);
	}
	else
	{
	     window.setTimeout("goajax('" + script_name + "?items=" + total_file_count + "&serial=" + serial + "&action=get_progress_and_size&maxsize=" + max_size +"', updateProgress)", 700);
	}
}

function finishUpload()
{
	if(theRequest.readyState == 4)
	{
		if(theRequest.status == 200)
		{
			update = theRequest.responseText;
		}
	}
}

function startprogress()
{
	document.getElementById('progressMeter' + serial).style.display = 'block';
	document.getElementById('progressMeterText' + serial).innerHTML = '<strong>0%</strong>';
	document.getElementById('uploadbutton' + serial).disabled = true;
	window.setTimeout("goajax('" + script_name + "?items=" + total_file_count + "&serial=" + serial + "&action=get_progress_and_size&maxsize=" + max_size + "', updateProgress)", 1200);
}

function format_filesize_with_unit(num,space,forceMB)
{
	var unit;
	if(   ((num > 999999)  ||  forceMB)   &&   !forceKB)
	{
		num = num/(1024*1024);
		num = num.toString();

		// note extra escaping necessary since were printing this JS code from Perl...
		var testnum = num.replace( /^(\d+\.\d).*/, '$1' ); // show 1 decimal place.

		if(testnum == '0.0')
		{
			testnum = num.replace( /^(\d+\.\d\d).*/, '$1' ); // show 2 decimal places.
		}
		if(testnum == '0.00')
		{
			testnum = num.replace( /^(\d+\.\d\d\d).*/, '$1' ); // show 3 decimal places.
		}
		num = testnum;

		unit = 'MB';
	}
	else
	{
		num = parseInt(num/(1024));
		unit = 'KB';
	}
	return num + space + unit;
}

function format_timespan_with_unit(num,space)
{
	if(num >= (60*60))
	{
		var secs_left = num % (60*60);
		var mins_left = secs_left / 60;
		mins_left = mins_left.toString();
		// note extra escaping necessary since were printing this JS code from Perl...
		mins_left = mins_left.replace( /^(\d+)\..*/, '$1' ); // show no decimal places.
		mins_left = mins_left.replace( /^(\d)$/, '0$1' ); // for single-digits, prepend a zero.

		num = num/(60*60);
		num = num.toString();
		// note extra escaping necessary since were printing this JS code from Perl...
		num = num.replace( /^(\d+)\..*/, '$1' ); // show no decimal places.
		num = num + ':' + mins_left + ':00';
	}
	else if(num >= 60)
	{
		var secs_left = num % 60;
		secs_left = secs_left.toString().replace( /^(\d)$/, '0$1' ); // for single-digits, prepend a zero.

		num = num/60;
		num = num.toString();
		// note extra escaping necessary since were printing this JS code from Perl...
		num = num.replace( /^(\d+)\..*/, '$1' ); // show no decimal places.
		num = num.replace( /^(\d)$/, '0$1' ); // for single-digits, prepend a zero.

		num = '00:' + num + ':' + secs_left;
	}
	else
	{
		num = num.toString();
		// note extra escaping necessary since were printing this JS code from Perl...
		num = num.replace( /^(\d+)\..*/, '$1' ); // show no decimal places.
		num = num.replace( /^(\d)$/, '0$1' ); // for single-digits, prepend a zero.
		num = '00:00:' + num;
	}
	return num;
}

