var bid_xhr_in_progress=0;
var bid_last_xhr=(new Date()).getTime();
var bid_queue={};
var bid_in_progress={};

function bid_add_items(items)
{
	for (var i in items)
	{
		bid_items[items[i].id]	=	items[i];
	}
}

function bid_change_style_color(name,style,sr,sg,sb,er,eg,eb,steps,laps,change_dir,loop)
{
	bid_change_style_color_int(name,style,(new Date()).getTime(),sr,sg,sb,er,eg,eb,steps,laps,change_dir,loop)
}

function bid_change_style_color_int(name,style,starttime,sr,sg,sb,er,eg,eb,steps,laps,change_dir,loop)
{
	var o	=	document.getElementById(name);
	var current	=	((new Date()).getTime() - starttime)/laps;
	if (current > 1)
		current	=	1;
	//naxo_debug(current);
	var r	=	Math.floor(sr + current*(er-sr));
	var g	=	Math.floor(sg + current*(eg-sg));
	var b	=	Math.floor(sb + current*(eb-sb));
	o.style[style]	=	'rgb('+r+','+g+','+b+')';
	var l	=	laps/steps;
	if (l<20)
		l	=	20;
	if (current < 1)
	{
		//naxo_debug('same direction');
		setTimeout("bid_change_style_color_int('"+name+"','"+style+"',"+([starttime,sr,sg,sb,er,eg,eb,steps,laps,change_dir,loop].join(','))+")",l);
	}
	else if (--loop)
	{
		//naxo_debug('loop');
		if (change_dir)
		{
			setTimeout("bid_change_style_color('"+name+"','"+style+"',"+([er,eg,eb,sr,sg,sb,steps,laps,change_dir,loop].join(','))+")",l);
		}
		else
		{
			setTimeout("bid_change_style_color('"+name+"','"+style+"',"+([sr,sg,sb,er,eg,eb,steps,laps,change_dir,loop].join(','))+")",l);
		}
	}
}

function bid_change_style(name,style,suffix,s,e,steps,laps,change_dir,loop,finished)
{
	bid_change_style_int(name,style,suffix,(new Date()).getTime(),s,e,steps,laps,change_dir,loop,finished)
}

