// Copyright 2000-2007, Newsfutures, Inc. All Rights Reserved. // Confidential and Proprietary Information of Newsfutures, Inc. // %Z%%M%, %I%, %G% // // BAM trnmt - javascript client code var binsById = new Object(); var binsBySymbol = new Object(); var spaceBarImg = "/elab/imgs/white.gif"; var greenBarImg = "/elab/imgs/bam/greenBar.png"; var redBarImg = "/elab/imgs/bam/redBar.png"; var hdrColor = "#5060A0"; var sortHdrColor = "purple"; // max number of greens/reds voted on any bin var maxGreenBar = 0; var maxRedBar = 0; var maxBar = 0; var barWidth = 100; var maxGreenBarWidth = 0; var maxRedBarWidth = 0; var hasActiveBins = false; // make sure we check that form is submitted if any changes were made document.body.onUnload = "javascript:handleUnload();"; // initialize a few things function initData() { // if state not initialized, do it if(state.filter == undefined) state.filter = 'all'; if(state.sort == undefined) state.sort = 'name'; if(state.sortDir == undefined) state.sortDir = 'up'; // add to 'bins' access by the bin symbols for(var i = bins.length ; i-- > 0 ; ) { var bin = bins[i]; binsBySymbol[bin.symbol] = bin; binsById[bin.id] = bin; hasActiveBins = hasActiveBins || (bin.state == 'active'); bin.marbles = 0; bin.origMarbles = 0; bin.flagged = false; //if(bin.period.greens > maxGreenBar) maxGreenBar = bin.period.greens; //if(bin.period.reds > maxRedBar) maxRedBar = bin.period.reds; if(bin.totalGreens > maxGreenBar) maxGreenBar = bin.totalGreens; if(bin.totalReds > maxRedBar) maxRedBar = bin.totalReds; } maxBar = maxGreenBar + maxRedBar; maxGreenBarWidth = (maxGreenBar/maxBar)*barWidth; maxRedBarWidth = (maxRedBar/maxBar)*barWidth; // move cumulative investments in bins for(var i = cumulInvs.length ; i-- > 0 ; ) { binsById[cumulInvs[i].binId].cumulInv = cumulInvs[i]; } // if all bins are closed, automatically select the 'filter' to judged ideas if(!hasActiveBins) state.filter = "closed"; // sort bins according to popularity state.sort = "pop"; sortBins(state.sort); } // generate various page objects function initScreen() { // initialize the filer Select obj. var sb = new StringBuffer(); sb.append(""); document.getElementById("filterSpan").innerHTML = sb.toString(); // create an initial bin table redisplayAllBins(); } // display all the bins as specified by the filters function redisplayAllBins() { var t = document.getElementById("binsTbl"); // delete all rows while(t.rows.length > 0) t.deleteRow(0); // build the header var r = t.insertRow(t.rows.length); r.className ="account-header"; r.valign="middle"; var noSortImg = ""; var sortImg = ""; var z = 0; genSortButtonHTML(r.insertCell(z++), "name", "Ideas", state); if(!trnmt.noGraph) { c = r.insertCell(z++); c.colSpan = 2; genSortButtonHTML(c, "pop", "Popularity", state); } // genSortButtonHTML(r.insertCell(z++), "date", "Last Modified", state); // add bins according to filter var arr = new Array(); for(var i = bins.length ; i-- > 0 ; ) { var bin = bins[i]; if(bin.state == "active") { switch(state.filter) { case "all": arr.push(bin); break; case "recent": if(bin.modTs >= trnmt.period.startTs) arr.push(bin); break; default: if(bin.group == state.filter) arr.push(bin); break; } } else { switch(state.filter) { case "suspended": if((bin.state == "suspended") || (bin.state == "halted")) arr.push(bin); break; case "closed": if(bin.state == "closed") arr.push(bin); break; } } } if(state.sortDir == "down") arr.reverse(); for(var i = 0 ; i < arr.length ; i++) { r = t.insertRow(t.rows.length); appendBin(r, arr[i]); } } // append a row for bin to 'sb' function appendBin(r, bin) { var z = 0; // describe Bin c = r.insertCell(z++); c.className = "neutral"; c.innerHTML = "
" + ((bin.wiki != '') ? ("" + bin.title + "") : bin.title) + "
" + ((bin.state != 'active') ? ("" + bin.state + (bin.ruling ? (": " + bin.ruling) : "") + "") : ""); // popularity (green column / red column) if(!trnmt.noGraph) { var redBarWidth = (bin.totalReds / maxRedBar) * maxRedBarWidth; var greenBarWidth = (bin.totalGreens / maxGreenBar) * maxGreenBarWidth; c = r.insertCell(z++); c.bgColor = "#F4F9FF"; c.align = "right"; c.noWrap = "true"; c.innerHTML = ((bin.totalReds > 0) ? ("
" + bin.totalReds + "   ") : " "); c = r.insertCell(z++); c.bgColor = "#F4F9FF"; c.noWrap = "true"; c.innerHTML = ((bin.totalGreens > 0) ? ("
   " + bin.totalGreens + "") : " "); } // creation date // c = r.insertCell(z++); // c.className = "neutral"; // c.noWrap = true; // c.align = "center"; // c.innerHTML = tsToIsoDateTime(bin.modTs, true, false); } function genSortButtonHTML(cell, sortSym, label, state) { cell.noWrap = true; var isSort = state.sort == sortSym; if(isSort) cell.className = "account-grey-header"; var onClick = "onclick='handleSort(\"" + sortSym + "\")'"; cell.innerHTML = "
