/*
 * Homepage Main Event Static JS (using Orbis Push Server)
 */
 
 // ensure CVS revision number survives minification
var dummy = '$Id: me.js,v 1.1.4.7 2010-05-11 16:08:35 ndoukas Exp $';

function me_init(call_type, events, markets, selcns,
	server_time_year, server_time_month, server_time_day,
	server_time_hour, server_time_min, server_time_sec, date, init_msg_id, cfg) {

	
	//init up the array of channels we will subscribe to
	var channels = [];
	
	if (_me_loaded == 1) {
		return;
	}
	
	_me_loaded = 1;
	
	_me_last_msg_id = init_msg_id;
	

	for (var f in cfg) _me_cfg[f] = cfg[f];
	
	if (call_type == "http") {
		_me_store_templates();
		_me_event_hash  = {};
		_me_evmkt_hash  = {};
		_me_selcn_hash  = {};

		scone_create(_me_events_id_prefix, {}, _me_cmp_events, null);
		
		var first_build = true;
		
		// initialize the clock stuff
		initPeriodClocks(server_time_year, server_time_month, server_time_day, server_time_hour, server_time_min, server_time_sec, _me_cfg.lang);
		
	} else {
		// clear out any types and events markets and selections that aren't in the latest
		// data from the ajax request
		_me_remove_EVENTS(events);
		_me_remove_EVMKTS(markets);
		_me_remove_SELCNS(selcns);
		var first_build = false;
	}

	_me_server_date = date;
	_me_system_date = new Date().getTime();
	
	// Pretend that the initial state we've just been given has been received
	// as push server messages.
	if (events.length > 0) {
		_me_got_EVENT(events[0], first_build);
		
		_me_ev_id = events[0].ev_id;
		
		if (!_me_channels["EVENT"+events[0].ev_id]) {
			//subscribe to this event (not it's children though)
			channels.push("sEVENT" + ps_connect_lpad_id(events[0].ev_id));
			// add to the hash to we can't subscribe again
			// on the next ajax refresh
			_me_channels["EVENT"+events[0].ev_id] = true;
		}
	}

	
	for (var i = 0; i < markets.length; i++) {
		
		if (!_me_evmkt_hash[markets[i].ev_mkt_id] && markets[i].ev_id == _me_ev_id) {
			_me_got_EVMKT(markets[i], first_build);
			
			_me_mkt_id = markets[i].ev_mkt_id;
			
			if (!_me_channels["MARKET"+markets[i].ev_mkt_id]) {
				//subscribe to this market (and it's children)
				channels.push("sEVMKT" + ps_connect_lpad_id(markets[i].ev_mkt_id));
				channels.push("SEVMKT" + ps_connect_lpad_id(markets[i].ev_mkt_id));
				// add to the hash to we can't subscribe again
				// on the next ajax refresh
				_me_channels["MARKET"+markets[i].ev_mkt_id] = true;
			}
		}
		
		
	}
	
	for (var i = 0; i < selcns.length; i++) {
		if ((!_me_selcn_hash[selcns[i].ev_oc_id]) && selcns[i].ev_mkt_id == _me_mkt_id) {
			_me_got_SELCN(selcns[i], first_build);
		}
	}
	
	// only register the new channels if there were any
	if (channels.length > 0) {
		ps_connect_register("me"+me_idx, _me_got_msg, channels, init_msg_id);
		me_idx++;
	}
	
	var me_area_elem = document.getElementById(_me_events_id_prefix);
	var no_data_elem = document.getElementById(_me_no_data_area_id);
	
	var ev_ids = scone_get_items(_me_events_id_prefix);
	
	//Display event div or no event div
	if (ev_ids.length == 0 ) {
		me_area_elem.style.display = "none";
		no_data_elem.style.display = "";
	} else {
		me_area_elem.style.display = "";
		no_data_elem.style.display = "none";
	}
	
	//Make sure percentage bars add up to 100
	//Only works if event has market id and tot_bets is valid value
	if (_me_mkt_id != "" && _me_evmkt_hash[_me_mkt_id].tot_bets != -1) {
		_me_update_percentages(_me_mkt_id);
	}
	
	return;
}


/* -------- HTML TEMPLATES and ELEMENT IDs -------- */

/*
 * These are the element ids (or prefixes thereof) with special meaning.
*/

var _me_no_data_area_id         = "no_me_data";

