var selConID = null;
var selConBestAsk = "-";
var selConBestBid = "-";
var SHOWNICETITLE = true;
var fader = new Fader();

var GREEN = new Color(0,204,0); // up from
var RED = new Color(255,170,170); // down from
var WHITE = new Color(0, 0, 0); // ?
var GREY = new Color(0,0,0); // ?
var YELLOW = new Color(0,0,0); // ?
var OFFWHITE = new Color(0, 0, 0); // ?
var OFFGREY = new Color(0,0,0); // ?
var OFFYELLOW = new Color(0,0,0); // ?

var BLUE = new Color(0,0,0); // ?
var updateFrequency = 3000;

var contractsInEvent = new Array();


Event.observe(window, "load", init);
// Add an eventListener to browsers that can do it somehow.
// Originally by Scott Andrew.
function addEventLstnr(obj, evType, fn){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, true);
    return true;
  } else if (obj.attachEvent){
	var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
	return false;
  }
}

function Contract(id, symbol, bid, bidQty, ask, askQty, last, vol, change, book, name, eventName, eventGroupName, eventClassName, contractGroup, state, expiryPrice)
{
	this.id = id;
	this.symbol = symbol;
	this.bid = bid;
	this.bidQty = bidQty;
	this.ask = ask;
	this.askQty = askQty;
	this.last = last;		
	this.vol = vol;
	this.change = change;
	this.book = book;
	this.name = name;
	this.eventName = eventName;
	this.eventGroupName = eventGroupName;
	this.eventClassName = eventClassName;
	this.contractGroup = contractGroup;
	this.state = state;
	this.expiryPrice = expiryPrice;

}
Contract.prototype.toString = function()
{
	return "id: " + this.id ;
	//+ " symbol: " + this.symbol 	+ " bid: " + this.bid	+ " bidQty: " + this.bidQty	+ " ask: " + this.ask	+ " askQty: " + this.askQty	+ " last: " + this.last	+ " vol: " + this.vol	+ " change: " + this.change	+ " book: " + this.book	+ " name: " + this.name	+ " eventName: " + this.eventName	+ " eventGroupName: " + this.eventGroupName	+ " eventClassName: " + this.eventClassName;
}
	


function OrderBook(orderBookElement)
{
	var bidElements = orderBookElement.getElementsByTagName("bid");
	var offerElements= orderBookElement.getElementsByTagName("offer");
	var bidsArray = new Array();
	var offersArray = new Array();
	
	for(var i = 0; i < bidElements.length; i++)
	{
		if(i == 0)
		{
//			alert(bidElements[0].nodeName);
		}
		var price = bidElements[i].getAttribute("price");
		var quantity = bidElements[i].getAttribute("quantity");
		var bookPrice = new BookPrice(price, quantity);
		bidsArray[i] = bookPrice;
	}


	for(var i = 0; i < offerElements.length; i++)
	{
		var price = offerElements[i].getAttribute("price");
		var quantity = offerElements[i].getAttribute("quantity");
		var bookPrice = new BookPrice(price, quantity);
		offersArray[i] = bookPrice;
	}
	
	if(bidsArray.length > 0)
	{
//		alert(bidsArray[0].price);
	}
	this.bids = bidsArray;
	this.offers = offersArray;
}

function BookPrice(price, quantity)
{
	this.price = price;
	this.quantity = quantity
}

var inited = false;
function init()
{
	if(!inited)
	{
		inited = true;
	
		debug("md init");

    // set the list of contract ids
    var mkTable = document.getElementById('marketDataTable');
    if (mkTable != null && mkTable.getAttribute('contractList') != null) {
      refreshParams = mkTable.getAttribute('contractList');
    }
    else {
      refreshParams = "&numActive=8";
    }

		refreshPrice(updateFrequency)
	}
	
	var pause =  document.getElementById("pause");
//	Event.observe(pause, "click", togglePause);
}


