/************************************************* Global *************************************************/ var STATUS_ACTIVE = 1; var STATUS_INACTIVE = 2; var STATUS_SETTLED = 3; var STATUS_VOIDED = 4; var STATUS_SUSPENDED = 6; var STATUS_PENDING = 7; var STATUS_CLOSED = 8; var STATUS_SCRATCHED = 9; var STATUS_INRUNNING = 10; var MAX_LEVELS = 4; var m_bLoadFlag = false; var m_iTreeLevel = 0; var m_iTreeParentId = 0; var m_iCurrentRequestId; var m_aAlarms = new Array(); var m_aTransactions = new Array(); var m_bViewAlarms = false; // default calander settings var m_iYear = 2007; var m_iMonth = 1; var m_iDay = 1; var m_sDate = ""; /************************************************* Main Application *************************************************/ function initialiseApplication() { /* * function: initialiseApplication() * purpose: Does initialisation. * params: none * returns: none */ // initialise the markets initialiseMarkets(); // start timers. doRealTime(); } function cleanApplication() { /* * function: cleanApplication() * purpose: Cleans up before exiting. * params: none * returns: none */ // get the document root element. var oRoot = document.documentElement; // clean all its children. cleanAllChildren(oRoot); } /************************************************* Market Tree *************************************************/ function populateTreeLevel(iTreeLevel, iTreeParentId, sMarketTab) { var sParams = ""; if((isNumeric(iTreeLevel) === true) && ((iTreeLevel > 0) && (iTreeLevel <= MAX_LEVELS)) && (sMarketTab !== "")) { m_iTreeLevel = iTreeLevel; sParams = "treeLevel=" + iTreeLevel; if(iTreeLevel > 1) { if((isNumeric(iTreeParentId) === true) && (iTreeParentId > 0)) { m_iTreeParentId = iTreeParentId; sParams += "&treeParentId=" + iTreeParentId; } } // validate this input! sParams += "&marketDateFilter=" + getMarketDateFilterCode(sMarketTab); sParams += "&sMarketTab=" + sMarketTab; if(sMarketTab === "bodyMarketManagementNavigationQueryMarket") { sParams += "&date=" + m_sDate; } m_iCurrentRequestId = 1; ajaxRequest("php/getTreeLevel.php", sParams, processMarketLevelString); } else { alert("Error populating level"); } } function contractTodaysMarket() { var oParent = $("bodyMarketManagementNavigationToday"); // get the top level unordered list. var oUnorderedList = oParent.childNodes[1]; for(var i = 0; i < oUnorderedList.childNodes.length; i++) { var oChild = oUnorderedList.childNodes[i]; if(oChild.tagName === "LI") { if(oChild.childNodes.length > 1) { var oChild2 = oChild.childNodes[1]; if(oChild2.tagName === "UL") { cleanAllChildren(oChild2); oChild2.parentNode.removeChild(oChild2); } } } } showTodaysMarket(); } function unpopulateTreeLevel(iTreeLevel, sMarketTab) { // is this code needed ??? if((iTreeLevel > 1) && (iTreeLevel < MAX_LEVELS)) { //alert("ok"); } } function processMarketLevelString(oResponse) { /* * function: processMarketLevelList * purpose: Processes market tree response * params: oResponse * returns: none */ var sMarketLevelString = oResponse.responseText; var aTable; var oMarketDetail; // unpack the delimited string into an array of arrays (table) aTable = unpackIt(sMarketLevelString); //alert(sMarketLevelString + ", " + aTable.length); var sGeneric = aTable.shift(); var sGeneric2 = aTable.shift(); var aMarketLevelInfo = sGeneric.split("["); var iTreeLevel = parseInt(aMarketLevelInfo[0]); var iTreeParentId = parseInt(aMarketLevelInfo[1]); var sMarketTab = aMarketLevelInfo[2]; // all levels except the last are loaded into the navigation if(iTreeLevel < MAX_LEVELS) { // build a DOM tree from the table. oMarketLevelList = generateMarketLevelList(iTreeLevel, iTreeParentId, sMarketTab, aTable); // render the DOM tree to the screen renderMarketLevelList(iTreeLevel, iTreeParentId, sMarketTab, oMarketLevelList); } else { // load the last level into the right hand side. if(hasDetailBeenShown(iTreeParentId) === false) { // this is the parent info we are adding back in. aTable.unshift(sGeneric2); oMarketDetail = generateMarketDetail(iTreeLevel, iTreeParentId, aTable); renderMarketDetail(oMarketDetail); if(m_bViewAlarms === true) { showAlarmLines(iTreeParentId); m_bViewAlarms = false; } } else { var bConfirm = confirm("You already have that detail open. Do you wish to view?"); if(bConfirm === true) { scrollToDetail(m_iTreeParentId); } } } } function generateMarketLevelList(iTreeLevel, iTreeParentId, sMarketTab, aTable) { /* * function: generateMarketLevelList * purpose: Turns part of the market tree into a DOM tree structure * params: aTable - Array(Array) * returns: none */ var aRow; var oMarketLevelList = document.createElement("MarketLevelList"); var oUl = document.createElement("ul"); if((isArray(aTable) === true) && (aTable.length > 0)) { for(var rowCounter = 0; rowCounter < aTable.length; rowCounter++) { // create the various nodes that we need var oLi = document.createElement("li"); var oA = document.createElement("a"); var oAText; var sClassName; // get the next row aRow = aTable[rowCounter]; // set the attributes for the A node. oA.href = "#"; oA.nextTreeLevel = (iTreeLevel+1); // this link will populate the next level oA.nextTreeParentId = aRow[0]; oA.marketTab = sMarketTab; oA.onclick = function() { populateTreeLevel(this.nextTreeLevel, this.nextTreeParentId, this.marketTab); } var sText; switch(iTreeLevel) { case 2: sText = aRow[2]; break; default: sText = aRow[1]; break; } oAText = document.createTextNode(sText); // add the text node to the A oA.appendChild(oAText); if(iTreeLevel === 3) { // depending on the status (aRow[4]) // we want to set the class differently oA.className = getStatusColour(parseInt(aRow[4])) + "Light"; oLi.status = parseInt(aRow[4]); } // add the A to the LI oLi.appendChild(oA); oLi.treeLevel = iTreeLevel; oLi.treeParentId = aRow[0]; oLi.marketTab = sMarketTab; if(rowCounter === (aTable.length-1)) { oLi.className = "last-child"; } // add the LI to the UL oUl.appendChild(oLi); } // we want to set the id of the root LI of the full structure so // we can style it to remove top border. if(iTreeLevel === 1) { oUl.className = "root"; } oMarketLevelList.appendChild(oUl); } return oMarketLevelList; } function renderMarketLevelList(iTreeLevel, iTreeParentId, sMarketTab, oMarketLevelList) { /* * function: renderMarketLevelList * purpose: Renders the DOM tree to the browser * params: oMarketLevelList - DOM tree * returns: none */ if(m_iTreeLevel === 1) { oInsertElement = $(sMarketTab); } else { var oNodeList = document.getElementsByTagName("li"); var bFoundChild = false; var iChildNodeCount = oNodeList.length; var iCount = 0; while((bFoundChild === false) && (iCount < iChildNodeCount)) { oChild = oNodeList[iCount]; if((oChild.marketTab === sMarketTab) && (parseInt(oChild.treeLevel) === (iTreeLevel-1)) && (parseInt(oChild.treeParentId) === iTreeParentId)) { oInsertElement = oChild; } iCount++; } } if(iTreeLevel === 1) { ///////////////////////////////////////////////////////!!! ////////// fix this ////////!!! ///////////////////////////////////////////////////////!!! ///////////////////////////////////////////////////////!!! if(oInsertElement.id === "bodyMarketManagementNavigationQueryMarket") { for(var i = 0; i < oInsertElement.childNodes.length; i++) { //alert(oInsertElement.childNodes.length) oChild = oInsertElement.childNodes[i]; if(oChild.tagName === "UL") { //cleanAllChildren(oChild); //oDiv.removeChild(oChild); } } // need to free up memory so we want to clean the // node we are going to remove and all its children //cleanAllChildren(oDiv.childNodes[1]); //oDiv.removeChild(oDiv.childNodes[2]); } } else { for(var i = 0; i < oInsertElement.parentNode.childNodes.length; i++) { var oChild = oInsertElement.parentNode.childNodes[i]; if(oChild.tagName === "LI") { if(oChild.childNodes.length > 1) { // need to free up memory so we want to clean the // node we are going to remove and all its children cleanAllChildren(oChild.childNodes[1]); oChild.removeChild(oChild.childNodes[1]); } } } } while(oMarketLevelList.firstChild) { // the parent element is a dummy UL element. We want to take its children // and add it as the children of the UL element identified by oUlElement oInsertElement.appendChild(oMarketLevelList.firstChild); } } function generateMarketDetail(iTreeLevel, iTreeParentId, aTable) { /* * function: generateMarketDetail * purpose: Turns the lowest level of the market tree (detail) into a DOM tree * params: aTable - Array(Array) * returns: none */ // the first element in the array is parent information var sLineOwnerDetails = aTable.shift(); var aLineOwnerDetails = sLineOwnerDetails.split("{"); var sLineNavName = aLineOwnerDetails[0]; var sLineOwnerName = aLineOwnerDetails[1]; var iStatusRef = parseInt(aLineOwnerDetails[2]); var iSportsRef = parseInt(aLineOwnerDetails[3]); var iLineOwnerRef = parseInt(aLineOwnerDetails[4]); // want to change this so that there is no table being passed then a simple error box is displayed // header box, content box (with error) var aRow; // this is just a dummy element which we are using to hold our stuff var oTop = document.createElement("nodes"); var oDivContentFrame = document.createElement("div"); oDivContentFrame.lineOwnerRef = iTreeParentId; var MAX_COLUMNS = 4; // create our nodes ;) //container nodes // header nodes var oDivContentFrameHeader = document.createElement("div"); var oSpanSpanLeft = document.createElement("span"); var oPP1 = document.createElement("p"); var oPP1Text; var oAClose = document.createElement("a"); var oACloseText; var oAPinUnpin = document.createElement("a"); var oAPinUnpinText; var oSpanSpanRight = document.createElement("span"); // content frame nodes var oDivContentFrameMain = document.createElement("div"); var oTableContentFrame = document.createElement("table"); var oTableContentFrameBody = document.createElement("tbody"); var oTrHeaderRow = document.createElement("tr"); var aTableContentFrameHeaders = new Array(MAX_COLUMNS); var aTableContentFrameCellWidths = new Array(MAX_COLUMNS); aTableContentFrameHeaders[0] = "#"; aTableContentFrameHeaders[1] = "Name"; aTableContentFrameHeaders[2] = "Current Status"; if(iSportsRef === 2) { aTableContentFrameHeaders[3] = "Actions"; } else { aTableContentFrameHeaders[3] = " "; } aTableContentFrameHeaders[4] = ""; aTableContentFrameCellWidths[0] = "35px"; aTableContentFrameCellWidths[1] = "150px"; aTableContentFrameCellWidths[2] = "100px"; aTableContentFrameCellWidths[3] = "100px"; aTableContentFrameCellWidths[4] = "100px"; oPP1.className = "p1"; // bringing this from db now. oPP1Text = document.createTextNode(sLineNavName + " - " + sLineOwnerName); oPP1.appendChild(oPP1Text); oSpanSpanLeft.appendChild(oPP1); oSpanSpanLeft.className = "spanLeft"; oDivContentFrameHeader.className = "contentFrameHeader " + getStatusColour(iStatusRef) + "Top"; oDivContentFrameHeader.appendChild(oSpanSpanLeft); oAPinUnpinText = document.createTextNode("[ Pin ]"); oAPinUnpin.appendChild(oAPinUnpinText); oAPinUnpin.href = "#"; oAPinUnpin.treeParentId = iTreeParentId; oAPinUnpin.style.marginRight = "10px"; oAPinUnpin.onclick = function() { pin(this.treeParentId); } oAPinUnpin.pinned = false; oSpanSpanRight.appendChild(oAPinUnpin); oACloseText = document.createTextNode("[ Close ]"); oAClose.appendChild(oACloseText); oAClose.href = "#"; oAClose.treeLevel = iTreeLevel; oAClose.treeParentId = iTreeParentId; oAClose.onclick = function() { closeMarketDetail(this.treeParentId); } oSpanSpanRight.appendChild(oAClose); oSpanSpanRight.className = "spanRight"; oDivContentFrameHeader.appendChild(oSpanSpanRight); oDivContentFrame.id = iTreeParentId; oDivContentFrame.className = "contentFrame"; oDivContentFrame.appendChild(oDivContentFrameHeader); var oTrHeaderRow = document.createElement("tr"); for(var colCounter = 0; colCounter < MAX_COLUMNS; colCounter++) { var oTdContentFrameCell = document.createElement("td"); oTdContentFrameCell.className = "headerFrameCell"; oTdContentFrameCell.style.width = aTableContentFrameCellWidths[colCounter]; var oTextNode = document.createTextNode(aTableContentFrameHeaders[colCounter]); oTdContentFrameCell.appendChild(oTextNode); oTrHeaderRow.appendChild(oTdContentFrameCell); } oTableContentFrameBody.appendChild(oTrHeaderRow); if((isArray(aTable) === true) && (aTable.length > 0)) { for(var rowCounter = 0; rowCounter < aTable.length; rowCounter++) { aRow = aTable[rowCounter]; var oTrDetailRow = document.createElement("tr"); var oTdContentFrameCell1 = document.createElement("td"); var oTdContentFrameCell2 = document.createElement("td"); var oTdContentFrameCell3 = document.createElement("td"); var oTdContentFrameCell4 = document.createElement("td"); if(iSportsRef === 2) { oTdContentFrameCell1.className = "contentFrameCell lineNo" + (rowCounter+1); } else { oTdContentFrameCell1.className = "contentFrameCell"; } oTdContentFrameCell2.className = "contentFrameCell"; oTdContentFrameCell3.className = "contentFrameCell"; oTdContentFrameCell4.className = "contentFrameCell"; var oTextNode1 = document.createTextNode(rowCounter+1); // line var oTextNode2 = document.createTextNode(aRow[1]); // name var iStatus = parseInt(aRow[3]); var oTextNode3 = document.createTextNode(getStatus(iStatus)); // status var oSelect = populateSelectOptions(iStatus); // so we can always tell what the current status oSelect.lineOwnerRef = iLineOwnerRef; oSelect.lineRef = aRow[0]; oTdContentFrameCell1.appendChild(oTextNode1); oTdContentFrameCell2.appendChild(oTextNode2); oTdContentFrameCell3.appendChild(oTextNode3); oTdContentFrameCell4.appendChild(oSelect); oTrDetailRow.appendChild(oTdContentFrameCell1); oTrDetailRow.appendChild(oTdContentFrameCell2); oTrDetailRow.appendChild(oTdContentFrameCell3); oTrDetailRow.appendChild(oTdContentFrameCell4); // we can identify a row by lineRef in a table. oTrDetailRow.lineRef = aRow[0]; oTableContentFrameBody.appendChild(oTrDetailRow); } } oTableContentFrame.className = "contentFrameTable"; oTableContentFrame.appendChild(oTableContentFrameBody); var oSpan = document.createElement("span"); oSpan.className = "buttonSpanRight"; var oButton = document.createElement("button"); oButton.value = "Commit"; oButton.lineOwnerRef = iLineOwnerRef; oButton.onclick = function () { var bWantConfirmations = false; var bConfirm = false; if(bWantConfirmations === true) { bConfirm = confirm("You are about to change these lines. Are you sure?"); } if(bConfirm === true || bWantConfirmations === false) { this.disabled = true; updateLines(this.lineOwnerRef); } } oSpan.appendChild(oButton); oDivContentFrameMain.className = "contentFrameMain"; oDivContentFrameMain.appendChild(oTableContentFrame); oDivContentFrameMain.appendChild(oSpan); // set some attributes oDivContentFrame.pinned = false; oDivContentFrame.treeLevel = iTreeLevel; oDivContentFrame.treeParentId = iTreeParentId; var oForm = document.createElement("form"); oForm.lineOwnerRef = iLineOwnerRef; oForm.appendChild(oDivContentFrameMain); oDivContentFrame.appendChild(oForm); oTop.appendChild(oDivContentFrame); return(oTop); } function populateSelectOptions(iStatus) { var oSelect = document.createElement("select"); var oDefaultOption = document.createElement("option"); var oDefaultOptionText = document.createTextNode("Choose an Action...") oDefaultOption.appendChild(oDefaultOptionText); oSelect.appendChild(oDefaultOption); oSelect.currentStatus = iStatus; oSelect.onchange = function() { var sSelectedStatus = this.options[this.selectedIndex].status; if(sSelectedStatus === STATUS_SCRATCHED) { do { sReductionOdds = prompt("Please enter reduction odds","10.0"); } while(sReductionOdds === ""); if(sReductionOdds !== null) { this.reductionOdds = sReductionOdds; } else { this.selectedIndex = 0; } } } switch(iStatus) { case STATUS_ACTIVE: { oSelect.appendChild(getSelectOption(STATUS_INACTIVE)); oSelect.appendChild(getSelectOption(STATUS_VOIDED)); oSelect.appendChild(getSelectOption(STATUS_SUSPENDED)); oSelect.appendChild(getSelectOption(STATUS_PENDING)); oSelect.appendChild(getSelectOption(STATUS_CLOSED)); oSelect.appendChild(getSelectOption(STATUS_SCRATCHED)); oSelect.appendChild(getSelectOption(STATUS_INRUNNING)); break; } case STATUS_INACTIVE: { oSelect.appendChild(getSelectOption(STATUS_ACTIVE)); oSelect.appendChild(getSelectOption(STATUS_VOIDED)); oSelect.appendChild(getSelectOption(STATUS_SUSPENDED)); oSelect.appendChild(getSelectOption(STATUS_PENDING)); oSelect.appendChild(getSelectOption(STATUS_CLOSED)); oSelect.appendChild(getSelectOption(STATUS_SCRATCHED)); oSelect.appendChild(getSelectOption(STATUS_INRUNNING)); break; } case STATUS_SETTLED: { oSelect.appendChild(getSelectOption(STATUS_CLOSED)); oSelect.appendChild(getSelectOption(STATUS_VOIDED)); break; } case STATUS_VOIDED: { oSelect.appendChild(getSelectOption(STATUS_ACTIVE)); oSelect.appendChild(getSelectOption(STATUS_SUSPENDED)); oSelect.appendChild(getSelectOption(STATUS_PENDING)); oSelect.appendChild(getSelectOption(STATUS_CLOSED)); oSelect.appendChild(getSelectOption(STATUS_SCRATCHED)); oSelect.appendChild(getSelectOption(STATUS_INRUNNING)); break; } case STATUS_SUSPENDED: { oSelect.appendChild(getSelectOption(STATUS_ACTIVE)); oSelect.appendChild(getSelectOption(STATUS_VOIDED)); oSelect.appendChild(getSelectOption(STATUS_CLOSED)); oSelect.appendChild(getSelectOption(STATUS_SCRATCHED)); oSelect.appendChild(getSelectOption(STATUS_INRUNNING)); break; } case STATUS_PENDING: { oSelect.appendChild(getSelectOption(STATUS_ACTIVE)); oSelect.appendChild(getSelectOption(STATUS_VOIDED)); oSelect.appendChild(getSelectOption(STATUS_SCRATCHED)); break; } case STATUS_CLOSED: { oSelect.appendChild(getSelectOption(STATUS_ACTIVE)); oSelect.appendChild(getSelectOption(STATUS_SUSPENDED)); oSelect.appendChild(getSelectOption(STATUS_SCRATCHED)); oSelect.appendChild(getSelectOption(STATUS_SETTLED)); break; } case STATUS_SCRATCHED: { oSelect.appendChild(getSelectOption(STATUS_ACTIVE)); oSelect.appendChild(getSelectOption(STATUS_SUSPENDED)); oSelect.appendChild(getSelectOption(STATUS_CLOSED)); oSelect.appendChild(getSelectOption(STATUS_PENDING)); break; } case STATUS_INRUNNING: { oSelect.appendChild(getSelectOption(STATUS_VOIDED)); break; } } return oSelect; } function getSelectOption(iStatus) { var oOption = document.createElement("option"); var oOptionText; oOption.status = iStatus; switch(iStatus) { case STATUS_ACTIVE: { oOptionText = document.createTextNode("Activate"); oOption.appendChild(oOptionText); break; } case STATUS_INACTIVE: { oOptionText = document.createTextNode("Inactivate"); oOption.appendChild(oOptionText); break; } case STATUS_SETTLED: { oOptionText = document.createTextNode("Settle"); oOption.appendChild(oOptionText); break; } case STATUS_VOIDED: { oOptionText = document.createTextNode("Void"); oOption.appendChild(oOptionText); break; } case STATUS_SUSPENDED: { oOptionText = document.createTextNode("Suspend"); oOption.appendChild(oOptionText); break; } case STATUS_PENDING: { oOptionText = document.createTextNode("Pending"); oOption.appendChild(oOptionText); break; } case STATUS_CLOSED: { oOptionText = document.createTextNode("Close"); oOption.appendChild(oOptionText); break; } case STATUS_SCRATCHED: { oOptionText = document.createTextNode("Scratch"); oOption.appendChild(oOptionText); break; } case STATUS_INRUNNING: { oOptionText = document.createTextNode("InRunning"); oOption.appendChild(oOptionText); break; } } return oOption; } function renderMarketDetail(oMarketDetail) { /* * function: renderMarketDetail * purpose: Renders the detail level to the browser * params: oMarketDetail - market detail DOM tree * returns: none */ oParentNode = $("bodyMarketManagementDetail"); while(oMarketDetail.firstChild) { oParentNode.appendChild(oMarketDetail.firstChild); } } function pin(iTreeParentId) { var oDivMain; var iDivMainCount; var iChildCount; var oChild; var bFoundCorrectChild = false; // this is where all content frames are held oDivMain = $("bodyMarketManagementDetail"); // how many content frames are there? iDivMainCount = oDivMain.childNodes.length; // loop through all the content frames iChildCount = 0; while((bFoundCorrectChild === false) && (iChildCount < iDivMainCount)) { // get the content frame oChild = oDivMain.childNodes[iChildCount]; // is the content frame the one we want? if(parseInt(oChild.treeParentId) === iTreeParentId) { bFoundCorrectChild = true; // get the text of the A node so we change it. // DIV DIV SPAN(right) A text oAText = oChild.childNodes[0].childNodes[1].childNodes[0].childNodes[0]; // pin or unpin the content frame. if(oChild.pinned === "false") { oChild.pinned = "true"; oAText.nodeValue = "[ Unpin ]"; } else { oChild.pinned = "false"; oAText.nodeValue = "[ Pin ]"; } } iChildCount++; } } function closeMarketDetail(iLineOwnerRef) { var bFoundCorrectChild = false; var oDivMain; var iDivMainCount; var iChildCount; var oChild; // this is where all content frames are held oDivMain = $("bodyMarketManagementDetail"); // how many content frames are there? iDivMainCount = oDivMain.childNodes.length; iChildCount = 0; while((bFoundCorrectChild === false) && (iChildCount < iDivMainCount)) { // get the content frame oChild = oDivMain.childNodes[iChildCount]; // is the content frame the one we want? if(parseInt(oChild.treeParentId) === iLineOwnerRef) { // if pinned. get confirmation var bConfirm = true; if(oChild.pinned === "true") { bConfirm = confirm("Item is pinned. Are you sure?"); } if(bConfirm === true) { cleanAllChildren(oChild); oChild.parentNode.removeChild(oChild); } bFoundCorrectChild = true; } iChildCount++; } } function initialiseMarkets() { populateTreeLevel(1, 0, "bodyMarketManagementNavigationToday"); populateTreeLevel(1, 0, "bodyMarketManagementNavigationFuture"); // move somewhere else.. this will do for now populateCalander(); showQueryMarket(); } function showTodaysMarket() { $("tabToday").className = "active"; $("tabFuture").className = "inactive"; $("tabQuery").className = "inactive"; $("bodyMarketManagementNavigationToday").style.visibility = "visible"; $("bodyMarketManagementNavigationFuture").style.visibility = "hidden"; $("bodyMarketManagementNavigationQuery").style.visibility = "hidden"; } function showFutureMarket() { $("tabToday").className = "inactive"; $("tabFuture").className = "active"; $("tabQuery").className = "inactive"; $("bodyMarketManagementNavigationToday").style.visibility = "hidden"; $("bodyMarketManagementNavigationFuture").style.visibility = "visible"; $("bodyMarketManagementNavigationQuery").style.visibility = "hidden"; } function showQueryMarket() { $("tabToday").className = "inactive"; $("tabFuture").className = "inactive"; $("tabQuery").className = "active"; $("bodyMarketManagementNavigationToday").style.visibility = "hidden"; $("bodyMarketManagementNavigationFuture").style.visibility = "hidden"; $("bodyMarketManagementNavigationQuery").style.visibility = "visible"; } function getStatusColour(iStatus) { var sStatusColour = "" switch(iStatus) { case 1: // active/open sStatusColour = "green"; break; case 2: // inactive sStatusColour = ""; break; case 3: // settled/graded sStatusColour = "red"; break; case 4: // voided sStatusColour = "black"; break; case 6: // suspended sStatusColour = "amber"; break; case 8: // closed sStatusColour = "blue"; break; } return sStatusColour; } function getStatus(iStatus) { var sStatus = "" switch(iStatus) { case STATUS_ACTIVE: // active/open sStatus = "Active"; break; case STATUS_INACTIVE: // inactive sStatus = "Inactive"; break; case STATUS_SETTLED: // settled/graded sStatus = "Settled"; break; case STATUS_VOIDED: // voided sStatus = "Void"; break; case STATUS_SUSPENDED: // suspended sStatus = "Suspended"; break; case STATUS_PENDING: // pending sStatus = "Pending"; break; case STATUS_CLOSED: // closed sStatus = "Closed"; break; case STATUS_SCRATCHED: // scratched sStatus = "Scratched"; break; } return sStatus; } function getMarketDateFilterCode(sMarketTab) { var iMarketDateFilterCode = 0; switch(sMarketTab) { case "bodyMarketManagementNavigationToday": { iMarketDateFilterCode = 0; break; } case "bodyMarketManagementNavigationFuture": { iMarketDateFilterCode = 1; break; } case "bodyMarketManagementNavigationQueryMarket": { iMarketDateFilterCode = 2; break; } } // //iMarketDateFilterCode = 2; // return iMarketDateFilterCode; } function hasDetailBeenShown(iTreeParentId) { /* * function: hasDetailBeenShown * purpose: Checks to see if a detail level is already in display or not * params: iParentId * returns: boolean */ var bShown = false; var oParentNode = $("bodyMarketManagementDetail") var iChildNodeCount = oParentNode.childNodes.length; var iCount = 0; while((bShown === false) && (iCount < iChildNodeCount)) { oChild = oParentNode.childNodes[iCount]; iCount++; if(parseInt(oChild.treeParentId) === iTreeParentId) { bShown = true; } } return bShown; } function scrollToDetail(iTreeParentId) { /* * function: scrollToDetail * purpose: Finds a detail frame, and moves the browser to it * params: iTreeParentId * returns: none */ var bFoundChild = false; var oParentNode = $("bodyMarketManagementDetail"); var iChildNodeCount = oParentNode.childNodes.length; var iCount = 0; while((bFoundChild === false) && (iCount < iChildNodeCount)) { oChild = oParentNode.childNodes[iCount]; iCount++; if(parseInt(oChild.treeParentId) === iTreeParentId) { bFoundChild = true; document.location.href = "#" + oChild.id; } } } /************************************************* Query Tab Stuff *************************************************/ function populateCalander() { var oTable = generateCalander() renderCalander(oTable); } function generateCalander() { var aDays = new Array("S","M","T","W","T","F","S"); var aMonths = new Array("January","Febuary","March","April","May","June","July","August","September","October","November","December"); var MAX_COLUMNS = 7; var MAX_ROWS = 8; var oTable = document.createElement("table") oTable.className = "calanderTable"; var oThead = document.createElement("thead"); var oTbody = document.createElement("tbody"); // time stuff var oDate = new Date(); oDate.setFullYear(m_iYear, m_iMonth, m_iDay); var bStartedDays = false; var iDayCount = 0; //var daysInMonth = (32 - new Date(2007, 0, 32).getDate()); var dDate = new Date(m_iYear, m_iMonth+1, 0); var daysInMonth = dDate.getDate(); for(var i = 0; i < MAX_ROWS; i++) { var oTr = document.createElement("tr"); switch(i) { case 0: { var oThLeft = document.createElement("th"); var oButtonLeft = document.createElement("button"); var oButtonLeftText = document.createTextNode("<"); oButtonLeft.appendChild(oButtonLeftText); oButtonLeft.onclick = function () { changeMonth(-1); } oThLeft.appendChild(oButtonLeft); oTr.appendChild(oThLeft); var oThCentre = document.createElement("th"); oThCentre.colSpan = MAX_COLUMNS-2; var oThTextCentre = document.createTextNode(aMonths[oDate.getMonth()] + ", " + oDate.getFullYear()); oThCentre.appendChild(oThTextCentre); oTr.appendChild(oThCentre); var oThRight = document.createElement("th"); var oButtonRight = document.createElement("button"); var oButtonRightText = document.createTextNode(">"); oButtonRight.appendChild(oButtonRightText); oButtonRight.onclick = function () { changeMonth(1); } oThRight.appendChild(oButtonRight); oTr.appendChild(oThRight); oThead.appendChild(oTr); break; } case 1: { for(var j = 0; j < MAX_COLUMNS; j++) { var oTh = document.createElement("th"); var oThText = document.createTextNode(aDays[j]); oTh.appendChild(oThText); oTr.appendChild(oTh); oTr.className = "days"; } oThead.appendChild(oTr); break; } default: { for(var j = 0; j < MAX_COLUMNS; j++) { var oTd = document.createElement("td"); if(bStartedDays === false) { var oTdText = document.createTextNode(""); if(parseInt(oDate.getDay()) === j) { bStartedDays = true; var oTdText = document.createTextNode(iDayCount+1); oTd.onmouseover = function () { this.className = "hover"; } oTd.onmouseout = function () { if(this.active!== "true") { this.className = null; } } oTd.onclick = function () { //this.className = "active"; var sMonth = new String(m_iMonth + 1); var sDay = new String(this.childNodes[0].nodeValue); if(sMonth.length === 1) { sMonth = "0" + sMonth; } if(sDay.length === 1) { sDay = "0" + sDay; } m_sDate = m_iYear + "-" + sMonth + "-" + sDay; populateTreeLevel(1, 0, "bodyMarketManagementNavigationQueryMarket"); } iDayCount++; } } else { if((iDayCount) < daysInMonth) { var oTdText = document.createTextNode(iDayCount+1); oTd.onmouseover = function () { this.className = "hover"; } oTd.onmouseout = function () { this.className = null; } oTd.onclick = function () { /*var oParent = this.parentNode; for(var k = 0; k < oParent.childNodes.length; k++) { var oChild = oParent.childNodes[k]; if((oChild.tagName === "TD") && (oChild.active === "true")) { alert("ok"); oChild.active = false; this.className = null; } } this.active = true; this.className = "active";*/ var sMonth = new String(m_iMonth + 1); var sDay = new String(this.childNodes[0].nodeValue); if(sMonth.length === 1) { sMonth = "0" + sMonth; } if(sDay.length === 1) { sDay = "0" + sDay; } m_sDate = m_iYear + "-" + sMonth + "-" + sDay; populateTreeLevel(1, 0, "bodyMarketManagementNavigationQueryMarket"); } } else { var oTdText = document.createTextNode(""); } iDayCount++; } oTd.appendChild(oTdText); oTr.appendChild(oTd); } oTbody.appendChild(oTr); break; } } // end switch } // end for i oTable.appendChild(oThead); oTable.appendChild(oTbody); return oTable; } function changeMonth(iChangeAmount) { if(iChangeAmount === -1) { if(m_iMonth > 0) { m_iMonth--; } else { if(m_iMonth === 0) { m_iMonth = 11; m_iYear--; } } } else { if(iChangeAmount = 1) { if(m_iMonth < 11) { m_iMonth++; } else { if(m_iMonth === 11) { m_iMonth = 0; m_iYear++; } } } } populateCalander(); } function renderCalander(oTable) { var oCalanderDiv = $("bodyMarketManagementNavigationQueryCalander"); // just for testing // change this to a proper clean and remove. oCalanderDiv.innerHTML = ""; oCalanderDiv.appendChild(oTable); } /************************************************* Real Time / Alarms *************************************************/ function doRealTime() { /* * function: doRealTime() * purpose: Does real time monitoring on next 15 mins of events. * params: none * returns: none */ doRequestRealTime(); doRequestAlarms(); doRequestEvents(); } function doRequestRealTime() { requestRealTime(); // rename the realTime functions to eliminate confusion. setTimeout("doRequestRealTime();", 60000); } function doRequestAlarms() { requestAlarms(); setTimeout("doRequestAlarms();", 2000); } function doRequestEvents() { requestEvents(); setTimeout("doRequestEvents();", 60000); } function requestRealTime() { /* * function: requestRealTime() * purpose: Requests real time event information through Ajax. * params: none * returns: none */ // how many events do we want - this case 4 columns of 4 LI elements = 16 var sParams = "eventCount=16"; // AJAX request is for events. m_iCurrentRequestId = 3; ajaxRequest("php/getRealTime.php", sParams, processRealTime); } function requestAlarms() { /* * function: requestAlarms() * purpose: Requests alarms through Ajax. * params: none * returns: none */ // list of the lineNavs we are in charge of. var sParams = "1011, 1012, 1012"; // AJAX request is for alarms. m_iCurrentRequestId = 2; ajaxRequest("php/getAlarms.php", sParams, processAlarms); } function requestEvents() { /* * function: requestEvents() * purpose: Requests next event information through Ajax. * params: none * returns: none */ // how many events to return. var sParams = "eventCount=20"; // AJAX request is for events. m_iCurrentRequestId = 4; ajaxRequest("php/getEvents.php", sParams, processEvents); } function processAlarms(oResponse) { /* * function: processAlarms() * purpose: Processes alarms and then requests again. * params: sAlarms - the delimited string containing alarm information. * returns: none */ var sAlarms = oResponse.responseText var bFound = false; //we know that there is a change in one of the //last 12 events... update its class var aAlarms = unpackIt(sAlarms); // remove the message info - not using here just now var sGeneric = aAlarms.shift(); var sGeneric2 = aAlarms.shift(); // shift off any alarms which are over 15 mins old updateAlarms(); // store any new alarms storeAlarms(aAlarms); // show any current alarms to the user/browser showAlarmLineOwners(); } function updateAlarms() { // this will filter alarms that are 15 minutes old } function storeAlarms(aAlarms) { // for each alarm recieved for(var i = 0; i < aAlarms.length; i++) { // create an alarm object and set its properties var oAlarm = new Object(); oAlarm.lineName = aAlarms[i][0]; oAlarm.lineRef = aAlarms[i][1]; oAlarm.lineOwnerRef = aAlarms[i][2]; oAlarm.lineOwnerName = aAlarms[i][3]; oAlarm.lineNavTop = aAlarms[i][4]; oAlarm.lineNavName = aAlarms[i][5]; oAlarm.lastUpdate = aAlarms[i][6]; oAlarm.alarmRecieved = aAlarms[i][7]; oAlarm.active = true; // if we have alarms then if(m_aAlarms.length > 0) { var bFoundAlarm = false; // for each alarm we have stored for(var j = 0; j < m_aAlarms.length; j++) { // retrieve alarm oStoredAlarm = m_aAlarms[j]; // if this stored alarm is the same as the one we are checking if((parseInt(oStoredAlarm.lineRef) === oAlarm.lineRef) && (oStoredAlarm.lastUpdate === oAlarm.lastUpdate)) { // set the flag to say we have already dealt with this alarm bFoundAlarm = true; break; } } // if we never found this alarm stored if(bFoundAlarm === false) { //debug("adding another alarm"); // store it m_aAlarms.push(oAlarm); } } // if we have no alarms.. just add it. no checking required else { m_aAlarms.push(oAlarm); } } } function showAlarmLineOwners() { // go through each of our alarms for(var i = 0; i < m_aAlarms.length; i++) { // set to false for each alarm var bFound = false; oStoredAlarm = m_aAlarms[i]; // go through each real time column for(var j = 0; j < 4; j++) { // get the current column var oDiv = $("containerHeaderRealTimeContentColumn" + (j+1)); // check the first child is an unordered list. if(oDiv.firstChild.tagName === "UL") { // get the unordered list var oUnorderedList = oDiv.firstChild; // go through each child in the unordered list for(var k = 0; k < oUnorderedList.childNodes.length; k++) { // if the child is a list item if(oUnorderedList.childNodes[k].tagName === "LI") { // get the list item var oListItem = oUnorderedList.childNodes[k]; // if the list item's lineOwnerRef matches the alarm's if(oListItem.lineOwnerRef === oStoredAlarm.lineOwnerRef) { // then we need to alarm it. var oAnchor = oListItem.firstChild; oAnchor.className = "alarmed"; // set the flag to say we have found bFound = true; } } // end if === LI // we dont need to look through any more elements // so we can break this loop if(bFound === true) { break; } } // end for k (each li) } // end if === UL // we dont need to look through any more columns // so we can break this loop if(bFound === true) { break; } } // end for j (each column) } // end for i (each alarm) } function showAlarmLines(iLineOwnerRef) { for(var i = 0; i < m_aAlarms.length; i++) { // set to false for each alarm oStoredAlarm = m_aAlarms[i]; if(parseInt(oStoredAlarm.lineOwnerRef) === iLineOwnerRef) { var aDiv = document.getElementsByTagName("div") // for each div on the page var iLength = aDiv.length; for(var j = 0; j < iLength; j++) { // if the div has a lineOwnerRef, and it matches // ours, then this is the one we want. if(parseInt(aDiv[j].lineOwnerRef) === iLineOwnerRef) { // traverse the tree var oDiv2 = aDiv[j].childNodes[1]; var oForm = oDiv2.childNodes[0]; var oTable = oForm.childNodes[0]; var oTbody = oTable.childNodes[0]; // for each row in the table body for(var k = 0; k < oTbody.childNodes.length; k++) { // get the row oTableRow = oTbody.childNodes[k]; // if the row's lineRef matches the alarms if(oTableRow.lineRef === oStoredAlarm.lineRef) { // modify the style so to indicate that its alarmed. oTableRow.className = "alarmed"; } } } } } } } function processRealTime(oResponse) { /* * function: processRealTime() * purpose: Processes realtime on events. * params: sRealTime - the delimited string containing real time information. * returns: none */ var sRealTime = oResponse.responseText; var aRealTime = unpackIt(sRealTime); // remove the message info - not using here just now var sGeneric = aRealTime.shift(); var sGeneric2 = aRealTime.shift(); if(aRealTime.length > 0) { var aRealTimeDOM = generateRealTimeDOM(aRealTime); renderRealTime(aRealTimeDOM); } else { //alert("Problem processing RealTime request"); } } function processEvents(oResponse) { /* * function: processEvents() * purpose: Processes next events. * params: sEvents - the delimited string containing event information. * returns: none */ var sEvents = oResponse.responseText; var aEvents = unpackIt(sEvents); // remove the message info - not using here just now var sGeneric = aEvents.shift(); var sGeneric2 = aEvents.shift(); if(aEvents.length > 0) { var oEventsDOM = generateEventsDOM(aEvents); renderEventsDOM(oEventsDOM); } else { //alert("Problem processing events request"); } } function generateRealTimeDOM(aRealTime) { /* * function: generateRealTimeDOM() * purpose: Generates 4x4 array containing 4 rows of 4 DOM trees, * one for each column in the real time space. * params: aRealTime - array of columns and rows * returns: aDOMArray */ // this needs to be fixed!!!!! var MAX_COL = Math.ceil(aRealTime.length / 4); var aRealTimeDOM = new Array(MAX_COL); for(var i = 0; i < MAX_COL; i++) { aRealTimeDOM[i] = document.createElement("ul"); } for(var i = 0; i < aRealTime.length; i++) { var iCol = Math.ceil((i + 1) / 4); var oAnchor; var oListItem; var oAnchorText; oAnchor = document.createElement("a"); oAnchorText = document.createTextNode(aRealTime[i][1] + " - " + aRealTime[i][0]); oAnchor.appendChild(oAnchorText); oAnchor.href = "#"; oAnchor.onclick = function () { contractTodaysMarket(); populateTreeLevel(2, this.parentNode.lineNavSportRef,"bodyMarketManagementNavigationToday"); populateTreeLevel(3, this.parentNode.lineNavRef,"bodyMarketManagementNavigationToday"); populateTreeLevel(4, this.parentNode.lineOwnerRef,"bodyMarketManagementNavigationToday"); m_bViewAlarms = true; } oListItem = document.createElement("li"); oListItem.appendChild(oAnchor); oListItem.lineOwnerRef = aRealTime[i][2]; oListItem.lineNavRef = aRealTime[i][3]; oListItem.lineNavSportRef = aRealTime[i][4]; aRealTimeDOM[iCol-1].appendChild(oListItem); } return aRealTimeDOM; } function renderRealTime(aRealTimeDOM) { for(var i = 0; i < 4; i++) { var oParent = $("containerHeaderRealTimeContentColumn" + (i+1)); if(oParent.firstChild) { cleanAllChildren(oParent.firstChild); oParent.removeChild(oParent.firstChild); } oParent.appendChild(aRealTimeDOM[i]); } } function generateEventsDOM(aEvents) { /* * function: generateEventsDOM() * purpose: Generates an array containing a DOM tree for the times and a DOM tree for the events. Both will be unordered lists * params: aEvents - array of columns and rows * returns: aEventsDOM - 2 element array or DOM trees */ // we only want to elements in the array. var aEventsDOM = new Array(2); // this is the list of times var oUnorderedListTimes = document.createElement("ul"); var oListItemTime; var oListItemTimeText; // this is the list of events var oUnorderedListEvents = document.createElement("ul"); var oListItemEvent; /// this is the list of columns for each event var oUnorderedListEventColumns; var oListItemEventColumn; var oListItemEventColumnText; for(var i = 0; i < aEvents.length; i++) { oListItemTime = document.createElement("li") oListItemTimeText = document.createTextNode(aEvents[i][0]); oListItemTime.appendChild(oListItemTimeText); oUnorderedListTimes.appendChild(oListItemTime); oListItemEvent = document.createElement("li") oListItemEvent.className = "event"; //oListItemEventText = document.createTextNode(); oUnorderedListEventColumns = document.createElement("ul"); oListItemEventColumnText = document.createTextNode(aEvents[i][1]); // + " - " + aEvents[i][2]); oListItemEventColumn = document.createElement("li"); oListItemEventColumn.className = "eventColumn"; oListItemEventColumn.appendChild(oListItemEventColumnText); oUnorderedListEventColumns.appendChild(oListItemEventColumn); oListItemEventColumnText = document.createTextNode(aEvents[i][3]); oListItemEventColumn = document.createElement("li"); oListItemEventColumn.className = "eventColumn"; oListItemEventColumn.appendChild(oListItemEventColumnText); oUnorderedListEventColumns.appendChild(oListItemEventColumn); oListItemEventColumnText = document.createTextNode(aEvents[i][4]); oListItemEventColumn = document.createElement("li"); oListItemEventColumn.className = "eventColumn"; oListItemEventColumn.appendChild(oListItemEventColumnText); oUnorderedListEventColumns.appendChild(oListItemEventColumn); oUnorderedListEventColumns.className = "eventColumn"; oListItemEvent.appendChild(oUnorderedListEventColumns); oUnorderedListEvents.appendChild(oListItemEvent); oUnorderedListEvents.className = "event"; } aEventsDOM[0] = oUnorderedListTimes; aEventsDOM[1] = oUnorderedListEvents; return(aEventsDOM); } function renderEventsDOM(aEventsDOM) { /* * function: renderEventsDOM() * purpose: Renders the events DOM * params: aEventsDOM - array containing time DOM and event DOM * returns: none */ var oTimesParent = $("bodyEventManagementContentTimes"); var oEventsParent = $("bodyEventManagementContentEvents"); // change to explicit check if(oTimesParent.firstChild) { cleanAllChildren(oTimesParent.firstChild); oTimesParent.removeChild(oTimesParent.firstChild); } oTimesParent.appendChild(aEventsDOM[0]); if(oEventsParent.firstChild) { cleanAllChildren(oEventsParent.firstChild); oEventsParent.removeChild(oEventsParent.firstChild); } oEventsParent.appendChild(aEventsDOM[1]); } /************************************************* Transaction logging/monitoring functions *************************************************/ function addTransaction(iLineOwnerRef, iLineRef) { var oAlarm = new Object(); } /************************************************* Update functions *************************************************/ function sendUpdateLines(iLineOwnerRef, sUpdateString) { /* * function: sendUpdateLines() * purpose: * params: * returns: none */ // how many events to return. var sParams = "sUpdateString=" + sUpdateString; sParams += "&iLineOwnerRef=" + iLineOwnerRef; // AJAX request is for a line update. m_iCurrentRequestId = 5; ajaxRequest("php/updateLines.php", sParams, processLineUpdateResponse); //debug(sParams); } function processLineUpdateResponse(oResponse) { var sResponse = oResponse.responseText; // we want to send better information back. // list of successfull and failed lines {1001|true}|{1002|false} var aResponse = sResponse.split("|"); //var sMessage = aResponse[0]; var sStatus = aResponse.shift(); // get any generic information about the rest of the information. var sMessage = aResponse.shift(); var iLineOwnerRef = parseInt(aResponse.shift()); var iChecksum = parseInt(aResponse.pop()); // write a new function to update on the fly... as removing and adding sticks it to the // bottom of the current list of market details. closeMarketDetail(iLineOwnerRef); populateTreeLevel(4, iLineOwnerRef,"bodyMarketManagementNavigationToday"); } function updateLines(iLineOwnerRef) { /* * function: * purpose: * params: iLineOwnerRef - Integer * returns: none */ // update string protocol >> line=lineRef{statusRef{param1{param2, var sUpdateString = ""; var oForms = document.forms; for(var i = 0; i < oForms.length; i++) { var oForm = oForms[i]; if(parseInt(oForm.lineOwnerRef) === iLineOwnerRef) { // sending as unique param now //sUpdateString += iLineOwnerRef + "|"; var oElements = oForm.elements; for(var j = 0; j < oElements.length; j++) { var oElement = oElements[j]; var sType = oElement.type; if(sType === "select-one") { if(oElement.selectedIndex !== 0) { var iStatus = oElement.options[oElement.selectedIndex].status; if(iStatus === STATUS_SCRATCHED) { // no line ref set - fix this. sUpdateString += oElement.lineRef + "{" + iStatus + "{" + oElement.reductionOdds + "|"; } else { sUpdateString += oElement.lineRef + "{" + iStatus + "|"; } } } } } } if(sUpdateString !== "") { sUpdateString = sUpdateString.substring(0, sUpdateString.length - 1) } sendUpdateLines(iLineOwnerRef, sUpdateString); }