var _me_events_id_prefix        = "me_events";
var _me_event_id_prefix         = "me_event_";

var _me_evmkts_id_prefix        = "me_evmkts_";
var _me_evmkt_id_prefix         = "me_evmkt_";

var _me_selcns_id_prefix        = "me_selcns_";
var _me_selcn_id_prefix         = "me_selcn_";

var _me_event_clock_id_prefix   = "me_clock_";

var _me_price_id_prefix         = "me_price_";

var _me_event_hash  = {};
var _me_evmkt_hash  = {};
var _me_selcn_hash  = {};

/*
** Hash top prevent us subscribing to channels multiple times
*/

var _me_ev_id = "";
var _me_mkt_id = "";

var _me_channels = {};
var me_idx = 0;

var _me_loaded = 0;
/*
 * These are the templates used to construct and update the live betting
 * homepage page. See tmpl.js for syntax details.
 */
	
function _me_store_templates() {
	
	tmpl_store("me_event", ''
	+ '	<div class="me_event" id="me_event_<%ev_id%>">\n'
	+ '		<div class="label" <%IF ev_has_bet_in_run == "N" || !in_past%>onclick="me_go_mevt_no_bir(<%ev_id%>,<%ev_type%>)"<%ELSE%>onclick="me_go_mevt_bir(<%ev_id%>,<%ev_type%>)"<%END%>><strong><%class_name%></strong> - <a href="javascript:void(0)"><%name%></a>'
	+ '		<div class="score_and_time"><%IF in_past%><%IF score_home != "" && score_away != ""%> <%score_home%> - <%score_away%><%END%> <%IF ev_type=="FB" && period_id!="" && show_bir_clocks == "Y"%><div class="time" id="me_clock_<%ev_id%>"></div><%ELSE%><div class="time"><%time%></div><%END%><%ELSE%><div class="time"><%time%></div><%END%></div>\n'
	+ '		</div>'
	+ '		<%IF !bettable%><div class="hp_main_event_suspended"><%XL HP_MAIN_EVENT_SUSPENDED%></div><%END%>\n'
	+ '		<div id="me_evmkts_<%ev_id%>"></div>\n'
	+ '	</div>\n'
	);
	
	
	tmpl_store("me_evmkt", ''
	+ '	<div class="me_evmkt" id="me_evmkt_<%ev_mkt_id%>">\n'
	+ '		<div <%IF !parent_bettable%>style="display:none"<%END%> id="me_selcns_<%ev_mkt_id%>"></div>\n'
	+ '	</div>\n'
	);
	
	tmpl_store("me_selcn",''
	+ '	<div class="me_selcn" id="me_selcn_<%ev_oc_id%>">\n'
	+ '		<div class="left">\n'
	+ '			<div class="greyBar">\n'
	+ '				<div class="blueBar" style="width: <%b_perc%>\%" id="bar_<%ev_oc_id%>">\n'
	+ '				</div>\n'
	+ '			</div>\n'
	+ '		</div>\n'
	+ '		<div class="left"><div id="perc_<%ev_oc_id%>" class="left percent"><%b_perc%>\% </div><div class="left team"><a href="javascript:void(0)" <%IF bettable%>onclick="me_add_bet(<%ev_oc_id%>)"<%END%>><strong><%name%></strong></a></div></div>\n'
	+ '		<div <%IF bettable%>class="odd right"<%ELSE%>class="odd suspended right"<%END%>><a <%IF bettable%>title="Click to add to Betslip"<%END%> id="me_price_<%ev_oc_id%>" <%IF bettable%>onclick="me_add_bet(<%ev_oc_id%>)"<%END%>><%price_str%></a></div>\n'
	+ '	</div>\n'
	);


}


/* ---------- PRIVATE --------- */

/* Default config items: (can be overriden by me_init call) */
var _me_cfg = {
	lang                    : "en",
	bet_threshold           : 1,
	name_truncate_threshold : 8,
	price_str_type          : "ODDS",
	price_str_type_ah       : "DECIMAL",
	price_str_type_hl       : "DECIMAL",
	price_str_sep           : "-"
};

var _me_server_date      = "";
var _me_system_date      = 0;

/*
 * Called whenever we receive any published message from the Push Server.
 */
