var _UploadIntervals = new Array();
var _UploadContainer = false;
var _UploadWidgetCounter = 0;
var _UploadFirstLoad = true;
var _UploadCountMax = 1; // max number of upload slots on screen at any given time

$(document).ready(function() { 
	UploadInit( "#UploadContainer", 1 );
	$('#formSubmit').click( function() { 
		UploadFormProcess();
	} );
} );

function UploadInit ( container, count ) {

	_UploadContainer = container;
	_UploadCountMax = count;

	for ( var i = 1; i <= _UploadCountMax; i ++ ) {
		UploadWidgetAdd();
	}

	_UploadFirstLoad = false;

}

function UploadWidgetAdd () {

	i = ++ _UploadWidgetCounter;
 
	// see how many upload slots exist, only add if more are required
	if ( $( _UploadContainer  + ' .UploadFileInputField' ).size() >= _UploadCountMax ) {
		return false;
	}

	var s = '';
	s += "\n";
	s += '<div class="UploadFile" id="UploadFile' + i + '"></div>';

	$(_UploadContainer).append ( s );
	$( '#UploadFile' + i ).hide();

	$( '#UploadFile' + i ).html( UploadWidgetAddInner ( i ) );

	if ( _UploadFirstLoad == true ) {
		$( '#UploadFile' + i ).show();
	} else {
		$( '#UploadFile' + i ).fadeIn();
	}

}

function UploadWidgetAddInner ( i ) {

	var sid = guid();

	var s = '';
	s += "\n";
	s += '<div class="UploadFileInput">';

	s += "\n";
	s += '<form method="post" enctype="multipart/form-data" name="UploadForm' + i + '" id="UploadForm' + i + '" action="upload_roskant.cgi?sid=' + sid + '" target="form' + i + '_iframe">';
	s += '<input type="file" class="UploadFileInputField" name="file' + i + '" id="file' + i + '" onchange="UploadFileProcess(' + i + ');" />';
	s += '<input type="hidden" class="UploadFileSID" value="' + sid + '" />';
	s += '</div>';

	s += "\n";
	s += '<div class="UploadFileStatus">';
	s += '<div class="UploadFileProgressMonitor" id="UploadFileProgressMonitor' + i + '" style="display: none;">';
	s += '<a href="javascript:void(0);" class="UploadFileStatus-cancel" onclick="UploadCancel(' + i + '); return false;"><span>Cancel</span></a>';
	s += '<div class="UploadFileProgressMonitor-progress"><div class="UploadFileProgressMonitor-complete"></div></div>';
	s += '<span class="UploadFileProgressMonitor-filename"></span>';
	s += '</div>';
	s += '</div>';
	s += '</form>';

	s += "\n";
	s += '<iframe name="form' + i + '_iframe" id="form' + i + '_iframe" src="about:blank" style="border: 0; height: 0; width: 0; padding: 0; position: absolute;"></iframe> ';

	s += "\n";
	s += '<div class="clear"></div>';

	return s;

}

function UploadFileHTML ( request ) {
	var s = '';
	s += "\n";
	s += '<div class="UploadFileItem">';
	s += '<a href="javascript:void(0);" class="UploadFileStatus-cancel" onclick="UploadRemove(' + request.form_id + '); return false;"><span>Remove</span></a>';
	s += '<input type="hidden" class="UploadFileSID" value="' + request.sid + '" />';
 	s += '<span class="UploadFileIcon"><img src="/images/icon/' + request.extension + '.png" /></span>';
	s += '<span class="UploadFileName">' + request.filename + '</span>';
	s += '</div>';
	return s;
}


function UploadCancel ( i ) {
	clearInterval ( _UploadIntervals[i] );
	$('#UploadFile' + i + ' .UploadFileStatus' ).fadeOut ( 250, function() { $('#UploadFile' + i ).remove(); UploadWidgetAdd(); } );
	return false;
}

function UploadRemove ( i ) {
	$('#UploadFile' + i ).fadeOut ( 250, function() { $('#UploadFile' + i ).remove(); UploadWidgetAdd(); } );
	return false;
}

