constructor(props) {
		super(props);
		this.loadData = this.loadData.bind(this);
		this.addResource = this.addResource.bind(this);
		this.delResource = this.delResource.bind(this);
		this.putResource = this.putResource.bind(this);
		this.addFilter = this.addFilter.bind(this);
		this.delFilter = this.delFilter.bind(this);
		this.addTrack = this.addTrack.bind(this);
		this.openSubmitDialog = this.openSubmitDialog.bind(this);
		this.closeSubmitDialog = this.closeSubmitDialog.bind(this);
		this.openFetchErrorDialog = this.openFetchErrorDialog.bind(this);
		this.closeFetchErrorDialog = this.closeFetchErrorDialog.bind(this);
		this.startProcessing = this.startProcessing.bind(this);
		this.play = this.play.bind(this);
		this.playing = this.playing.bind(this);
		this.pause = this.pause.bind(this);
		this.setTime = this.setTime.bind(this);

		this.datetimeStart = new Date(1970, 0, 1);
		this.timerStart = new Date(1970, 0, 1);
		this.timerFunction = null;

		this.state = {
			project: window.location.href.match(/project\/([^/]*)/)[1],
			resources: {},
			timeline: {},
			processing: null,
			loading: true,
			showSubmitDialog: false,
			showFetchError: false,
			fetchError: '',
			time: new Date(1970, 0, 1),
			playing: false
		};

		this.loadData();
	}
@file Editor.js
@author Vladan Kudlac <vladankudlac@gmail.com>