function bid_change_style_int(name,style,suffix,starttime,s,e,steps,laps,change_dir,loop,finished)
{
	var o	=	document.getElementById(name);
	var current	=	((new Date()).getTime() - starttime)/laps;
	if (current > 1)
		current	=	1;
	//naxo_debug(current);
	o.style[style]	=	Math.floor(s + current*(e-s))+suffix;
	var l	=	laps/steps;
	if (l<20)
		l	=	20;
	if (current < 1)
	{
		//naxo_debug('same direction');
		finished	=	finished.replace(/['\\]/g,'\\$&');
		setTimeout("bid_change_style_int('"+name+"','"+style+"','"+suffix+"',"+([starttime,s,e,steps,laps,change_dir,loop].join(','))+",'"+finished+"')",l);
	}
	else if (--loop)
	{
		//naxo_debug('loop');
		finished	=	finished.replace(/['\\]/g,'\\$&');
		if (change_dir)
		{
			setTimeout("bid_change_style('"+name+"','"+style+"','"+suffix+"',"+([e,s,steps,laps,change_dir,loop].join(','))+",'"+finished+"')",l);
		}
		else
		{
			setTimeout("bid_change_style('"+name+"','"+style+"','"+suffix+"',"+([s,e,steps,laps,change_dir,loop].join(','))+",'"+finished+"')",l);
		}
	}
	else
	{
		setTimeout(finished,500);
	}
}

function bid_replace_text(name,text,effect)
{
	var o	=	document.getElementById(name);
	if (o && o.firstChild && o.firstChild.data != text)
	{
		o.replaceChild(document.createTextNode(text),o.firstChild);
		if (effect == 'back1')
			bid_change_style_color(name,'background',255,255,255,255,0,0,20,100,1,4);
		else if (effect == 'color1')
			bid_change_style_color(name,'color',0,0,0,255,0,0,1,20,1,10);
	}
}

function bid_replace_bid_finished(item,amount,username)
{
	bid_replace_text('bid_span_amount_'+item,amount);
	bid_replace_text('bid_span_user_'+item,username);
	document.getElementById('bid_div0_amount_'+item).style.color='red';
	document.getElementById('bid_div0_amount_'+item).style.left='-130px';
	if (typeof(bid_queue[item]) != 'undefined' && bid_queue[item].length)
	{
		var q	=	bid_queue[item].shift();
		bid_replace_bid(item,q.amount,q.user);
	}
	else
	{
		bid_change_style_color('bid_div0_amount_'+item,'color',255,0,0,0,0,0,100,1000,0,1);
		// XXX this should really be done once we are finished with the above?
		bid_in_progress[item]	=	0;
	}
}

function bid_replace_bid(item,amount,username)
{
	var o	=	document.getElementById('bid_span_amount_'+item);
	if (o && o.firstChild && o.firstChild.data != amount)
	{
		bid_replace_text('bid_span_amount_'+item+'_new',amount);
		bid_replace_text('bid_span_user_'+item+'_new',username);
		var l	=	200;
		if (typeof(bid_queue[item]) != 'undefined' && bid_queue[item].length)
			l	=	5000/bid_queue[item].length;
		if (l<100)
			l	=	100;
		if (l>200)
			l	=	200;
		bid_change_style('bid_div0_amount_'+item,'left','px',-130,0,130,l,0,1,"bid_replace_bid_finished('"+item+"','"+amount+"','"+username+"')");
		//o.replaceChild(document.createTextNode(text),o.firstChild);
	}
	else
	{
		bid_in_progress[item]	=	0;
	}
}

function bid_pad(value)
{
	if (value < 10)
	{
		return '0'+value;
	}
	return value;
}

function bid_update_time_left(item,t,min)
{
	var id		=	item.id;
	var obj		=	document.getElementById('bid_span_time_'+id);
	if (!obj)
		return min;
	var time_left	=	item.end_time-t-3;
	//naxo_debug('end_time:'+item['end_time']+' t:'+t+' time_left:'+time_left);
	if (item.status == 2)
	{
		// auction is finished
		obj.style.border='0';
		time_left	=	bid_finished;
	}
	else
	{
		if (time_left < min)
			min	=	time_left;
		if (time_left <= 0)
		{
			//naxo_debug('sync');
			obj.style.border='0';
			obj.style.fontSize='';
			time_left	=	bid_sync;
		}
		else if (time_left < 4 * 3600)
		{
			obj.style.color=(time_left <= 10)?'red':'black';
			obj.style.border=(time_left <= 60)?'solid 1px red':'0';
			obj.style.fontSize='';
			time_left	=	bid_pad(Math.floor(time_left/3600)) + ':' + bid_pad(Math.floor(time_left / 60) % 60) + ':' + bid_pad(time_left%60);
		}
		else
		{
			obj.style.color='black';
			obj.style.border='0';
			obj.style.fontSize='11px';
			time_left	=	bid_pad(Math.floor(time_left/3600)) + ':' + bid_pad(Math.floor(time_left / 60) % 60) + ':' + bid_pad(time_left%60) + ' ('+ item.end_time_day + '\xa0' + item.end_time_time + ')';
		}
	}
	bid_replace_text('bid_span_time_'+id,time_left,'');
	return min;
}

function bid_update()
{
	var t	=	Math.floor(((new Date()).getTime()-bid_time_offset)/1000);
	//naxo_debug(t);
	//var t	=	Math.floor(t);
	//var time	=	new Date(t*1000);
	//var now		=	bid_pad(time.getHours())+':'+bid_pad(time.getMinutes())+':'+bid_pad(time.getSeconds());
	//bid_replace_text('bid_now',now,'');
	var min		=	86400;
	//for (var i=0;i<bid_items.length;i++)
	for (var i in bid_items)
	{
		// XXX make sure we can actually format this a bit with sizes and colors etc.
		var item	=	bid_items[i];
		min		=	bid_update_time_left(item,t,min);
	}
	bid_update_xhr((min<10)?0:1);
	var timeout	=	1000-((new Date()).getTime()-bid_time_offset)%1000;
	//naxo_debug(bid_time_offset+' '+timeout);
	if (timeout < 50)
		timeout	+=	1000;
	timeout	+=	100;
	//timeout	=	3000;
	setTimeout(bid_update,timeout);
}

function bid_last_bid_move(what,i)
{
	var src	=	document.getElementById('last_bids_'+what+'_'+(i-1));
	var dst	=	document.getElementById('last_bids_'+what+'_'+i);

	if (!src || !dst || !src.firstChild)
		return;

	if (dst.firstChild)
	{
		dst.replaceChild(src.firstChild,dst.firstChild);
	}
	else
	{
		dst.appendChild(src.firstChild);
	}
}

function bid_last_bid_replace(what,text)
{
	var o	=	document.getElementById('last_bids_'+what+'_1');

	if (!o)
		return;

	var n	=	document.createTextNode(text);
	if (o.firstChild)
	{
		o.replaceChild(n,o.firstChild);
	}
	else
	{
		o.appendChild(n);
	}
}

var bid_counter=0;
function bid_update_xhr(min)
{
	if (bid_items.length <=0)
		return;
	if (bid_xhr_in_progress)
		return;
	bid_xhr_in_progress	=	1;
	var t	=	(new Date()).getTime();
	if (t < bid_last_xhr + min * 1000)
	{
		bid_xhr_in_progress	=	0;
		return;
	}
	var a	=	[];
	//for (var i=0;i<bid_items.length;i++)
	for (var i in bid_items)
	{
		var item	=	bid_items[i];
		if (item.status == 1 && (1 || (item.end_time < t / 1000 + 120) || !(bid_counter%10)))
		{
			a.push(item.id+'/'+item.raw_amount);
		}
	}
	bid_counter++;
	if (a.length <= 0)
	{
		bid_xhr_in_progress	=	0;
		return;
	}
	bid_last_xhr		=	t;
	var url	=	"/update?ids2="+a.join(',');
	if (bid_robot)
		url+="&robot="+bid_robot;
	var x = new XMLHttpRequest;
	x.onreadystatechange = function()
	{
		if (this.readyState == 4)
		{
			if (this.status == 200)
			{
				var t;
				try
				{
					t = eval("("+this.responseText+")");
				}
				catch(e)
				{
					naxo_debug(e);
					naxo_debug(this.responseText);
				}
				if (typeof(t.time) != 'undefined')
				{
					var new_offset=(new Date()).getTime()-t.time*1000;
					//naxo_debug('old '+bid_time_offset+' new '+new_offset);
					if (new_offset < bid_time_offset)
					{
						//naxo_debug('changing offset from '+bid_time_offset+' to '+new_offset);
						bid_time_offset	=	new_offset;
					}
					//if (t.time == 1252838002)
						//location.reload();
				}
				if (typeof(t.credits) != 'undefined')
				{
					bid_replace_text('bid_credits_left',t.credits,'');
					var o = document.getElementById('bid_credits_left');
					if (o)
						o.className='block3'+t.credits_color;
				}
				if (typeof(t.robot_bids_left) != 'undefined')
					bid_replace_text('robot_bids_left',t.robot_bids_left);
				if (typeof(t.users) != 'undefined')
					bid_replace_text('connected',t.users);
				//bid_items	=	t.items;
				var tt		=	Math.floor(((new Date()).getTime()-bid_time_offset)/1000);
				//t.items.push({ 'id': 69, 'raw_amount': 30, 'amount': '£0.30', 'user': 'toto', 'end_time': 1252749465, 'status': 1, 'time': '12/09/2009 02:55:10', 'type': 'Test bid' });
				if (typeof(t.items) != 'undefined')
				{
					for (var i=0;i<t.items.length;i++)
					{
						var item	=	t.items[i];
						var id		=	item.id;
						if (item.amount > bid_items[id].amount)
						{
							bid_items[id]	=	item;
							if (bid_in_progress[id])
							{
								if (typeof(bid_queue[id]) != 'undefined')
								{
									bid_queue[id].push(item);
								}
								else
								{
									bid_queue[id]=[item];
								}
							}
							else
							{
								bid_in_progress[id]=1;
								bid_replace_bid(id,item.amount,item.user);
								//bid_replace_text('bid_span_amount_'+id,item['amount'],'back1');
								//bid_replace_text('bid_span_user_'+id,item['user'],'');
								//if (item.status == 2)
								//{
									// auction is finished
									//time_left	=	bid_finished;
								//}
							}
							bid_update_time_left(item,tt,86400);
							// this should be moved to the queue handling to make it look nicer
							if (bid_last_bids_item && bid_last_bids_item == id)
							{
								for (var j=10;j>1;j--)
								{
									bid_last_bid_move('datetime',j);
									bid_last_bid_move('username',j);
									bid_last_bid_move('amount',j);
									bid_last_bid_move('type',j);
								}
								bid_last_bid_replace('datetime',item.time);
								bid_last_bid_replace('username',item.user);
								bid_last_bid_replace('amount',item.amount);
								bid_last_bid_replace('type',item.type);
							}
						}
						else
						{
							// copy it anyway, status might have changed
							bid_items[id]	=	item;
						}
					}
				}
			}
			bid_xhr_in_progress	=	0;
		}
	}
	x.open("GET",url,true);
	x.send(null);
}