function UploadFileProcess ( form_id ) {

	var theForm = $( '#UploadForm' + form_id );
	var sid = $( '#UploadForm' + form_id + ' .UploadFileSID' ).val();
	var filename = $( '#UploadForm' + form_id + ' .UploadFileInputField' ).val();

	// Some browsers (IE) give full path as filename
 	filename = filename.replace(/^.*\\/, '')

	$( '#UploadForm' + form_id + ' .UploadFileName' ).val( filename );

	if ( filename.replace ( '/\s/', '' ).toString() === '' ) {
		return false;
	}

	theForm.submit();

	$( '#UploadForm' + form_id + ' .UploadFileInputField' ).remove();
	$( '#UploadFileProgressMonitor' + form_id ).show();   
	$( '#UploadFile' + form_id + ' .UploadFileProgressMonitor-filename').html( filename );

	_UploadIntervals[form_id] = setInterval( 'UploadProgressUpdater( { form_id:"' + form_id + '", sid:"' + sid + '", filename:"' + filename + '"});', 1000 );
	
	// add another file input
	UploadWidgetAdd();

}

function UploadProgressUpdater ( request ) {
	var myDate = new Date();

	// cachebuster for IE
	var buster = myDate.getHours() + '-' + myDate.getMinutes() + '-' + myDate.getSeconds();

	$.getJSON( '/index.php', { m: 'upload', view: 'progress', sid: request.sid, nocache: buster }, function ( json ) {

		// debug
		var s = '';
		s += 'json.progress: ' + json.progress + '<br />';
		s += 'json.error: ' + json.error + '<br />';
		s += 'json.status: ' + json.status + '<br />';
		s += 'json.mime: ' + json.mime + '<br />';
		s += 'json.filename: ' + json.filename + '<br />';
		s += 'json.extension: ' + json.extension + '<br />';

		request.mime = json.mime;
		request.extension = json.extension;

		// debug
				
		if ( json.error == 'oversize' ) {
			// uploaded file was too big
			clearInterval ( _UploadIntervals[request.form_id] );
			$('#UploadFile' + request.form_id + ' .UploadFileStatus' ).fadeOut ( 250, function() { $('#UploadFile' + request.form_id + ' .UploadFileStatus' ).remove(); $('#UploadFile' + request.form_id ).html ( 'Sorry, that file is too large to upload. Maximum size permitted is 50MB' ); } );		
			// after 5 seconds fade out and remove - use animate opacity from 100% to 100% over 5 seconds to achieve delay
			$('#UploadFile' + request.form_id ).animate({opacity: 1.0}, 5000).fadeOut('slow', function() { $('#UploadFile' + request.form_id ).remove(); });

		} else if ( json.error == 'type_not_permitted' ) {
			// illegal file type ( not in $permitted list )
			clearInterval ( _UploadIntervals[request.form_id] );
			$('#UploadFile' + request.form_id + ' .UploadFileStatus' ).fadeOut ( 250, function() { $('#UploadFile' + request.form_id + ' .UploadFileStatus' ).remove(); $('#UploadFile' + request.form_id ).html ( 'Sorry, that file type is not permitted' ); } );		

			// after 5 seconds fade out and remove - use animate opacity from 100% to 100% over 5 seconds to achieve delay
			$('#UploadFile' + request.form_id ).animate({opacity: 1.0}, 5000).fadeOut('slow', function() { $('#UploadFile' + request.form_id ).remove(); });


		} else if (json.progress >= 100 || json.progress == 'done' ) {
			// upload done - remove progress bar and add another upload slot
			clearInterval ( _UploadIntervals[request.form_id] );
			$('#UploadFile' + request.form_id + ' .UploadFileStatus' ).fadeOut ( 250, function() { $('#UploadFile' + request.form_id + ' .UploadFileStatus' ).remove(); $('#UploadFile' + request.form_id ).html ( UploadFileHTML ( request ) ); } );
			$('#formFiles-error').html('');

 		$('#log').html( s );

		} else {
			// still uploading - show % completed
			$( '#UploadForm' + request.form_id + ' .UploadFileError' ).val( json.error_msg );
			$( '#UploadFileProgressMonitor' + request.form_id + ' .UploadFileProgressMonitor-complete' ).css('width', json.progress + '%' );
			$( '#UploadFileProgressMonitor' + request.form_id + ' .UploadFileProgressMonitor-complete' ).html ( '<span>' + json.progress + '%' + '</span>' );
		}

		$( '#UploadForm' + request.form_id + ' .UploadFileProgress' ).val( json.progress );



	} );
	
}

