var UploadManager = (function(){
	var __construct = function(url){
		var me = this;
		
		var _queue = [];
		var _isActive = false;
		var _backendURL = "";
		
		var _uploadNext = function(){
			_isActive = true;
			var current = _queue[0];
			me.onstart(current);
			current[0].ajaxSubmit({
				url:_backendURL,
				success: _uploadeFinished,
				dataType:"json",
				type:"POST"
			});
			var xyz = function() {current[0].remove();};
			setTimeout(xyz, 30);
			
		};
		
		var _uploadeFinished = function(data){
			var uploaded = _queue[0];
			me.onfinish(uploaded, data);
			_shift();
		};
		
		var _shift = function(){
			_queue.shift(0,1);
			if (_queue.length===0) {
				_isActive = false;
				_allUploadesFinished();
				return;
			}
			_uploadNext();	
		};
		
		var _allUploadesFinished = function(){
			me.onfinishall();
		};
		
		var _duplicateInput= function(jqForm){
			var newForm = jqForm.clone(true);
			newForm.find("input:file").val("");
                        newForm.find("input[type=hidden][name=urlphoto]").remove();
			jqForm.css("display","none").after(newForm.removeAttr("id").attr("method","POST"));
			return newForm;
		};
		
		var _error = function (){
			me.onerror(arguments);
			_shift();
		}
		
		$().ajaxError(function(event,XMLHttpRequest,ajaxOptions,thrownError){
			_error(arguments,_queue[0]);
			_shift();		
		});
		////////////////////////////////////////////////////////////////////
		me.onfinish = function(){};
		me.onerror = function(){};
		me.onstart = function(){};
		me.onstartall = function(){};
		me.onfinishall = function(){};
		me.onadd = function(){return true};
		////////////////////////////////////////////////////////////////////
		_backendURL = url;
		
		me.add = function(formData, jqForm, options){ 
			try { 
				if(jqForm.find(":file").val()=="" && jqForm.find(":hidden[name=urlphoto]").val()==undefined) return false;
				if(!me.onadd(jqForm)){
					return false;
				}else{
					_queue.push([jqForm, _duplicateInput(jqForm), new Date()]);
				};
				if(!_isActive) {
					me.onstartall();
					_uploadNext();
				}
			} catch(e){
				_error(e,jqForm);
			}
			return false;
		};
		
		me.isActive = function(){
			return _isActive;
		};
		

	};
		
	return __construct;
})();