function _me_got_msg(msg) {

	var data = {};


	if         (msg.subject_level == "sPRICE") {
		eval("data = " +  msg.data + ";");
		data.ev_oc_id = msg.subject_id;
		_me_got_PRICE(data);
	} else if (msg.subject_level == "sSELCN") {
		eval("data = " +  msg.data + ";");
		data.ev_oc_id = msg.subject_id;
		_me_got_SELCN(data,false);
	} else if (msg.subject_level == "sEVMKT") {
		eval("data = " +  msg.data + ";");
		data.ev_mkt_id = msg.subject_id;
		_me_got_EVMKT(data,false);
	} else if (msg.subject_level == "sMHCAP") {
		eval("data = " +  msg.data + ";");
		data.ev_mkt_id = msg.subject_id;
		_me_got_MHCAP(data);
	} else if (msg.subject_level == "sEVENT") {
		eval("data = " +  msg.data + ";");
		data.ev_id = msg.subject_id;
		_me_got_EVENT(data,false);
	} else {
		// presumably this msg wasn't intended for us
	}

	return;
}

function _me_got_EVENT(data, first_build) {
	
	// Determine if this is a new item and if not, make a note of
	// some of the original properties of the item. We then copy
	// fields from the message to the item's info object.
	
	var info = _me_event_hash[data.ev_id];
	var is_new_item = !info;
	var orig_bettable;

	if (is_new_item) {
		info = data;
		_me_event_hash[data.ev_id] = info;
		info.child_hash = {};
		// register this event with the clock JS

		addClockEvent(data.ev_id, data.periods, _me_event_clock_id_prefix);
		

	} else {
		orig_bettable = info.bettable;
		for (var f in data) {
			info[f] = data[f];
		}
	}

	// Derive additional properties of the item.
	info.name = info.names[_me_cfg.lang];
	info.start_time_xl = info.start_time_xls[_me_cfg.lang];
	info.bettable = (info.status == "A");
	info.img_url = _me_cfg.image_url;
	info.ev_type = "\'"+info.ev_class_type+"\'";
	
	var susp_time_ms = 0;
	var start_time = time_in_milliseconds(info.start_time);
	
	if (info.suspend_at != "") {
		susp_time_ms = time_in_milliseconds(info.suspend_at);
	}
	
	var cur_time = time_in_milliseconds(_me_server_date) + ((new Date().getTime()) - _me_system_date);
	var start_time_dif = cur_time - start_time;
	var susp_time_dif = cur_time - susp_time_ms;
	
	if (info.ev_has_bet_in_run == "N" && info.displayed == "Y") {
	
		if (info.is_off == "Y") {
			info.displayed = "N";
		} else if (info.is_off == "_" && start_time_dif > 0) {
			info.displayed = "N";
		} else if (info.is_off == "N" && susp_time_dif > 0) {
			info.displayed = "N";
		}
	
	}
	
	if (start_time_dif > 0) {
		info.in_past = 1;
	} else {
		info.in_past = 0;
	}
	
	info.time = _me_calculate_time_to_start(cur_time, start_time);
	// Id of the element (and scone item) for the event.
	var scitem_id = _me_event_id_prefix + info.ev_id;
	// Id of the element (and scone) holding the events.
	var pscone_id = _me_events_id_prefix;

	
	var html = tmpl_play("me_event", info);
	
	var sort_info = {
		disporder: info.disporder,
		ev_id: info.ev_id
	}
	
	var me_area_elem = document.getElementById(_me_events_id_prefix);
	var no_data_elem = document.getElementById(_me_no_data_area_id);

	var was_visible = scone_item_exists(scitem_id);
	var now_visible = false;
	if (info.displayed == "Y") {
		now_visible = true;
	}
	
	if (!was_visible && now_visible) {
		// add the event scone
		scone_add_item(pscone_id, scitem_id, html, sort_info);
		// Create a scone to hold the markets' HTML.
		var cscone_id = _me_evmkts_id_prefix + data.ev_id;
		scone_create(cscone_id, {}, _me_cmp_evmkts, null);
		
		me_area_elem.style.display = "";
		no_data_elem.style.display = "none";
		
	} else if (was_visible && now_visible) {
		scone_replace_item(scitem_id, html, sort_info, true);
	} else if (was_visible && !now_visible) {
		scone_remove_item(scitem_id);
		
		var ev_ids = scone_get_items(_me_events_id_prefix);
		if (ev_ids.length == 0) {
			me_area_elem.style.display = "none";
			no_data_elem.style.display = "";
		}
	}
	
	// update the clocks
	//updatePeriodClock(info);
	
		// Make any changes needed elsewhere.
	// Some changes require us to progagate dummy msgs for our children.
	if (now_visible && (!was_visible || orig_bettable != info.bettable)) {
		for (var ev_mkt_id in info.child_hash) {
			_me_got_EVMKT({
				ev_mkt_id:  ev_mkt_id,
				ev_id:      info.ev_id
			},first_build);
		}
	}

	
}