var aTextNodes = new Array;
var jnc = 0;
function getTextNodes(oNode)
{
	for (var inc=0; inc < oNode.childNodes.length; inc++) 
	{

		if (oNode.childNodes[inc].nodeType == 3)
		{
			// Text
			aTextNodes[jnc] = oNode.childNodes[inc];
			jnc++
		}
	}

	return aTextNodes;
}

var refreshParams = "";
var timerThread = null;
var threadRunning = false;
function refreshPrice(frequency)
{
	if(timerThread != null)
	{
		clearTimeout(timerThread);
	}
	if(!frequency)
	{
		var frequency = 1500;
	}
	var stopLoading = document.getElementById("stopLoading");

	if(stopLoading == null || !stopLoading.checked)
	{
		sendRequest(refreshParams);
	}
	timeOutTxt = 'refreshPrice("'+frequency+'");';
	timerThread = setTimeout(timeOutTxt,frequency);
}

function sendRequest(params)
{
	new Ajax.Request('/aav2/ajax/ContractBookXML.jsp', {parameters:params, onSuccess:ajaxHandler, onFailure:ajaxError});
}

function selectEvent(id)
{
	if(timerThread != null)
	{
		clearTimeout(timerThread);
	}

	deleteTableRows("marketDataTable", 1);

	refreshParams = "&selEventID=" + id;
	
	refreshPrice(updateFrequency);
	setTimeout("setSelectedTimeout()", updateFrequency/8);
	var stopLoading = document.getElementById("stopLoading");
	if(stopLoading != null)
	{
		stopLoading.checked = false;
		
	}
	
}

function setSelectedTimeout()
{
	var table = document.getElementById("marketDataTable");

	if(table.rows[1] != null)
	{
		var firstRowID = table.rows[1].id.replace(/conID/, "");
		if(Number(firstRowID))
		{
			setSelectedContract("marketDataTable", firstRowID);
		}
	}
	else
	{
		setTimeout("setSelectedTimeout()", updateFrequency/8);
	}

}

function deleteTableRows(id, from)
{
	if(typeof from == 'undefined') 
	{
		from = 0;
	}
	var table = document.getElementById(id);
	var tableBody = table.getElementsByTagName("tbody")[0];
	while(table.rows.length > from)
	{
		tableBody.removeChild(table.rows[table.rows.length-1]);
	}	
}

function ajaxError(t)
{
	debug("Error" + t.statusText());
}

var lastDateMS = 0;
var avgTimeMS = 0;
var totalOrders = 0;
function ajaxHandler(t)
{	
	var response = t.responseXML.documentElement;

	var lastUpdateTime = response.getAttribute("lastUpdateTime");

	var currentTimeMS = response.getAttribute("currentTimeMS");
	var requestTime = 0;
	if(Number(currentTimeMS) && lastDateMS != 0)
	{
		requestTime = currentTimeMS - lastDateMS - updateFrequency;
	}

	//updateLatency(requestTime);
	
	if(Number(currentTimeMS))
	{
		lastDateMS = currentTimeMS;
	}

	totalOrders = response.getAttribute("totalOrders");
	if(!Number(totalOrders))
	{
		totalOrders = 0;	
	}


	var currentTime = response.getAttribute("currentTime");
	var timeText = document.createTextNode(currentTime);
	var time = document.getElementById("time");
	if(time != null)
	{
		if(time.childNodes.length > 0)
		{
			time.removeChild(time.childNodes[0]);
		}
		
		time.appendChild(timeText);
	}
	var contracts = response.getElementsByTagName("contractInfo");

	var contractsArray = getContractsArray(contracts);
	display(contractsArray);
	response = null;
	
}




