﻿var ajaxActive_gbl = false;
var ajaxRequestCounter_gin = 0;
var ajaxQueue_gar = new Array();
var activeGadgetID_gin = 0;

function showTrace(msg) {
	if (document.getElementById('TraceFlag').value == "1") {
		var TraceElement = document.getElementById('TraceOutput');
		var calendar = new Date();
		TraceElement.innerHTML += calendar.toLocaleTimeString() + ':<br>';
		TraceElement.innerHTML += msg + '<br>';
		TraceElement.scrollTop = TraceElement.scrollHeight;
	}
}

function ajaxRequest_Obj(gadgetID_ain, cmdString_ast, refreshRate_ain) {
	this.gadgetID_rin = gadgetID_ain;
	this.cmdString_rst = cmdString_ast;
	this.refreshRate_rin = refreshRate_ain;
}

// Supress Ajax Error Messages.  Handle them server side and with the timeout.
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
function EndRequestHandler(sender, args) {
	showTrace('Checking Response for request from gadget ' + activeGadgetID_gin);
	var cmd_lst;
	var success_lbl = true;
	if (args.get_response().get_timedOut()) {
		showTrace('Request Timed Out!');
		args.set_errorHandled(true);
		cmd_lst = 'gadget' + activeGadgetID_gin + 'Timeout()';
		eval(cmd_lst);
		success_lbl = false;
	} else {
		if (args.get_error() != undefined) {
			success_lbl = false;
			args.set_errorHandled(true);
			var errMsg = args.get_error().message;
			var errCode = args.get_response().get_statusCode();
			if (document.getElementById('TraceFlag').value == "1") {
				showTrace('Error: ' + errMsg + ' (' + errCode + ')');
			}
			cmd_lst = 'report' + activeGadgetID_gin + 'Error (\'' + deQuote(errMsg) + ' (' + errCode + ')\')';
			eval(cmd_lst);
			// If the user session was lost, we want to redirect back to the page to clear silly error messages.
			if (errMsg.substring(0, 24).toLowerCase() == 'failed to load viewstate') {
				var newLocation = top.location + '???';
				newLocation = newLocation.substring(0, newLocation.indexOf('?'));
				top.location = newLocation;
			}
		}
	}
	if (success_lbl) {
		cmd_lst = 'completeRequest' + activeGadgetID_gin + '()';
		setTimeout(cmd_lst, 100);
		// eval(cmd_lst);
	}
	ajaxActive_gbl = false;
	activeGadgetID_gin = 0;
	showTrace('Ajax Off');
}

function denyGadgetCall() {
	showTrace('Processing denied ajax request.  I guess the gadget was busy!');
	ajaxActive_gbl = false;
	activeGadgetID_gin = 0;
}

function initiateAjaxCall(gadgetID_ain, cmdString_ast, refreshRate_ain) {
	ajaxRequest_lob = new ajaxRequest_Obj(gadgetID_ain, cmdString_ast, refreshRate_ain);
	ajaxQueue_gar.push(ajaxRequest_lob);
}

function startAjaxQueue() {
	if (ajaxQueue_gar.length > 0) {
		if (!ajaxActive_gbl) {
			if (window[ajaxManagerId_gst]) {
				ajaxRequest_lob = ajaxQueue_gar[0];
				ajaxQueue_gar.splice(0, 1);
				executeAjaxCall(ajaxRequest_lob);
			}
		}
	}
	setTimeout("startAjaxQueue()", 1000);
}

function executeAjaxCall(ajaxRequest_aob) {
	showTrace('Ajax On');
	ajaxRequestCounter_gin += 1;
	ajaxActive_gbl = true;
	activeGadgetID_gin = ajaxRequest_aob.gadgetID_rin;
	var cmd_lst = "executeGadget" + ajaxRequest_aob.gadgetID_rin + "Call('" + ajaxRequest_aob.cmdString_rst + "',ajaxRequestCounter_gin)";
	showTrace('Gadget ' + activeGadgetID_gin + ' initiating request');
	showTrace(cmd_lst);
	eval(cmd_lst);
	if (ajaxRequest_aob.refreshRate_rin > 0) {
		var callString_lst = "initiateAjaxCall(" + ajaxRequest_aob.gadgetID_rin + ",'" + ajaxRequest_aob.cmdString_rst + "', " + ajaxRequest_aob.refreshRate_rin + ")";
		setTimeout(callString_lst, ajaxRequest_aob.refreshRate_rin);
	}
}

function doAjax(buttonID_ast, command_ast) {
	window[ajaxManagerId_gst].ajaxRequestWithTarget(buttonID_ast, command_ast);
}

function checkForClose(sender, e) {
	if (e.Command.get_name().toLowerCase() == 'close') {
		initiateAjaxCall(sender.get_element().id, 'close', 0)
	}
	if (e.Command.get_name().toLowerCase() == 'expandcollapse') {
		initiateAjaxCall(sender.get_element().id, 'savestates', 0)
	}
}

function gadgetConfig(sender, e) {
	var cmd_lst = "preClick_" + sender.get_element().id + "('gadgetconfig',0)";
	eval(cmd_lst);
}

function saveStates(sender, e) {
	initiateAjaxCall(sender.get_element().id, 'savestates', 0)
}

setTimeout("startAjaxQueue()", 1000);

