var tmItems = false; var tmErrors = 0; var TM_MAX_ERRORS = 5; var tmIsRunning = false; function tmInit() { tmItems = $("div[data-tm-id]"); if (tmItems.length === 0) return; tmItems.each(function(i, item) { item = $(item); if (item.find('.data-tm-icon').length !== 0) return; if (item.is('[data-tm-progress]')) { item.append('
'); } if (item.is('[data-tm-log]')) { var lh = item.data('tm-log-height'); if (!lh) { lh = ''; } else { lh = 'min-height:' + lh; } item.append('
');
		}
		item.prepend('');
	});
	if (!tmIsRunning) {
		setTimeout(tmUpdate, 50);
	}
	tmIsRunning = true;
}

function tmUpdate()
{
	var active = [];
	tmItems.each(function(i, item) {
		item = $(item);
		var id = item.attr('data-tm-id');
		if (typeof id === 'undefined' || id === false || id === '')
			return;
		active.push(id);
	});
	if (active.length === 0) {
		tmIsRunning = false;
		return;
	}
	$.post('api.php?do=taskmanager', {'ids[]': active, token: TOKEN}, function(data, status) {
		// POST success
		tmIsRunning = tmResult(data, status);
		if (tmIsRunning) {
			setTimeout(tmUpdate, 1000);
		}
	}, 'json').fail(function(jqXHR, textStatus, errorThrown) {
		// POST failure
		console.log("TaskManager Error: " + textStatus + " - " + errorThrown);
		tmIsRunning = (++tmErrors < TM_MAX_ERRORS);
		if (tmIsRunning) {
			setTimeout(tmUpdate, 3000);
		}
	});
}

function tmResult(data, status)
{
	// Bail out on error
	if (typeof data.error !== 'undefined') {
		$('#mainpage').prepend($('
').append(document.createTextNode(data.error))); console.log("Error ERROR"); return false; } // No task list is also bad if (typeof data.tasks === 'undefined') { $('#mainpage').prepend('
Internal Error #67452
'); console.log("Error UNEXPECTED"); return false; } var lastRunOnError = (tmErrors > TM_MAX_ERRORS); // Let's continue handling stuff var counter = 0; for (var idx in data.tasks) { var task = data.tasks[idx]; if (!task.id) continue; counter++; if (lastRunOnError) { task.statusCode = 'TASK_ERROR'; } else if (task.error) { ++tmErrors; continue; } else if (tmErrors > 0) { --tmErrors; } var obj = $('div[data-tm-id="' + task.id + '"]'); if (!obj) continue; if (task.statusCode !== 'TASK_WAITING' && task.statusCode !== 'TASK_PROCESSING') { obj.attr('data-tm-id', ''); } var icon = obj.find('.data-tm-icon'); if (icon) { if (typeof task.statusCode === 'undefined') { icon.attr('class', 'data-tm-icon glyphicon glyphicon-question-sign'); } else if (task.statusCode === 'TASK_WAITING') { icon.attr('class', 'data-tm-icon glyphicon glyphicon-pause'); } else if (task.statusCode === 'TASK_PROCESSING') { icon.attr('class', 'data-tm-icon glyphicon glyphicon-refresh slx-rotation'); } else if (task.statusCode === 'TASK_FINISHED') { icon.attr('class', 'data-tm-icon glyphicon glyphicon-ok'); } else if (task.statusCode === 'TASK_ERROR') { icon.attr('class', 'data-tm-icon glyphicon glyphicon-remove'); } else { icon.attr('class', 'data-tm-icon glyphicon glyphicon-trash'); } } else { console.log('Icon for ' + obj + ': ' + icon); } var progress = obj.find('.data-tm-progress'); if (progress) { var pKey = obj.attr('data-tm-progress'); if (task.data && task.data[pKey]) { tmSetProgress(progress, task.data[pKey], task.statusCode); } else { tmSetProgress(progress, false, task.statusCode); } } var log = obj.find('.data-tm-log'); if (log) { var lKey = obj.attr('data-tm-log'); if (task.data && task.data[lKey]) { log.text(task.data[lKey]).show(); } } var cb = obj.attr('data-tm-callback'); if (cb && window[cb]) { window[cb](task); } } if (lastRunOnError) { $('#mainpage').prepend($('
').append(document.createTextNode(task.error))); return false; } return counter > 0; } function tmSetProgress(elem, percent, status) { var outer = '', inner = ''; if (status === 'TASK_PROCESSING') { outer = ' active'; } else if (status === 'TASK_ERROR') { inner = ' progress-bar-danger'; } else if (status === 'TASK_FINISHED') { inner = ' progress-bar-success'; } elem.find('.progress').attr('class', 'progress progress-striped' + outer); var bar = elem.find('.progress-bar'); bar.attr('class', 'progress-bar' + inner); if (percent !== false) { bar.attr('aria-valuenow', percent); bar.attr('style', 'width: ' + percent + '%'); } } tmInit();