function _me_got_EVMKT(data, first_build) {
	// Check we've heard of the parent - ignore if not.
	// Otherwise, get info for parent and ensure he knows of us.
	var parent_info = _me_event_hash[data.ev_id];
	
	if (!parent_info) {
		return;
	}
	
	parent_info.child_hash[data.ev_mkt_id] = true;
	
	// Determine if this is a new item and if not, make a note of
	// some of the original properties of the item. We then copy
	// fields from the message to the item's info object.
	
	var info = _me_evmkt_hash[data.ev_mkt_id];
	
	var is_new_item = !info;
	
	var orig_displayed;
	var orig_disporder;
	var orig_name;
	var orig_bettable;
	var orig_hcap_values;

	if (is_new_item) {
		info = data;
		_me_evmkt_hash[data.ev_mkt_id] = info;
		info.child_hash = {};
	} else {
		orig_displayed   = info.displayed;
		orig_disporder   = info.disporder;
		orig_name        = info.name;
		orig_bettable    = info.bettable;
		orig_hcap_values = info.hcap_values;
		for (var f in data) {
			info[f] = data[f];
		}
	}
	
	// Derive additional properties of the item.

	info.is_new = 
	  (is_new_item  && !first_build) || 
	  (!is_new_item && orig_displayed != info.displayed && info.displayed == "Y");
	info.name = info.names[_me_cfg.lang];
	info.bettable = (info.status == "A") && parent_info.bettable;
	info.parent_bettable = parent_info.bettable;
	if (info["blurb"] == undefined) {
		info.blurb = "";
	}
	
	

	// Id of the element (and scone item) for the market.
	var scitem_id = _me_evmkt_id_prefix + data.ev_mkt_id;
	// Id of the element (and scone) holding the marketss.
	var pscone_id = _me_evmkts_id_prefix + parent_info.ev_id;
	
	var html = tmpl_play("me_evmkt", info);
	
	var sort_info = {
		disporder: info.disporder,
		ev_mkt_id: info.ev_mkt_id
	}
	
	var was_visible = scone_item_exists(scitem_id);
	var now_visible = false;
	if (info.displayed == "Y") {
		now_visible = true;
	}
	
	//Only add market if the number of bets is above the threshold
	if (info.tot_bets>=_me_cfg['bet_threshold']) {
		if (!was_visible && now_visible) {
			// add the market scone
			scone_add_item(pscone_id, scitem_id, html, sort_info);
			// Create a scone to hold the selections' HTML.
			var cscone_id = _me_selcns_id_prefix + data.ev_mkt_id;
			scone_create(cscone_id, {}, _me_cmp_evmkts, null);
		} else if (was_visible && now_visible) {
			scone_replace_item(scitem_id, html, sort_info, true);
			
		} else if (was_visible && !now_visible) {
			scone_remove_item(scitem_id);
		}
	
	}
	
	// may need to make changes needed elsewhere.
	// Some changes require us to progagate dummy msgs for our children.
	if (now_visible && (!was_visible || orig_bettable != info.bettable)) {
		for (var ev_oc_id in info.child_hash) {
			_me_got_SELCN({
				ev_oc_id:  ev_oc_id,
				ev_mkt_id: info.ev_mkt_id
			},first_build);
		}
	}
}