function getContractsArray(contracts)
{
	var contractsArray = new Array();
	for(var i = 0; i < contracts.length; i++)
	{

		var id = contracts[i].getAttribute("conID");
		var symbol = contracts[i].getElementsByTagName("symbol")[0].firstChild.nodeValue;
		var name = contracts[i].getElementsByTagName("name")[0].firstChild.nodeValue;
		var eventName = contracts[i].getElementsByTagName("eventName")[0].firstChild.nodeValue;
		var eventGroupName = contracts[i].getElementsByTagName("eventGroupName")[0].firstChild.nodeValue;
		var eventClassName = contracts[i].getElementsByTagName("eventClassName")[0].firstChild.nodeValue;




		var last = contracts[i].getAttribute("lstTrdPrc");
		var vol = contracts[i].getAttribute("vol");

		var bid = "-";
		var offer = "-";
		var bidQty = 0;
		var askQty = 0;	
		var state = contracts[i].getAttribute("state");
		var expiryPrice = "-";
		if(state == 'O')
		{

			var orderBook = contracts[i].getElementsByTagName("orderBook")[0];
			var bids = orderBook.getElementsByTagName("bid");
			var offers = orderBook.getElementsByTagName("offer");
		
	
			var book = new OrderBook(orderBook);
		

			if(bids[0] != null)
			{
				bid = bids[0].getAttribute("price");
				bidQty = bids[0].getAttribute("quantity");
			}
			if(offers[0] != null)
			{
				offer = offers[0].getAttribute("price");
				askQty = offers[0].getAttribute("quantity");
			}
		}
		else
		{
			expiryPrice = contracts[i].getAttribute("expiryPrice");
		}

		var change = contracts[i].getAttribute("change");

		var contractGroup = contracts[i].getAttribute("conGrp");

		contractsArray[i] = new Contract(id, symbol, bid, bidQty, offer, askQty, last, vol,
										change, book, name, eventName, eventGroupName,
										eventClassName, contractGroup, state, expiryPrice);
	}
	return contractsArray;
}



var statusStrings = new Array();
statusStrings["I"] = "Initialized";
statusStrings["O"] = "Open";
statusStrings["A"] = "Authorised";
statusStrings["P"] = "Paused";
statusStrings["C"] = "Session Closed";
statusStrings["S"] = "Expired";
statusStrings["X"] = "Cancelled";
statusStrings["R"] = "Void";
statusStrings["E"] = "Closed For Expiry";



//This variable controls access to modify the table
var semaphore = true;






function isInContractList(contractID, contracts)
{
	for(var i = 0; i < contracts.length; i++)
	{
		if(contracts[i].id == contractID)
		{
			return true;
		}
	}
	return false;
}


function createElementWithText(type, text)
{
	var cell = document.createElement(type);
	var cellText = document.createTextNode(text);
	cell.appendChild(cellText);
	return cell;
}


function setTradingContract(e)
{
	var targ = null;
	if (!e) var e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;

	var id = "conID0";
	if(targ.parentNode.id.match(/conID/))
	{
		id = targ.parentNode.id;
	}
	else
	{
		id = targ.parentNode.parentNode.id;
	}
	var conID = id.replace(/conID/, "");


	setSelectedContract("marketDataTable", conID);
	return false;
}

var lastLatencyColor = GREEN;
function updateLatency(time)
{
//	debug("** " + fader.fadingStates[0].toString());
	if(fader.fadingStates["latency"] != null)
	{
		lastLatencyColor = fader.self.fadingStates["latency"].currentColor;
	}
	var latencyElement = document.getElementById("latency");
	if(latencyElement != null)
	{
		if(time <= 40)
		{
			fader.addFadee(latencyElement, lastLatencyColor, GREEN, 75);
		}
		else if(time > 40 && time < 150)
		{
			fader.addFadee(latencyElement, lastLatencyColor, YELLOW, 75);
		}
		else
		{
			fader.addFadee(latencyElement, lastLatencyColor, RED, 75);
		}
	}
//	latencyElement.innerHTML = time;
}