function UploadFormValidate () {

	var valid = true;
	var files = '';

	$('.UploadFile').each ( function () {
		if ( $( '#' + this.id + ' .UploadFileItem .UploadFileSID' ).val() != undefined ) {
			files += $( '#' + this.id + ' .UploadFileItem .UploadFileSID' ).val() + ':' + $( '#' + this.id + ' .UploadFileItem .UploadFileName' ).text() + '|';
		}
	});
	
	if ( files == '' ) {
		$('#formFiles-error').html('Please upload at least one file');
		valid = false;
	} else {
		$('#formFiles-error').html('');
	}

	// these are in reverse order so top-most invalid field is
	// focussed

	if ( ! $('#formPhone').val() ) {
		$('#formPhone-error').html('Please enter your phone number');
		$('#formPhone').focus();
		valid = false;
	} else {
		$('#formPhone-error').html('');
	}

	if ( ! $('#formEmail').val() || ! validateEmail ( $('#formEmail').val() ) ) {
		$('#formEmail-error').html('Please enter your email address');
		$('#formEmail').focus();
		valid = false;
	} else {
		$('#formEmail-error').html('');
	}

	if ( ! $('#formName_last').val() ) {
		$('#formName_last-error').html('Please enter your family name');
		$('#formName_last').focus();
		valid = false;
	} else {
		$('#formName_last-error').html('');
	}

	if ( ! $('#formName_first').val() ) {
		$('#formName_first-error').html('Please enter your given name');
		$('#formName_first').focus();
		valid = false;
	} else {
		$('#formName_first-error').html('');
	}

	if ( ! $('#formUser_id').val() ) {
		$('#formUser_id-error').html('Please select your Account Manager');
		$('#formUser_id').focus();
		valid = false;
	} else {
		$('#formUser_id-error').html('');
	}

	return valid;

}

function UploadFormProcess () {

	if ( ! UploadFormValidate() ) {
		return false;
	}

	var files = '';

	$('.UploadFile').each ( function () {
		if ( $( '#' + this.id + ' .UploadFileItem .UploadFileSID' ).val() != undefined ) {
			files += $( '#' + this.id + ' .UploadFileItem .UploadFileSID' ).val() + ':' + $( '#' + this.id + ' .UploadFileItem .UploadFileName' ).text() + '|';
		}
	});

	var order = {
		m: 'upload', 
		rpc: 'process', 		
		formUser_id: $('#formUser_id').val(),
		formName_first: $('#formName_first').val(),
		formName_last: $('#formName_last').val(),
		formEmail: $('#formEmail').val(),
		formPhone: $('#formPhone').val(),
		formOrganisation: $('#formOrganisation').val(),
		formMessage: $('#formMessage').val(),
		formFiles: files
	};


	
	// for to debug

	//	$.post( '/index.php', order, function(response) { $('#UploadChecker').html(response); });
	// 	return false;

	$('#UploadInstructions').fadeOut();

	$('#UploadForm').fadeOut( function() {
		$('#UploadProcessing').fadeIn( function () { 
			$.post( '/index.php', order, function ( response ) { 
				$('#UploadChecker').html(response);
				$('#UploadProcessing').fadeOut( function () { 
					$('#UploadProcessed').fadeIn(); 
					$('#client-upload-link').fadeIn(); 
				});
			});
		});
		
		return false;
	} );


}

function validateEmail(str) {

	var at="@";
	var dot=".";
	var lat=str.indexOf(at);
	var lstr=str.length;
	var ldot=str.indexOf(dot);
	if (str.indexOf(at)==-1) {
		return false; 
	}

	if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr) {
		return false;
	}

	if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr) {
		return false;
	}

	if (str.indexOf(at,(lat+1))!=-1) {
		return false;
	}

	if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot) {
		return false;
	}

	if (str.indexOf(dot,(lat+2))==-1) {
		return false;
	}
		
	if (str.indexOf(" ") != -1) {
		return false;
	}

	return true;
}



function guid() {
	return (S4()+S4()+S4()+S4()+S4()+S4()+S4()+S4());
}

function S4() {
	return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}