function _me_got_SELCN(data, first_build) {
	// Check we've heard of the parent - ignore if not.
	// Otherwise, get info for parent and ensure he knows of us.
	
	var parent_info = _me_evmkt_hash[data.ev_mkt_id];
	var parent_parent_info = _me_event_hash[parent_info.ev_id];
	if (!parent_info) {
		return;
	}
	parent_info.child_hash[data.ev_oc_id] = true;
	
	// Determine if this is a new item and if not, make a note of
	// some of the original properties of the item. We then copy
	// fields from the message to the item's info object.

	var info = _me_selcn_hash[data.ev_oc_id];
	var is_new_item = !info;

	var orig_lp_num;
	var orig_lp_den;
	
	if (is_new_item) {
		info = data;
		_me_selcn_hash[data.ev_oc_id] = info;
	} else {
		orig_lp_num   = info.lp_num;
		orig_lp_den   = info.lp_den;
		orig_hcap_values = info.hcap_values;
		for (var f in data) {
			info[f] = data[f];
		}
	}
	

	
	// Derive additional properties of the item.
	
		
	var b_perc = Math.round(100*info.bets/parent_info.tot_bets);
	
	info.b_perc = parseInt(b_perc);
	
	info.name = info.names[_me_cfg.lang];
	info.name = info.name.truncate(_me_cfg.name_truncate_threshold, '...');
	if ( info.fb_result && 
	     parent_info.hcap_values ) {
		info.hcap_value = parent_info.hcap_values[info.fb_result];
	}
	info.bettable = (info.status == "A") && parent_info.bettable;
	
	info.price_str = me_get_price_str(
	  info.lp_num,
	  info.lp_den,
	  parent_info.lp_avail,
	  parent_info.mkt_sort
	);
	
	// Id of the element (and scone item) for the selection.
	var scitem_id = _me_selcn_id_prefix + info.ev_oc_id;
	// Id of the element (and scone) holding the selections.
	var pscone_id = _me_selcns_id_prefix + parent_info.ev_mkt_id;

	// If the parent is not visible, there is no need to do any display work.
	

	if (!scone_exists(pscone_id)) {
		
		return;
	}
	
	var html = tmpl_play("me_selcn", info);
	
	var sort_info = {
		disporder : info.disporder,
		lp_num    : info.lp_num,
		lp_den    : info.lp_den,
		ev_oc_id  : info.ev_oc_id
	}
	
	var was_visible = scone_item_exists(scitem_id);
	var now_visible = (info.displayed == "Y");
	
	if (parent_parent_info.displayed == "N") {
		now_visible == false;
	}
	
	if (!was_visible && now_visible) {
		// add the selection scone
		scone_add_item(pscone_id, scitem_id, html, sort_info);
	} else if (was_visible && now_visible) {
		scone_replace_item(scitem_id, html, sort_info, true);
		
	} else if (was_visible && !now_visible) {
		scone_remove_item(scitem_id);
	}


}


// Handle price message.
function _me_got_PRICE(data) {

	// Check we've heard of the selection and market.

	var info = _me_selcn_hash[data.ev_oc_id];
	if (!info) return;

	var parent_info = _me_evmkt_hash[info.ev_mkt_id];
	if (!parent_info) return;

	// Copy data from message to info object, making
	// a note of some original properties first.

	var orig_lp_num = info.lp_num;
	var orig_lp_den = info.lp_den;

	for (var f in data) {
		info[f] = data[f];
	}

	// The element id (and scone item id) for the selection.

	var scitem_id = _me_selcn_id_prefix + data.ev_oc_id;
	if (!scone_item_exists(scitem_id)) return;

	// Selections are sorted by price (amongst other things),
	// so we may need to reposition the selection.

	var sort_info = {
		disporder : info.disporder,
		lp_num    : info.lp_num,
		lp_den    : info.lp_den,
		ev_oc_id  : info.ev_oc_id
	};
	scone_set_item_info(scitem_id, sort_info);

	// Find where the new price needs to go.

	var price_id = _me_price_id_prefix + info.ev_oc_id;
	var price_el = document.getElementById(price_id);
	if (!price_el) return;

	// Generate new price string and store it.

	info.price_str = me_get_price_str(
	  info.lp_num,
	  info.lp_den,
	  parent_info.lp_avail,
	  parent_info.mkt_sort
	);
	price_el.innerHTML = info.price_str;
	return;
}


// Handle market handicap message.
function _me_got_MHCAP(data) {

	// Get parent & item info.

	var parent_info = _me_event_hash[data.ev_id];
	var info = _me_evmkt_hash[data.ev_mkt_id];

	if (!parent_info || !info) return;

	// Copy fields from the message to the item's info object.

	for (var f in data) {
		info[f] = data[f];
	}

	// Progagate handicap change to children with dummy msgs.

	for (var ev_oc_id in info.child_hash) {
		_me_got_SELCN({
			ev_oc_id:  ev_oc_id,
			ev_mkt_id: info.ev_mkt_id
		});
	}

	return;
}