function changeContract(conID){
	debug("notChanged");
//	return changeContract(conID);
	if(timerThread != null)
	{
		clearTimeout(timerThread);
	}

	deleteTableRows("marketDataTable", 1);

	refreshParams = "&selConID=" + conID;
	
	refreshPrice(updateFrequency);
	setTimeout("setSelectedTimeout()", updateFrequency/8);
	var stopLoading = document.getElementById("stopLoading");
	if(stopLoading != null)
	{
		stopLoading.checked = false;
		
	}
	
	
}
function calculateOverUnder(id)
{
	if(refreshParams.match(/numActive/))
	{
		//return false;
	}

	
	var contractTable = document.getElementById(id);
	var firstGroupID = contractTable.rows[1].getAttribute("contractGroup");
	var bidTotal = 0;
	var askTotal = 0;
	for(var i = 1; i < contractTable.rows.length; i++)
	{
		if(contractTable.rows[i].cells.length != 8)
		{
			continue;
		}
		var contractGroup = contractTable.rows[i].getAttribute("contractGroup");

		if(contractGroup != firstGroupID)
		{
			bidTotal = "";
			askTotal = "";
			break;
		//	return false;
		}

		var bid = contractTable.rows[i].cells[2].childNodes[0].nodeValue;
		var ask = contractTable.rows[i].cells[3].childNodes[0].nodeValue;
		if(!Number(bid) || !Number(ask))
		{
			bidTotal = "";
			askTotal = "";
			break;
//			return false;
		}
		bidTotal = bidTotal + Number(bid);
		askTotal = askTotal + Number(ask);
	}

	var overUnder = document.getElementById("overUnder");
	var tableBody = contractTable.getElementsByTagName("tbody")[0];
	var overUnderRow = document.getElementById("overUnderRow");

	if(overUnderRow == null)
	{
		var overUnderRow = document.createElement("tr");
		overUnderRow.id = "overUnderRow";
		
		var firstSpace = createElementWithText("td", " ");
		firstSpace.colSpan = "2";
		firstSpace.className = "firstCell";
		overUnderRow.appendChild(firstSpace);
		var bidCell = null;
		if(Number(bidTotal))
		{
			bidCell = createElementWithText("td", Number(bidTotal).toFixed(2));
			firstSpace.style.borderRight = "1px solid rgb(0,50,100)";
			bidCell.style.borderBottom = "1px solid rgb(0,50,100)";
			bidCell.style.borderTop = "none";
			bidCell.style.borderRight = "1px solid rgb(178,178,178)";
			
			bidCell.style.textAlign = "right";
		}
		else
		{
			bidCell = createElementWithText("td", " ");
		}
		
		overUnderRow.appendChild(bidCell);
		
		var askCell = null;
		
		if(Number(askTotal))
		{
			askCell = createElementWithText("td", Number(askTotal).toFixed(2));
			askCell.style.border = "1px solid rgb(0,50,100)";
			askCell.style.borderTop = "none";
			askCell.style.borderLeft ="none";
		}
		else
		{
			askCell = createElementWithText("td", " ");
		}

		
		overUnderRow.appendChild(askCell);

		var lastSpace = createElementWithText("td", " ");
		lastSpace.className = "lastCell";
		lastSpace.colSpan = "4";
		overUnderRow.appendChild(lastSpace);
		tableBody.appendChild(overUnderRow);
	}
	else
	{

		var bidText = null;
        var askText = null;
		
		if(Number(bidTotal))
		{
			bidText = document.createTextNode(Number(bidTotal).toFixed(2));
		}
		else
		{
			bidText = document.createTextNode(" ");
		}
		if(Number(askTotal))
		{
			askText = document.createTextNode(Number(askTotal).toFixed(2));
		}
		else
		{
			askText = document.createTextNode(" ");
		}		

		overUnderRow.cells[1].removeChild(overUnderRow.cells[1].childNodes[0]);	
		overUnderRow.cells[2].removeChild(overUnderRow.cells[2].childNodes[0]);
		
		overUnderRow.cells[1].appendChild(bidText);
		overUnderRow.cells[2].appendChild(askText);
	}

	
	return true;
}
