function Odds_changes(params) {
	var self = this;
	Changes.apply(this, [
		[
		new Ocha_ajax_handler({
			'get_updates' : function (data) {
				self._handle_data(data);
			}
		}),
		new Ocha_ajax_handler()
		]
	]);
	this._params = params;
}

extend(Odds_changes, Changes);

Odds_changes.prototype.update = function () {
	var bid = this._params['bid'] || null;
	var ot = this._params['ot'] || null;
	var pgid = this._params['pgid'] || null;
	var mgid = this._params['mgid'] || null;
	var date = this._params['date'] || null;
	var p = { 'bid' : bid, 'ot' : ot, 'pgid' : pgid, 'mgid' : mgid, 'date' : date, 'last' : this.get_last_update() };
	this.get_async_srv().get_updates(p);
}

Odds_changes.prototype._update_data = function (data) {
	var newdata = data;	
	if (newdata.length > 0) {
		var cdata = this.get_data();
		if (!cdata['changes'])
			cdata['changes'] = [];
		cdata['changes'].push(newdata);
		if (cdata['changes'].length > 20)
			cdata['changes'].shift();
	}
}

function Odds_changes_screen(ochanges, opts) {
	var self = this;
	// flags (ochanges flags): 2 - new offers, 4 - odds changes, 8 - otbs
	// sflags (screen flags): 1 - in-running
	var defaults = { 'flags' : (2|4), 'sflags' : 0, 'max_rows' : 250 };
	$.extend(defaults, opts);
	Changes_screen.apply(this, [ ochanges, defaults ]);
	
	this._ttdata = {};
	this._tts = new Tooltips(this._ttdata);
	this._lchanges = 0;
	var ost = Cookies.GetCookie("ost_cookie");
	this._ost = ost != null ? parseInt(ost) : 0;
}

extend(Odds_changes_screen, Changes_screen);

Odds_changes_screen.prototype.get_ost = function (ost) { 
	return this._ost; 
}

Odds_changes_screen.prototype.set_ost = function (ost) {
	var old = this._ost;
	this._ost = ost;
	return old;
}

Odds_changes_screen.prototype._add_updates = function () {
	var cdata = this.get_changes().get_data();
	if (cdata['changes']) {
		var changes = cdata['changes'];
		for (var i=0; i < changes.length; ++i) {
			this.update(changes[i]);
		}
	}
}

Odds_changes_screen.prototype.create = function () {
	var cont = this.get_container();
	while (cont.firstChild)
		cont.removeChild(cont.firstChild);
	var oct = document.createElement("table");
	this._oct = oct;
	oct.className = "oct";
	cont.appendChild(oct);
	
	this._add_updates();
}

Odds_changes_screen.prototype.refresh = function () {
	var cont = this.get_container();
	var oct = this._oct;	
	
	cont.removeChild(oct);
	while (oct.rows.length > 0) 
		oct.deleteRow(0);
	cont.appendChild(oct);

	this._add_updates();
}