// Compare two events
function _me_cmp_events(cmpMode, evA, evB) {
	var d = evA.disporder - evB.disporder;
	if (d<0){
		return -1;
	} else if (d==0) {
		return 0;
	} else {
		return 1;
	}

}

// Compare two event markets
function _me_cmp_evmkts(cmpMode, mktA, mktB) {
	var d = mktA.disporder - mktB.disporder;
	
	if (d) return d;
	
	return mktA.ev_mkt_id - mktB.ev_mkt_id;
}

// Compare two selections (for sorting within a market).
function _me_cmp_selcns(cmpMode, selcnA, selcnB) {
	var d = selcnA.disporder - selcnB.disporder;
	if (d) return d;
	if (selcnA.lp_num && !selcnB.lp_num) {
		return -1;
	} else if (!selcnA.lp_num && selcnB.lp_num) {
		return +1;
	} else if (selcnA.lp_num && selcnB.lp_num) {
		d = (selcnA.lp_num * selcnB.lp_den) - (selcnA.lp_den * selcnB.lp_num);
		if (d) return d;
	}
	return selcnA.ev_oc_id - selcnB.ev_oc_id;
}

// Defunct ajax reload stuff from BIR homepage
// SP Homepage does not use ajax to reload

/*
// Reload main event
function _me_reload() {
	if (_me_cfg.reload_url == "") return;
	var clientdata = {
		id : 'main_event_js'
	};
	
	// add the hash
	var url = _me_cfg.reload_url + "&hash=" + _me_cfg.reload_hash;
	
	_me_make_ajax_get_request(url, clientdata, _me_got_ajax_content);
}


function _me_make_ajax_get_request(url, clientdata, callback) {
	if (betlive_busy_sem == 1) {return;}
	betlive_busy_sem = 1;
	var req = null;
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		req = new ActiveXObject('Microsoft.XMLHTTP');
	}
	if (req) {
		req.onreadystatechange = function() {
			if (req.readyState != 4) return;
			var reqStatus;
			try {
				reqStatus = req.status;
			} catch (e) {
				reqStatus = '';
			}
			if (reqStatus != 200) {
				betlive_busy_sem = 0;
				callback(url,clientdata,false,'HTTP');
			} else {
				betlive_busy_sem = 0;
				callback(url,clientdata,true,req.responseText);
			}
		}
		try {
			req.open('GET', url, true);
			req.send(null);
		} catch (e) {
			betlive_busy_sem = 0;
			callback(url,clientdata,false,'UNSUPPORTED');
		}
	} else {
		betlive_busy_sem = 0;
		callback(url,clientdata,false,'UNSUPPORTED');
	}
}

function _me_got_ajax_content(url,clientdata, ok, response) {
	var holder_el = document.getElementById(clientdata.id);
	if (ok) {
		
		// blank response means no new data
		if (response == "") {
			return;
		}
		
		var parts = _me_parse_script_tags(response);
		if (holder_el) {
			holder_el.innerHTML = parts[0];
		}
		if (parts[1].length) {
			try {
				_me_global_eval(parts[1]);
			} catch (e) {
				ok = false;
			}
		}
	}
}

function _me_parse_script_tags(str) {
	var html = '';
	var js   = '';
	var i = 0;
	var state = 'HTML';
	var script_re =
	  new RegExp('<(/?)' + 'scr'+'ipt' + '([^>]*)>', 'gi');
	while ((mtch = script_re.exec(str)) != null) {
		mS = mtch.index;
		if (state == 'HTML') {
			html += str.substring(i, mS);
		} else {
			js += str.substring(i, mS) + ';\n';
		}
		var closer = mtch[1];
		var attrs  = mtch[2];
		if (closer == '/') {
			state = 'HTML';
		} else {
			if ( attrs.charAt(attrs.length - 1) != '/' &&
			     attrs.indexOf('src=') == -1 ) {
				state = 'JS';
			}
		}
		i = script_re.lastIndex;
	}
	if (state == 'HTML') {
		html += str.substring(i);
	} else {
		js += str.substring(i);
	}
	return [ html, js ];
}

var _me_global_eval = function (src) {
	if (window.execScript) {
		window.execScript(src);
		return;
	}
	var fn = function() {
		window.eval.call(window,src);
	};
	fn();
};
*/

