var
	scrollObjects = new Array(),
	scrollParent,
	scrollBuffer = 400,
	scrollLast = 0,
	scrollLastPos = -1,
	loadIndicator = "Loading...";


function scrollable (isTable, eventId, elements) {
	this.isTable = isTable;
	this.eventId = eventId;
	if (isTable)
		this.table = elements;
	else {
		this.elements = new Array();
		for (ind in elements)
			if (elements[ind].id)
				this.elements.push(dgbi(elements[ind].id));
			else
				this.elements.push(elements[ind]);
	}
	this.loadIndicator = '';
}

function scrollableElement (element) {
	this.loaded = 0;
	this.element = element;
}

function scrollHandler () {
	var d = new Date ();
	if (d.getTime() - scrollLast >= 500) {
		scrollLast = d.getTime();
		scrollDownload();
	}
}

function scrollWatcher () {
	if (scrollParent.scrollTop != scrollLastPos)
		scrollDownload();
	setTimeout('scrollWatcher()', 1000);
}

function scrollDownload () {
	if (!scrollParent)
		return;

	scrollLastPos = scrollParent.scrollTop;
		
	var w = window.innerHeight;
	if (!w)
		w = document.body.offsetHeight;
	
	for (ind = 0; ind < scrollObjects.length; ind++) {
		var object = scrollObjects[ind];	
		if (object.dead) {
			scrollObjects.splice(ind, 1);
			ind--;
			continue;
		}
		
		query = '';
		if (object.isTable)
			var container = object.table.rows;
		else
			var container = object.elements;
		
		if (container.length == 0)
			continue;
		
		var left = 0;
		var right = container.length - 1;
		if (!container[0].id)
			left++;
		var found = left;
		
		while (left < right) {
			var mid = Math.floor((left + right) / 2);
			var midEl = dgbi(container[mid].id);
			if ((getRealOffset(midEl)+midEl.offsetHeight >= scrollParent.scrollTop-scrollBuffer) && (getRealOffset(midEl) <= scrollParent.scrollTop+w+scrollBuffer)) {
				found = mid;
				break;
			}
			if (getRealOffset(midEl)+midEl.offsetHeight < scrollParent.scrollTop-scrollBuffer)
				left = mid + 1;
			if (getRealOffset(midEl) > scrollParent.scrollTop+w+scrollBuffer)
				right = mid - 1;
		}
		
		left = found;
		right = found;
		
		showdbg('found = ' + found);
		while ((left > 0) && (getRealOffset(container[left - 1])+container[left - 1].offsetHeight > scrollParent.scrollTop))
			left--;
		scrollCurrent = container[left];
		if (getRealOffset(container[0]) > scrollParent.scrollTop)
			scrollCurrent = '';
		while ((left > 0) && (getRealOffset(container[left - 1])+container[left - 1].offsetHeight >= scrollParent.scrollTop-scrollBuffer))
			left--;
		
		while ((right < container.length - 1) && (getRealOffset(container[right + 1]) <= scrollParent.scrollTop+w+scrollBuffer))
			right++;
				
		for (i = left; i <= right; i++) {
			element = container[i];
			if (element.id) {
				if (!element.loaded) {
					element.loaded = 1;
					if (object.isTable)
						element.cells[0].innerHTML += loadIndicator;
					else
						element.innerHTML += loadIndicator;
					if (object.onLoadElement) {
						object.onLoadElement(element);
					}
					else {
						if (query)
							query += ',';
						query += element.id;
					}
				}
			}
		}
		if (query) {
			//TODO messageREWAD('/:/'+object.eventId+'/paint', 'id='+query);
		}
	}
}

function getRealOffset(el) {
	c = 0;
	while (el != scrollParent) {
		c += el.offsetTop;
		el = el.offsetParent;
	}
	return c;
}

function scrollToObj(el) {
	scrollParent.scrollTop = getRealOffset(el);
}

function restoreScroll () {
	if (scrollCurrent)
		scrollToObj(scrollCurrent);
}
