dojo.addOnLoad(lp_init);

var lp_guard_timer;

function lp_init()
{
	lp_guard_timer = setInterval("lp_guard_running()", 1000);
	setTimeout("lp_do_poll()", 500);
}

var lp_backoff_timer;

function lp_guard_running()
{
	if(lp_obj_longpoll == null || lp_obj_longpoll.fired != -1)
	{
		clearInterval(lp_guard_timer);
		lp_backoff_timer = setTimeout("lp_restart_poll()", 2500);
	}
}

function lp_restart_poll()
{
	lp_do_poll();
	lp_guard_timer = setInterval("lp_guard_running()", 1000);
}

var lp_obj_longpoll = null;
var lp_pollurl = '';
var lp_timestamp;

function lp_do_poll()
{
	if(lp_obj_longpoll == null || lp_obj_longpoll.fired != -1)
	{
		if(lp_events.length == 0) return;
		var subscriptions = Array();
		for(var cnt = 0; cnt < lp_events.length; cnt++)
		{
			subscriptions.push([lp_events[cnt], lp_subtypes[cnt], lp_sectokens[cnt]]);
		}
		var register = {timestamp: lp_timestamp, types: subscriptions}
		var reg_json = dojo.toJson(register);
		var xhrArgs = {
			url: lp_pollurl,
			postData: reg_json,
			handleAs: "json",
			timeout: 200000,
			load: function(data)
			{
				lp_obj_longpoll = null;
				if(data.interrupt)
				{
					for(var cnt = 0; cnt < data.events.length; cnt++)
					{
						lp_do_interrupt(data.events[cnt].timestamp, data.events[cnt].type, data.events[cnt].subtype, data.events[cnt].data);
					}
				}
				setTimeout('lp_do_poll()', 500);
			},
			error: function(error, ioArgs)
			{
				if(ioArgs.xhr.readyState == 1)
				{
					ioArgs.xhr.abort();
					lp_do_poll();
				}
				else if(error.status != null && error.status != 0) alert(error);
			}
		}
		lp_obj_longpoll = dojo.xhrPost(xhrArgs);
	}
}

function lp_set_pollurl(url)
{
	lp_pollurl = url;
}

function lp_set_timestamp(ts)
{
	lp_timestamp = ts;
}

var lp_subscribers = Array();
var lp_events = Array();
var lp_subtypes = Array();
var lp_sectokens = Array();

function lp_subscribe(type, subtypes, callback, sectoken)
{
	lp_events.push(type);
	lp_subtypes.push(subtypes);
	lp_subscribers.push(callback);
	if(sectoken) lp_sectokens.push(sectoken);
	else lp_sectokens.push('');
}

function lp_do_interrupt(timestamp, type, subtype, data)
{
	lp_timestamp = timestamp;
	for(var cnt = 0; cnt < lp_events.length; cnt++)
	{
		if(lp_events[cnt] == type) (lp_subscribers[cnt])(type, subtype, data);
	}
}