/*
 * Given new JS data checks in the hashtables for events that are now no longer present but where,
 * removes the HTML and clears out the hashtables down to the selection level
 */
function _me_remove_EVENTS(events) {
	var found = false;
	var scitem_id = ""
	
	// remove any classes that are not in the ajax response
	for (var ev_id in _me_event_hash) {
		found = false;
		for (var i = 0; i < events.length; i++) {
			if (events[i].ev_id == ev_id) {
				found = true;
			}
		}
		
		if(!found) {
			// remove the html
			scitem_id = _me_event_id_prefix + ev_id;
			scone_remove_item(scitem_id);
			// clear out the hashes from the class level down
			// check the class exists in the hash

			if (_me_event_hash[ev_id]) {
				// loop through each market in the events child hash
				for (var ev_mkt_id in _me_event_hash[ev_id].child_hash) {
					// check the market exists in the hash
					if (_me_evmkt_hash[ev_mkt_id]) {
						// loop through each seln in the markets child hash
						for (var ev_oc_id in _me_evmkt_hash[ev_mkt_id].child_hash) {
							// check the selection exists in the hash
							if (_me_selcn_hash[ev_oc_id]) {
								// delete the seln from its hash
								delete _me_selcn_hash[ev_oc_id];
							}
						}
						// delete the market from its hash
						delete _me_evmkt_hash[ev_mkt_id];
					}
				}
				// delete the event from its hash
				delete _me_event_hash[ev_id];
			}
		}
	}
}

/*
 * Given new JS data checks in the hashtables for events that are now no longer present but where,
 * removes the HTML and clears out the hashtables down to the selection level
 */
function _me_remove_EVMKTS(markets) {
	var found = false;
	var scitem_id = ""
	
	// remove any classes that are not in the ajax response
	for (var ev_mkt_id in _me_evmkt_hash) {
		found = false;
		for (var i = 0; i < markets.length; i++) {
			if (markets[i].ev_mkt_id == ev_mkt_id) {
				found = true;
			}
		}
		
		if(!found) {
			// remove the html
			scitem_id = _me_evmkt_id_prefix +ev_mkt_id;
			scone_remove_item(scitem_id);
			
			// clear out the hashes from the market level down
			// check the market exists in the hash


			if (_me_evmkt_hash[ev_mkt_id]) {
				// loop through each seln in the markets child hash
				for (var ev_oc_id in _me_evmkt_hash[ev_mkt_id].child_hash) {
					// check the selection exists in the hash
					if (_me_selcn_hash[ev_oc_id]) {
						// delete the seln from its hash
						delete _me_selcn_hash[ev_oc_id];
					}
				}
				// delete the market from its hash
				delete _me_evmkt_hash[ev_mkt_id];
			}
		}
	}
}

function _me_remove_SELCNS(selcns) {
	var found = false;
	var scitem_id = ""
	
	// remove any selections that are not in the ajax response
	for (var ev_oc_id in _me_selcn_hash) {
		found = false;
		for (var i = 0; i < selcns.length; i++) {
			if (selcns[i].ev_oc_id == ev_oc_id) {
				found = true;
			}
		}
		
		if(!found) {
			// remove the html
			scitem_id = _me_selcn_id_prefix +ev_oc_id;
			scone_remove_item(scitem_id);
			
			// clear out the hashes at the selection level
			// check the selection exists in the hash
			if (_me_selcn_hash[ev_oc_id]) {
				// delete the seln from its hash
				delete _me_selcn_hash[ev_oc_id];
			}
		}
	}
}

/*
* Given a time in miliseconds, return a string with the number of days, hours and minutes
*/
function _time_in_days_hours_mins(time) {
	var days;
	var hours;
	var minutes;
	var ret_time = "";
	time = parseInt(time / (1000*60));
	
	days = parseInt(time / (60*24));
	minutes =parseInt( time%60);
	hours = parseInt((time/60)%24);
	if (days != 0) {
		ret_time = days + " " +_me_days+ " ";
	}
	if (hours !=0 || days != 0) {
		ret_time = ret_time + hours + " " +_me_hours+ " : ";
	}

	ret_time = ret_time + minutes + " " +_me_mins;
	

	return ret_time;

}

