var uploadProgressSettings = new Array();
var uploadProgressTimer = new Array();
var uploadProgressNotFound = new Array();
var uploadProgressActive = new Array();
var uploadProgressData = new Array();

jQuery.fn.extend({

	uploadProgress: function(o) {
		var $id_field = jQuery('input[name="UPLOAD_IDENTIFIER"]',this);
		if (!o.id && $id_field.length)
			o.id = $id_field.val();
		if (!o.id)
			o.id = genUploadKey(o.keyLength);
		
		if ($id_field.length)
			$id_field.val(o.id);
		else
			jQuery('<input type="hidden" name="UPLOAD_IDENTIFIER"/>').val(o.id).prependTo(this);
		
		o = jQuery.extend({ dataFormat: 'json',
						    updateDelay: 1000,
							notFoundLimit: 5,
							debugDisplay: false,
							progressDisplay: '.upload-progress',
							progressMeter: '.meter',
							targetUploader: 'jqUploader',
							fieldPrefix: '.',
							displayFields: ['est_sec'],
							start: function() {},
							success: function() {},
							failed: function() {} },o);
		
		uploadProgressSettings[o.id] = o;
		
		jQuery(this).submit(function () {
			if ($('#upload').val() == '') {
				alert('Er is nog geen foto gekozen. Kies eerst een foto door op Bladeren (browse) te klikken.');
				return false;
			}
			if (uploadProgressActive[o.id]) 
				return false;
			uploadProgressActive[o.id] = true;

			var theForm = this;
			o.start.call(theForm);

			jQuery(theForm).attr('target',o.targetUploader);

			var $upload_frame = jQuery('<iframe id="'+o.targetUploader+'" name="'+o.targetUploader+'"></iframe>');

			if (o.debugDisplay) {
				$('iframe#'+o.targetUploader).remove();
				$(o.debugDisplay).after($upload_frame);
			}
			else {
				$upload_frame.css({position:'absolute',top:'-500px',left:'-500px'}).appendTo('body');
			}

			$upload_frame.load(function() {
									clearTimeout(uploadProgressTimer[o.id]);
									if (o.progressMeter)
										jQuery(o.progressMeter).width(jQuery(o.progressDisplay).width());
									o.success.call(theForm, o);
									if (!o.debugDisplay) 
										setTimeout(function() {	try { $upload_frame.remove();	} catch(e) { } }, 100);
									uploadProgressActive[o.id] = false;
								});
			uploadProgressTimer[o.id] = window.setTimeout("jQuery.uploadProgressUpdate('"+o.id+"')",o.updateDelay);
			uploadProgressNotFound[o.id] = 0;
			return true;
		} );

		return this;

		function genUploadKey(len) {
			if (!len) len = 11;
			var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
			var key='';
			for (var i=0;i<len;i++) {
    			var charnum = Math.floor(Math.random()*(chars.length+1));
				key += chars.charAt(charnum);
			}
		    return key;
		}
	}
});

jQuery.extend({
	uploadProgressUpdate: function(id) {
		var o = uploadProgressSettings[id];
        var stamp = new Date().getTime();   
		jQuery.ajax({url:o.progressURL, data:{'upload_id':id, 'stamp':stamp}, success: 
			function(data) {
				if (data['error']) {
					if (o.debugDisplay)
						jQuery(o.debugDisplay).append('<p>UP: '+data['error']+'</p>');
					uploadProgressNotFound[id]++;
					if (uploadProgressNotFound[id] >= o.notFoundLimit) {
						o.failed.call();
						return false;
					}
				}
				else {
					uploadProgressData[id] = data;
					if (o.debugDisplay) {
						var q='';
						for (var prop in data) {
							q += prop + ': '+data[prop]+'<br />';
						}
						jQuery(o.debugDisplay).html(q);
					}
					if (o.progressMeter) {
						var factor = (jQuery(o.progressDisplay).width())/data['bytes_total'];
						jQuery(o.progressMeter).width(data['bytes_uploaded']*factor);
					}
					for (var d = 0; d<o.displayFields.length; d++) {
						jQuery(o.fieldPrefix+o.displayFields[d], o.progressDisplay).html(data[o.displayFields[d]]);
					}
				}
				if (uploadProgressActive[id])
					uploadProgressTimer[id] = window.setTimeout("jQuery.uploadProgressUpdate('"+id+"')",o.updateDelay);
			}, dataType:o.dataFormat, error:function(xhr, err, et) {
				if (o.debugDisplay)
					jQuery(o.debugDisplay).append('<p>XHR: '+err+'</p>');
				o.failed.call();
				return false;
			}
		});
	}
});
