class AbstractWorker {
	
	constructor() {
		this.config = {};
		
		var
			ival = 1000,
			timer,
			cmds = [],
			execRun = false;
		
		var update = function() {
			if (!!timer) self.clearTimeout(timer);
			this.tick(function(result) {
				self.postMessage(result);
			});
			if (ival > 0) timer = self.setTimeout(update, ival);
		}.bind(this);
	
		var exec = function() {
			if (!!cmds.length) {
				execRun = true;
				var cmd = cmds.shift();
				if (typeof this[cmd.cmd] == "function") {
					this[cmd.cmd].apply(this,cmd.params);
				} else {
					exec();
				}
			} else {
				execRun = false;
			}
		}.bind(this);
	
		this.start = function() {
			update();
			exec();
		}
		
		this.stop = function() {
			if (!!timer) self.clearTimeout(timer);
			exec();
		}
		
		this.loadConfig = function(name) {
			AJAX.request("../../panels/departure/config/"+name+".json").then(function(data) {
				this.config = this.processConfig(data.response);
				exec();
			}.bind(this),function() {
				exec();
			});
		}
	
		self.onmessage = function(e) {
			cmds.push(e.data);
			if (!execRun) exec();
		}.bind(this);
		
		this.setSpeed = function(val) {
			if (isNaN(val = parseInt(val))) {
				val = 0;
			}
			ival = val;
		}
		
	}
	
	tick(callback) {
		callback({});
	}
	
	processConfig(config) {
		return config;
	}
		
}