function Oc_screen(ocd) 
{
	var self = this;
	var ocdiv = ocd;
	var octable = null;
	var d = document;
	var xml = new Xml();

	var update_timer_id = null;
	var updating = 0;
	var last_update = 0;
	var cur_time = 0;

	var books = new Array();
	var boid_odds = new Array();
	var peid_boids = new Array();
	var boid_peid = new Array();
	var cells = new Array();
	var drag = new Drag();

	var sel_ot;
	var sel_bids;
	var sel_pgid;
	var sel_of;
	var sel_lastminutes;

	this.timer = function () {
		if (updating == 1) return;

		reload_data(update);
			
		return true;
	}
	
	this.init = function (ot, bids, grp, of, lastmins)
	{
		sel_ot = ot;
		sel_bids = bids;
		sel_pgid = grp;
		sel_of = of;
		sel_lastminutes = lastmins;

		updating = 0;
		last_update = 0;
	}

	this.start = function ()
	{
		create();
		reload_books();
		reload_data(create_table);
		update_timer_id = setInterval(self.timer, 10000);
	}

	this.stop = function () 
	{
		clearInterval(update_timer_id);	
	}


	function get_elem_name(name) {
		return ocdiv.id + "_" + name;
	}

	function get_elem(name) {
		return d.getElementById(get_elem_name(name));
	}

	//// reload ...

	function reload_data(func) {
		var param = "";
		if (last_update != 0) {
			param += "&last=" + (last_update);
		}
		param += "&bid=" + sel_bids.join();
		param += "&ot=" + sel_ot;
		param += "&pgid=" + sel_pgid;
		xml.load_data("data.php?" + param, func, false);
	}

	function reload_books()
	{
		function f(data) { books = data; }

		xml.load_data("books.php", f, false);
	}

	//// apu

	function remove_peid(peid) 
	{
		for (id in peid_boids[peid]) {
			var boid = peid_boids[id];
			delete boid_odds[boid];
			delete boid_peid[boid];
			delete cells[get_elem_name("boid_" + boid)];
		}

		delete peid_boids[peid];
	}

	function remove_row(e) 
	{
		var t = get_evt_obj(e);
		var r = t.parentNode;
		r.id.search(/row\_(\d+)/);
		var peid = RegExp.$1;
		r.parentNode.removeChild(r);
		remove_peid(peid);
	}

	//// table...

	function create() 
	{
		ocdiv.appendChild(d.createTextNode("Loading..."));
	}

	function clear_table()
	{
		var t = octable;

		while (t.rows.length > 0) {
			t.deleteRow(t.rows.length-1);
		}
	}
	
	function create_table(odds_data)
	{
		ocdiv.removeChild(ocdiv.firstChild);
		octable = d.createElement("table");
		ocdiv.appendChild(octable);	
		
		do_create_table(odds_data);	
		update_table();
	}


	function do_create_table(odds_data)
	{
		last_update = odds_data[0][0][0];
		cur_time = odds_data[0][0][1];

		var t = octable;
		var of = sel_of;

		peid_boids = new Array();
		boid_peid = new Array();
		boid_odds = new Array();

		var info = odds_data[0];
		var all_books = info[1];

		// bidsiin bookit oikeassa jarjestyksessa
		var bids = new Array();
		var sbids = sel_bids;
		for (var i=0; i < sbids.length; ++i) {
			var j;
			for (j=0; j < all_books.length; ++j) {
				if (all_books[j][0] == sbids[i]) break;
			}
			if (j == all_books.length) continue;
			bids.push(sbids[i]);
		}

		var grps = odds_data[1];
		for (var i=0; i < grps.length; ++i) {
			var grp = grps[i][0];
			var pevts = grps[i][1];

			// side
			if (i == 0) {
				t.insertRow(t.rows.length); // headille

				for (var i=0; i < pevts.length; ++i) {
					var row = t.insertRow(t.rows.length);
					row.id = "row_" + pevts[i][0][0];
					row.className = "oddrow" + ((i % 2) ? "even" : "odd");
					var cell = row.insertCell(row.cells.length);
					cell.onmouseout = function () { document.body.style.cursor = "default"; }
					cell.onmouseover = function () { document.body.style.cursor = "pointer"; }
					cell.innerHTML = "x";
					add_listener(cell, "click", remove_row);

					cell = row.insertCell(row.cells.length);
					cell.className = "date";
					var date = new Date(pevts[i][0][1]*1000);
					cell.innerHTML = Util.date_str(date);
	 				cell = row.insertCell(row.cells.length);
					cell.className = "teams";
					cell.innerHTML = "<a target=_blank href=\"http://www.tip-ex.com/cgi-bin/kvtest?type=ochtml&peid=" + pevts[i][0][0] + "\">" + pevts[i][0][2] + "<br>" + pevts[i][0][3] + "</a>";
				}
		
			}


			for (var j=0; j < pevts.length; ++j) {
				var pevt = pevts[j][0];
				var peid = pevt[0];
				var pevtbooks = pevts[j][1];
				
				peid_boids[peid] = new Array();

				// head
				if (j == 0) {
					var row = t.rows[j];

					var cell = row.insertCell(row.cells.length);
					cell = row.insertCell(row.cells.length);
					cell.innerHTML = "";
					cell = row.insertCell(row.cells.length);
					cell.innerHTML = "";

					for (var k=0; k < bids.length; ++k) {
						var cell = row.insertCell(row.cells.length);
						cell.className = "bname";
						var bname = books[bids[k]];
						var bid = bids[k];
						cell.innerHTML = "<a class=bname target=_blank href=\"/click.php?action=click&bid=" + bid + "\">" + bname + "</a>";
					}
				}

				var row = t.rows[j+1];

				// otetaan parhaat kertoimet
				var bodds = new Array(0, 0, 0);
				var _lbid = 0;
				for (var k=0; k < pevtbooks.length; ++k) {
					var odds = pevtbooks[k][1];
					// rumaa... pevtbooks:ssa voi olla 
					// useita bid,boid:eja, otetaan eka
					if (_lbid != 0 && pevtbooks[k][0][0] == _lbid) 
						continue;
					_lbid = pevtbooks[k][0][0];
					if (odds[0][2] > bodds[0]) bodds[0] = odds[0][2];
					if (odds[0][3] > bodds[1]) bodds[1] = odds[0][3];
					if (odds[0][4] > bodds[2]) bodds[2] = odds[0][4];
				}

				for (var k=0; k < bids.length; ++k) {
					var curbid = bids[k];

					var cell = row.insertCell(row.cells.length);
					cell.className = "odds";
					cell.innerHTML = "&nbsp;";
		
					// etsitaan book:n kerroin
					_lbid = 0;
					for (var l=0; l < pevtbooks.length; ++l) {
						if (_lbid != 0 && pevtbooks[l][0][0] == _lbid) 
							continue;
						_lbid = pevtbooks[l][0][0];

						var book = pevtbooks[l][0];
						if (book[0] == curbid) {
							var odds = pevtbooks[l][1];
							var boid = odds[0][5];

							var name = "boid_" + boid;
							if (odds.length > 10)
								odds.length = 10;

							boid_odds[boid] = odds; 
							peid_boids[peid].push(boid);
							cell.id = get_elem_name(name);
							cell.title = title_str(odds, of);
							cell.innerHTML = odds_str(odds[0], bodds, 0, of);	
							cells[cell.id] = cell;

							boid_peid[boid] = peid;
							break;
						}
					}
				}
			}
		}	

		drag = new Drag();
		drag.init(octable);

		updating = 0;
	}


	//// update ...

	function update(odds_data)
	{
		if (odds_data == undefined) return;
		if (odds_data.length == 0) return;
		if (cur_time == odds_data[0][0][1]) return;

		last_update = odds_data[0][0][0];
		cur_time = odds_data[0][0][1];

		update_data(odds_data);
		update_table();
	}

	function update_data(odds_data) 
	{
		function up_grps(grps) {
			for (var i=0; i < grps.length; ++i) {
				var grp = grps[i][0];
				var pevts = grps[i][1];
				
				up_pevts(pevts);
			}
		}

		function up_pevts(pevts) {
			for (var j=0; j < pevts.length; ++j) {
				var pevt = pevts[j][0];
				var peid = pevt[0];

				// onko peid naytolla?
				if (peid_boids[peid] == undefined) continue;

				var books = pevts[j][1];
				up_books(books);
			}
		}

		function up_books(books) {
			// pevt:n paivitykset
			for (var k=0; k < books.length; ++k) {
				var book = books[k][0];
				var bid = book[0];
				up_boid_odds(books[k][1]);
			}

		}

		function up_boid_odds(odds) {
			// paivitetaan kertoimia boid_odds:ssa
			for (var l=odds.length-1; l >= 0; --l) {
				var odd = odds[l];
				var boid = odd[5];

				var oddstbl = boid_odds[boid];

				// onko boid naytolla?
				if (oddstbl == undefined) continue;

				// etsitaan oikea kohta p:hen
				var p = 0;
				for (; p < oddstbl.length; ++p) {
					if (odd[0] > oddstbl[p][0]) break;
				}

				// IE unshift?
				for (var z=oddstbl.length; z > p; --z) 
					oddstbl[z] = oddstbl[z-1];
				oddstbl[p] = odd;

				if (oddstbl.length > 10)
					oddstbl.length = 10;
			}


		}
		
		var grps = odds_data[1];
		up_grps(odds_data[1]);

	}

	function update_table()
	{
		var of = sel_of;
		var t = octable;

		var peids = new Array();
		var fresh_boids = new Array();

		for (boid in boid_odds) {
			var odds = boid_odds[boid];
			var peid = boid_peid[boid];

			var name = "boid_" + boid;
			var o = cells[get_elem_name(name)];		
	
			var time = odds[0][0];

			if (cur_time - time > 60*sel_lastminutes) {
				if (o.className == "uodds") {
					peids[peid] = 1;
					o.className = "odds";
				}
			}
			else {
				fresh_boids[boid] = 1;
				if (o.className == "odds") {
					peids[peid] = 1;
					o.className = "uodds";
				}
			}
			

		}

		for (peid in peids) {
			// otetaan parhaat
			var bodds = new Array(0, 0, 0);
			for (var j=0; j < peid_boids[peid].length; ++j) {
				var boid = peid_boids[peid][j];
				var odd = boid_odds[boid][0];
				if (odd[2] > bodds[0]) bodds[0] = odd[2];	
				if (odd[3] > bodds[1]) bodds[1] = odd[3];	
				if (odd[4] > bodds[2]) bodds[2] = odd[4];	
			}

			// paivitetaan pevt-rivi
			for (var j=0; j < peid_boids[peid].length; ++j) {

				var boid = peid_boids[peid][j];
				var odds = boid_odds[boid];

				var e = cells[get_elem_name("boid_" + boid)];

				var podds = 0;
				if (fresh_boids[boid] == 1) {
					e.title = title_str(odds, of);
					podds = odds.length > 0 ? odds[1] : null;
				}

				e.innerHTML = odds_str(odds[0], bodds, podds, of);
			}

		}

	}

	function title_str(odds, of)
	{
		var s = "";

		for (var i=0; i < odds.length; ++i) {
			var o = odds[i];
			var datestr = Util.date_str2(new Date(o[0]*1000));
			if (o[1] == 0) 
				s += Oc_util.odd_str(o[2], of) + " " + Oc_util.odd_str(o[3], of) + " " + Oc_util.odd_str(o[4], of) + " " + datestr + "\n";
			else if (o[1] == 1) 
				s += Oc_util.odd_str(o[2], of) + " " + Oc_util.odd_str(o[4], of) + " " + datestr + "\n";
			else if (o[1] == 3 || o[1] == 4 || o[1] == 5) 
				s += Oc_util.odd_str(o[2], of) + " " + Oc_util.odd_str(o[3], of) + " " + o[4] + " " + datestr + "\n";
			
		}
		return s;
	}

	function odds_str(odd, bodds, podd, of)
	{
		var s = "";

		if (of == undefined) of = 0;

		if (odd[1] == 0) {
			s = "<table><td>";
			s += Oc_util.odd_str_s(odd[2], bodds[0], podd ? podd[2] : 0, of);
			s += "<br>";
			s += Oc_util.odd_str_s(odd[4], bodds[2], podd ? podd[4] : 0, of);
			s += "</td><td>";
			s += Oc_util.odd_str_s(odd[3], bodds[1], podd ? podd[3] : 0, of);
			s += "</td></table>";
		}
		else if (odd[1] == 1) {
			s = "<table><td>";
			s += Oc_util.odd_str_s(odd[2], bodds[0], podd ? podd[2] : 0, of);
			s += "<br>";
			s += Oc_util.odd_str_s(odd[4], bodds[2], podd ? podd[4] : 0, of);
			s += "</td></table>";
		}
		else {
			s = "<table><td>";
			s += Oc_util.odd_str_s(odd[2], -1, podd ? podd[2] : 0, of);
			s += "<br>";
			s += Oc_util.odd_str_s(odd[3], -1, podd ? podd[3] : 0, of);
			s += "</td><td>";
			s += odd[4];
			s += "</td></table>";
		}

		return s;
	}

}