Odds_changes_screen.prototype.update = function (data) {
	if (data.length == 0)
		return;
	var changes = data[0];
	if (changes.length == 0) 
		return;
	var partis = data[1];
	var books = data[2];
	var chist = data[3];

	var oct = this._oct;
	this._tts.remove_tt();
	var cont = this.get_container();
	cont.removeChild(oct);

	var ost = this._ost;

	var flags = this._opts.flags;
	var newoffers = flags & 2;
	var oddschanges = flags & 4;
	var otbs = flags & 8;
	
	var sflags = this._opts.sflags;
	var inrunnings = sflags & 1;
	
	var firstu = oct.rows.length == 0;	
	var cname = !firstu ? 'octnr' : 'octor';
	var nchanges = 0;
	var i = changes.length > this._opts.max_rows ? this._opts.max_rows-1 : changes.length-1;

	do { 
		var ch = changes[i];
		var boid = ch[8];
		var boidch = chist[boid]; 
			
		var newid = "ocha_" + boid;
		
		var f = ch[11];	
		var pe_time = ch[10];	
		var c_time = ch[14]; 

		var inrunning = c_time > pe_time;	
		
		if (f & 1) continue; // activate
		if (!otbs && (f & 8)) continue;
		if (!inrunnings && inrunning) continue;
		
		var po = null;	
		var ppo = null;
		if (boidch && boidch.length > 1) {
			for (var j=0; j < boidch.length; ++j) {
				if (boidch[j][0] <= ch[2]) break;
			}
			if (j < boidch.length-1) {
				po = boidch[j+1];
				if (j < boidch.length-2)
					ppo = boidch[j+2];
			}
		}	
			
		if (!((!po && newoffers) || (po && oddschanges) || (otbs && (f & 8)) || (inrunning && inrunnings)))
			continue;
	
		++nchanges;
		
		var peid = ch[9];
		var ot = ch[6];

		var r;
		if (oct.rows.length == 0) {
			r = oct.insertRow(0);
			for (var j=0; j < 11; ++j)
				r.insertCell(r.cells.length);
		}
		else {
			r = oct.rows[0].cloneNode(true);
			oct.tBodies[0].insertBefore(r, oct.rows[0]);
		}
	
		r.id = newid;	
	
		var odd;
		var podd; 
		var ppodd;

		var b = 0;	
		if (po) {
			if (Math.abs(ch[3]-po[1]) > 70)
				b = 1;
			else if (Math.abs(ch[4]-po[2]) > 70)
				b = 1;
			else if ((ot == 0 || ot == 1) && Math.abs(ch[5]-po[3]) > 70)
				b = 1;
		}
		
		if (b) r.className = "bmov";
		else r.className = cname;
		
		this._ttdata[newid] = this._create_title_str(ot, boidch); 

		var c;
		var nc = 0;
		
		c = r.cells[nc++];
		c.className = 'octtime';
		var d = new Date(c_time*1000);
		var dstr = Util.trim_num(d.getHours()) + ':' + Util.trim_num(d.getMinutes()) + ':' + Util.trim_num(d.getSeconds());
		c.innerHTML = dstr;
		
		c = r.cells[nc++];
		c.innerHTML = books[ch[7]];
		c.className = 'octbook';

		c = r.cells[nc++];
		c.className = 'octdate';
		c.innerHTML = Util.date_str2(new Date(pe_time*1000));
		
		c = r.cells[nc++];
		
		var bname = partis[ch[0]];
		bname += ' - ' + partis[ch[1]];

		c.innerHTML = '<a class="octbname" target="_blank" href="/cgi-bin/kvtest?type=ochtml&ot=' + ot + '&peid=' + peid + '&topbar=0">' + bname + '</a>';
		c.className = 'octteams';


		c = r.cells[nc++];
		c.className = 'octodd1';
		c.innerHTML = Oc_util.odd_str_s(ch[3], -1, po ? po[1] : 0, ost); 
		
		c = r.cells[nc++];
		c.className = 'octoddx';
		if (ot != 1) c.innerHTML = Oc_util.odd_str_s(ch[4], -1, po ? po[2] : 0, ost); 
		else c.innerHTML = '';

		c = r.cells[nc++];
		c.className = 'octodd2';
		if (ot == 0 || ot == 1) {
			c.innerHTML = Oc_util.odd_str_s(ch[5], -1, po ? po[3] : 0, ost); 
		}
		else
			c.innerHTML = ch[5];

		c = r.cells[nc++];
		c.innerHTML = '&nbsp;'; 
		
		c = r.cells[nc++];

		if (otbs && (f & 8)) {
			c.className = 'ocnewoffer';	
			c.innerHTML =  '***'; 
			c = r.cells[nc++];
			c.className = 'ocnewoffer';	
			c.innerHTML =  'OTB';
			c = r.cells[nc++];
			c.className = 'ocnewoffer';	
			c.innerHTML =  '***'; 
		}
		else if (!po) {
			c.className = 'ocnewoffer';	
			c.innerHTML =  '***'; 
			c = r.cells[nc++];
			c.className = 'ocnewoffer';	
			c.innerHTML =  'new';
			c = r.cells[nc++];
			c.className = 'ocnewoffer';	
			c.innerHTML =  '***'; 
		}
		else {
			c.className = 'octodd1';
			c.innerHTML = Oc_util.odd_str(po[1], ost); 
		
			c = r.cells[nc++];
			c.className = 'octoddx';
			if (ot != 1) c.innerHTML = Oc_util.odd_str(po[2], ost); 
			else c.innerHTML = '';

			c = r.cells[nc++];
			c.className = 'octodd2';
			if (ot == 0 || ot == 1)
				c.innerHTML = Oc_util.odd_str(po[3], ost); 
			else
				c.innerHTML = po[3];
		}

	} while (i--);


	if (!firstu) {
		var len = oct.rows.length;
		var i = len - this._opts.max_rows; 
		if (i > 0) {
			do {
				delete this._ttdata[oct.id];
				oct.deleteRow(--len);
			} while (i--);
		}

		var tn = nchanges+this._lchanges;
		if (tn > oct.rows.length) tn = oct.rows.length;
		for (var i=nchanges; i < tn; ++i) {
			var r = oct.rows[i];
			if (r.className.substr(-4) != 'bmov')
				oct.rows[i].className = 'octor';
		}
	
		this._lchanges = nchanges;	
	}
	
	cont.appendChild(oct);	
}
	
Odds_changes_screen.prototype._create_title_str = function (ot, chist) {
	var odds = [];
	for (var i=0; i < chist.length && i < 20; ++i) {
		var c = chist[i];
		odds.push( [ c[0], ot, c[1], c[2], c[3] ] );
	}
	return this._create_title_html(odds, 0);
}
	
Odds_changes_screen.prototype._create_title_html = function (odds, of) {
	var s = "<table class=\"tt\">";

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

