var pageUpdater = {
	config: '',
	interval: '',
	speed: 5000,
	debugMode: false,
	lastHashes: '',

	//start the page updating interval every n seconds (default is 5)
	start: function (newSpeed) {
		fetchWhat = new Array('stocks');

		if ($('top-buddies'))   fetchWhat.push('buddies');
		if ($('top-users')) 	   fetchWhat.push('users');
		if ($('top-groups'))   	fetchWhat.push('groups');
		if ($('hot-flop'))      fetchWhat.push('hot-flop');
		if ($('top-stocks'))    fetchWhat.push('topstocks');

		if ($('stocks')) {
			if (Element.hasClassName($('stocks'), 'mystocks')) {
				fetchWhat.push('mystockstable');
			} else {
				fetchWhat.push('stockstable');
			}
		}

		pageUpdater.config  = fetchWhat.join('|');
		pageUpdater.fetchData();

		pageUpdater.speed    = newSpeed || pageUpdater.speed;
		pageUpdater.interval = window.setInterval(pageUpdater.fetchData, pageUpdater.speed);
	},

	//stop the updating interval
	stop: function () {
		if (pageUpdater.interval) {
			window.clearInterval(pageUpdater.interval);
			pageUpdater.config = 'stocks';
		}
	},

	//make an ajaxrequest to get the new information, afterworths pas the entire request object to AjaxEngine.updateData()
	fetchData: function () {
		if (!pageUpdater.config) {
			if (pageUpdater.debugMode) pageUpdater.debug('config member not present in pageUpdater object');
			return false;
		}

		//determine what rows should be opened
		expandedRows = $$('expanded', 'stocks');
		openIDs = '';

		for (var i=0; i<expandedRows.length; i++) {
			classNames = expandedRows[i].nextSibling.className.split(' ')
			classNameParts = classNames[0].split('_');
			openIDs += openIDs == '' ? classNameParts[2] : '-' + classNameParts[2];
		}

		dataToFetch = pageUpdater.config + '|openstocks_' + openIDs; 

		var ajaxUrl = '/ajax/pageupdater.php?fetchdata=' + dataToFetch;
		var ajaxOptions = {
			method: 'get',
			asynchronous: false
		}

		var ajaxObject = new Ajax.Request(ajaxUrl, ajaxOptions);

		pageUpdater.updateData(ajaxObject.transport);
	},

	//process the ajaxRequest which got the new data for the screen
	updateData: function (ajaxRequest) {
		eval('var ajaxData = ' + ajaxRequest.responseText);

		if (pageUpdater.lastHashes == '') {
			pageUpdater.lastHashes = new Object();
			for (var i in ajaxData.hashes) {
				pageUpdater.lastHashes[i] = '';
			}
		}

		if(ajaxData.user && $('usercredits')){
			$('usercredits').innerHTML=ajaxData.user.credits;
		}

		//check if buddies data is received and it differs. If so, process
		if (ajaxData.buddies && ajaxData.hashes.buddies != pageUpdater.lastHashes.buddies) {
			pageUpdater.lastHashes.buddies = ajaxData.hashes.buddies;

			data       = ajaxData.buddies;
			topBuddies = $('top-buddies').getElementsByTagName('table')[0];
			tableRows  = topBuddies.getElementsByTagName('tr'); 

			//when needed, add extra rows to the buddies table
			while (data.length > tableRows.length) {
				newRow     = document.createElement('tr');
				leftCell   = document.createElement('td');
				centerCell = document.createElement('td');
				rightCell  = document.createElement('td');
				leftCell.className = 'ranking';
				profileLink = document.createElement('a');
				centerCell.appendChild(profileLink);

				newRow.appendChild(leftCell);
				newRow.appendChild(centerCell);
				newRow.appendChild(rightCell);
				topBuddies.appendChild(newRow);
			}

			//remove excess rows from the buddies table
			while (data.length < tableRows.length) {
				topBuddies.deleteRow(0);
			}

			//update the rows in the buddy table
			for (var i=0; i<data.length; i++) {
				tableRows[i].cells[0].innerHTML = data[i].rank;
				tableRows[i].cells[0].className = 'ranking';
				tableRows[i].cells[1].firstChild.href = '/profiel/' + data[i].id + '/';
				tableRows[i].cells[1].firstChild.innerHTML = data[i].name;
				tableRows[i].cells[2].innerHTML = data[i].score;

				tableRows[i].className = data[i].isMe == 'true' ? 'me' : (i%2 == 0 ? 'odd' : 'even');
			}
		}

		if (ajaxData.stockstable && ajaxData.hashes.stockstable != pageUpdater.lastHashes.stockstable) {
			oldTable = $('stocks');

			if (typeof oldTable.outerHTML != 'undefined') {
				oldTable.outerHTML = ajaxData.stockstable;
			} else {
				tempDiv = document.createElement('div');
				tempDiv.style.display = 'none';
				document.body.appendChild(tempDiv);
				tempDiv.innerHTML = ajaxData.stockstable;

				tempRows = tempDiv.getElementsByTagName('tr');
				for (var i=0; i<tempRows.length; i++) {
					if (i > 0) {
						if (/collapsed/i.test(tempRows[i-1].className)) {
							Element.hide(tempRows[i]);
						}
					}
				}

				oldTable.innerHTML = tempDiv.firstChild.innerHTML;
				document.body.removeChild(tempDiv);
			}

			rows = $('stocks').getElementsByTagName('tr');
			for (var i=0; i<rows.length; i++) {
				if (/collapsed/i.test(rows[i].className) || /expanded/i.test(rows[i].className)) {
					rows[i].onclick = stocks.toggleRow;
				} else if (/tradestocks/i.test(rows[i].className)) {
					if (/collapsed/i.test(rows[i-1].className)) {
						Element.hide(rows[i]);
					}
				}
			}

			//add behaviour to the buy/sell buttons
			btns = $('stocks').getElementsByTagName('button');
			for (var i=0; i<btns.length; i++) {
				btns[i].onclick = stocks.initiateTrade;
			}
		}

		//check if groups is received and the data differs. If so, process
		if (ajaxData.groups && ajaxData.hashes.groups != pageUpdater.lastHashes.groups) {
			pageUpdater.lastHashes.groups = ajaxData.hashes.groups;

			data      = ajaxData.groups;
			topGroups = $('top-groups').getElementsByTagName('table')[0];
			tableRows = topGroups.getElementsByTagName('tr');

			//update each row of the top-schools table and highlight the users school (when needed)
			for (var i=0; i<data.length; i++) {
				tableRows[i].cells[0].innerHTML = (i+1).toString();
				tableRows[i].cells[0].className = 'ranking';
				tableRows[i].cells[1].firstChild.href = '/groep/' + data[i].slug + '/';
				tableRows[i].cells[1].firstChild.innerHTML = data[i].name;
				tableRows[i].cells[2].innerHTML = data[i].score;				
				tableRows[i].className = (i%2 == 0 ? 'odd' : 'even');
			}
		}

		//check if top externals is received. If so, process
		if (ajaxData.users && ajaxData.hashes.users != pageUpdater.lastHashes.users) {
			pageUpdater.lastHashes.users = ajaxData.hashes.users;

			data      = ajaxData.users;
			tableRows = $('top-users').getElementsByTagName('tr');

			//update each row of the top-schools table and highlight the user (when needed)
			for (var i=0; i<data.length; i++) {
				tableRows[i].cells[0].innerHTML = data[i].rank;
				tableRows[i].cells[0].className = 'ranking';
				tableRows[i].cells[1].firstChild.href = '/profiel/' + data[i].id + '/';
				tableRows[i].cells[1].firstChild.innerHTML = data[i].name;
				tableRows[i].cells[2].innerHTML = data[i].score;

				tableRows[i].className = data[i].isMe == 'true' ? 'me' : (i%2 == 0 ? 'odd' : 'even');
			}
		}

		//check if hot-flop is received. If so, process
		if (ajaxData.hotflop && ajaxData.hashes.hotflop != pageUpdater.lastHashes.hotflop) {
			pageUpdater.lastHashes.hotflop = ajaxData.hashes.hotflop;

			data      = ajaxData.hotflop;
			tableRows = $('hot-flop').getElementsByTagName('tr');

			//update each row of the hot-flop table
			for (var i=0; i<data.length; i++) {
				tableRows[i+1].cells[1].innerHTML = data[i].name;
				tableRows[i+1].cells[1].className = 'stock' + data[i].id;
				tableRows[i+1].cells[2].innerHTML = data[i].price;
				tableRows[i+1].cells[3].innerHTML = data[i].dif + '%';
			}
		}

		//check if top stocks is receiver. If so, process
		if (ajaxData.topstocks && ajaxData.hashes.topstocks != pageUpdater.lastHashes.topstocks) {
			pageUpdater.lastHashes.topstocks = ajaxData.hashes.topstocks;

			data      = ajaxData.topstocks;
			topStocks = $('top-stocks').getElementsByTagName('table')[0];
			tableRows = topStocks.getElementsByTagName('tr');

			//update each row of the top-stocks table
			for (var i=0; i<data.length; i++) {
				tableRows[i].cells[0].className = 'stock' + data[i].id;
				tableRows[i].cells[1].innerHTML = data[i].name;
				tableRows[i].cells[2].innerHTML = data[i].price;
			}
		}
	},

	//function to help debug ajax errors
	ajaxError: function (ajaxRequest) {
		pageUpdater.debug('Status: ' + ajaxRequest.status);
		pageUpdater.debug('Response: ' + ajax.Request.responseText);
	},

	//small debugging function
	debug: function (msg) {
		Try.these(
			console.log(msg),
			alert(msg)
		)
	}
}