" + (isSort ? "" : "") + " " + label + "
"; } // return the src of the flag img for 'bin'. function flagImgSrc(bin) { var res = "/elab/imgs/bam/" + (bin.flagged ? "flag.png" : "flagOff.png"); return res; } // the filter has been changed function handleFilter() { var type = document.getElementById("filter").value; state.filter = type; sortBins(type); redisplayAllBins(); } // one of the column headers was clicked to change the sort order function handleSort(type) { if(state.sort == type) { state.sortDir = (state.sortDir == 'up' ? 'down' : 'up'); } else { state.sort = type; } sortBins(type); redisplayAllBins(); } // flip a bin's flagged status function flipFlag(sym) { var bin = binsBySymbol[sym]; bin.flagged = !bin.flagged; // update the screen document.getElementById("flag_" + bin.id).src = flagImgSrc(bin); } /////// bin sorting methods //////////// var curSortOrder; function sortBins(order) { if(order != curSortOrder) { curSortOrder = order; var sortFun = sortByName; switch(order) { case 'date': sortFun = sortByDate; break; case 'flag': sortFun = sortByFlag; break; case 'id': sortFun = sortById; break; case 'name': sortFun = sortByName; break; case 'pop': sortFun = sortByPop; break; } bins.sort(sortFun); } } function sortByDate(bin1, bin2) { var diff = bin1.modTs - bin2.modTs; return diff; } function sortByFlag(bin1, bin2) { var diff = (bin1.flagged == bin2.flagged) ? sortByName(bin1, bin2) : (bin1.flagged ? 1 : -1); return diff; } function sortById(bin1, bin2) { var diff = bin1.id - bin2.id; return diff; } function sortByName(bin1, bin2) { var diff = (bin1.title < bin2.title) ? 1 : ((bin1.title > bin2.title) ? -1 : 0); return diff; } function sortByPop(bin1, bin2) { var diff = (bin1.totalGreens - bin1.totalReds) - (bin2.totalGreens - bin2.totalReds); return diff; } //////// update the current Period information, and if needed at the end of the period, refresh the page var dayLen = 24 * 3600; function updateTimeLeft() { var res = ''; var tl = Math.floor((trnmt.period.endTs - new Date().getTime()) / 1000); if(tl < 0) { // warn that updates may fail res += "PERIOD EXPIRED - "; setTimeout(updateTimeLeft, 1000); } else { var days = Math.floor(tl / dayLen); var hours = Math.floor(tl / 3600) % 24; var mins = Math.floor(tl / 60) % 60; var secs = Math.floor(tl % 60); if(days > 2) { res += days + " days"; setTimeout(updateTimeLeft, dayLen*1000); } else if(tl < 60) { res += "" + tl + " seconds!"; setTimeout(updateTimeLeft, 1000); } else if(tl > dayLen) { res += days + " day(s) " + hours + " hour(s)"; setTimeout(updateTimeLeft, 3600*1000); } else { if(hours > 0) res += hours + " hour(s) "; res += mins + " min(s) "; if(tl < 300) res += secs + "sec(s)"; setTimeout(updateTimeLeft, 1000); } } document.getElementById('timeLeft').innerHTML = res; }