function _me_calculate_time_to_start (cur_time, start_time) {

	var t_dif = start_time - cur_time; 
	var ret_time = "";
	if (t_dif > 0) {
		ret_time = _me_starts+ " " + _time_in_days_hours_mins(t_dif);
	}
	else {
		t_dif = -t_dif;
		ret_time = _me_started+ " " + _time_in_days_hours_mins(t_dif) + " " +_me_ago;
	}
	return ret_time;

}




// Format a price.
function me_get_price_str (
  lp_num,
  lp_den,
  lp_avail,
  mkt_sort
) {

	if (lp_avail == undefined) lp_avail = "Y";
	if (mkt_sort == undefined) mkt_sort = "--";

	var price_str_type = _me_cfg.price_str_type;

	if ( mkt_sort == "AH" && _me_cfg.price_str_type_ah != "") {
		price_str_type = _me_cfg.price_str_type_ah;
	}
	if ( mkt_sort == "HL" && _me_cfg.price_str_type_hl != "") {
		price_str_type = _me_cfg.price_str_type_hl;
	}

	if (lp_avail == "N") {
		return "SP";
	}
	if (lp_num == "" && lp_den == "") {
		return "-";
	}

	var price_str;

	if (price_str_type == "DECIMAL") {
		var dps = (lp_den > 100) ? 3 : 2;
		var dp = 1.0 + (lp_num / lp_den);
		var scaled_dp = "" + Math.round(dp * Math.pow(10,dps) - 0.5);
		var int_part  = scaled_dp.substr(0, scaled_dp.length - dps);
		var frac_part = scaled_dp.substr(scaled_dp.length - dps);
		if (int_part  == "") int_part  = "";
		if (frac_part == "") frac_part = "";
		var price_str = int_part + "." + frac_part;
	} else {
		if (lp_den == "") {
			lp_den = 1;
		}
		if (lp_num == lp_den) {
			price_str = "evens";
		} else {
			price_str = lp_num + _me_cfg.price_str_sep + lp_den;
		}
	}

	return price_str;
}

/*
 * Add a bet on a live betting event selection to the slip.
 */
function me_add_bet(ev_oc_id) {

	var selcn = _me_selcn_hash[ev_oc_id];
	var evmkt = _me_evmkt_hash[selcn.ev_mkt_id];

	BS_set_leg("selections",  ev_oc_id);
	BS_set_leg("price_type",  "L");
	BS_set_leg("lp_num",      selcn.lp_num);
	BS_set_leg("lp_den",      selcn.lp_den);
	BS_set_leg("hcap_value",  evmkt.raw_hcap);
	BS_set_leg("bir_index",   evmkt.bir_index);
	BS_set_leg("market_tags", "");

	BS_go_bet();

	return;
}


function _me_update_percentages(ev_mkt_id) {
	//Retrieve selection ids of the scones being displayed
	var sel_ids = scone_get_items(_me_selcns_id_prefix+ev_mkt_id);
	
	//Process bet percentage only if the market has three selections being displayed
	if (sel_ids.length !=3){
		return;
	}
	
	var perc_obj;
	var sel_id;
	var perc = 0;
	for (var i=0; i < sel_ids.length; i++) {
		perc_obj = null;
		sel_id = sel_ids[i].substring(_me_selcn_id_prefix.length,sel_ids[i].length);
		perc_obj = document.getElementById("perc_"+sel_id);
		if (perc_obj == null) {
			//Element does not exist
			return;
		}
		//Calculate total percentage
		perc+=parseInt(perc_obj.innerHTML);
	}

	//if percentage is 99% add 1 to the last selection
	if (perc == 99) {
		var new_perc = parseInt(perc_obj.innerHTML);
		new_perc++;

	} else if (perc == 101) {
		var new_perc = parseInt(perc_obj.innerHTML);
		new_perc--;

	
	} else {
		return;
	} 
	
	var info = _me_selcn_hash[sel_id];
	info.b_perc = new_perc;
	
	var sort_info = {
		disporder : info.disporder,
		lp_num    : info.lp_num,
		lp_den    : info.lp_den,
		ev_oc_id  : info.ev_oc_id
	}
	
	var html = tmpl_play("me_selcn", info);
	var scitem_id = _me_selcn_id_prefix + info.ev_oc_id;
	scone_replace_item(scitem_id, html, sort_info, true);

}

