// BElib.txt  v20130324a  peter.brazier@ntlworld.com 

var BE = {};  //BE is the Bridge Event object
BE.lastPair;  //pair number of last score card displayed
BE.points = [];
BE.hands = [];
BE.thisHand;
BE.simsLink = ''; //default - not a sims event
var members = [];
var visitor;

function shortDelay() {
  var x = 1;
  var y = null; // To keep under proper scope

  setTimeout(function() {
      x = x * 3 + 2;
      y = x / 2;
  }, 100);
}

function getDayName(sessionDate) {
    switch (sessionDate.getDay()) {
      case 0:
          return "Sunday";
      case 1:
          return "Monday";
      case 2:
          return "Tuesday";
      case 3:
          return "Wednesday";
      case 4:
          return "Thursday";
      case 5:
          return "Friday";
      case 6:
          return "Saturday";
    }
}

function getMonthName(sessionDate) {
    switch (sessionDate.getMonth()) {
      case 0:
          return "January";
      case 1:
          return "February";
      case 2:
          return "March";
      case 3:
          return "April";
      case 4:
          return "May";
      case 5:
          return "June";
      case 6:
          return "July";
      case 7:
          return "August";
      case 8:
          return "September";
      case 9:
          return "October";
      case 10:
          return "November";
      case 11:
          return "December";
    }
}

function vulnerable(board, pos) {
    var t = true, f = false,
      vul_a = [0, [f, f], [t, f], [f, t], [t, t], [t, f], [f, t], [t, t], [f, f], [f, t], [t, t], [f, f], [t, f], [t, t], [f, f], [t, f], [f, t], [f, f], [t, f], [f, t], [t, t], [t, f], [f, t], [t, t], [f, f], [f, t], [t, t], [f, f], [t, f], [t, t], [f, f], [t, f], [f, t], [f, f], [t, f], [f, t], [t, t]];
    return vul_a[board][pos];
} //END vulnerable(board, pos)

function round2dp(Number) {  //Rounds Number to the nearest 2dp
    return (Math.round(100 * Number)) / 100;
}

function percentage(pair) {
  return round2dp(100 * BE.pairs[pair][3] / BE.pairs[pair][4]);
}

function processPage() {
  //Wait for the page to load before running the process and display. This funciton is called onload
  processData();
  displayResults();
}

function getMembersID(name) { //returns Id if a memeber otherwith returns undefined
  var id, temp;
  
  for (id = 1; id < members.length; id += 1){
      if (members[id] !== undefined){
          if (members[id][0] === name){
          return id;
          }
      }
  }
  return 0;
}

function sortArray(arrayName, index) {  // Sort arrayName by the  index  ( in range 0 to ?) in each array - see: http://stackoverflow.com/questions/4382098/javascript-multidimensional-array-sort-by-specified-index
  arrayName.sort(function (a, b) {
        if (a[index] === b[index]) {
            return 0;
        }
      return a[index] > b[index] ? -1 : 1;
    });
}

function processData() {
//alert("date = " + BE.date);       
  var pn, i, r, board,
      sessionDate = new Date(BE.date.slice(0, 4), (BE.date.slice(4, 6) - 1), BE.date.slice(6, 8));

      
  BE.sessionDateStr = getDayName(sessionDate) + " " + sessionDate.getDate() + " " + getMonthName(sessionDate) + " " + sessionDate.getFullYear();
  
  BE.rank = [[],[]];  //[0] for NS or 1 winner, [1] for EW with 2 winners. [0 or 1][pair number, %] 

  if (BE.winners === 1) {
      for (i = 1; i <= 2 * BE.tables; i += 1) {
          BE.rank[0][i - 1] = [i, BE.pairs[i][5]];    //[pair row, %]  row starts at 0
      }
      sortArray(BE.rank[0],1);    //sort results array in decending % order
      rankResults();
  }
  else {  // 2 winners

      for (i = 1; i <= BE.tables; i += 1) {
          pn = i;
          BE.rank[0][i - 1] = [pn, BE.pairs[pn][5]];  //NS BE.rank[0][i - 1] = [pn, %]
          pn = i + BE.tables;
          BE.rank[1][i - 1] = [pn, BE.pairs[pn][5]];  //EW
      }

      sortArray(BE.rank[0],1);    //NS
      rankResults();

      sortArray(BE.rank[1],1);    //EW
      rankResults();
  }
  //alert("members.length = " + members.length);
  if (members.length > 0) {
      filterNames();  //Filter names for members, non members and pairs of couple
  }
  
  //Sort Travellers
  for (board = 1; board < BE.travellers.length ; board += 1) {
      travellerRank(board, 5, 7); //sorts on index 5 (EWmps) and puts EW ranks in index 7
      travellerRank(board, 4, 6); //sorts on index 4 (NSmps) and puts NS ranks in index 6 ***THIS WILL BE THE ORDER USED IN ALL SUBSEQUENT OPERATIONS BUT IS NOT SAVED WHEN CLOSED***** 
  }

} //END function ProcessData()

function rankResults() {
// Sorts the traveller rows in order of BE.travellers[board][index1] and places the ranks in BE.travellers[board][index2]
// On exit the traveller rows are in the final sorted order

  var r, rank_a = [[], [], [], []], pn, pc, ns = 0, ew = 1;
  
  if (BE.winners === 1){
      for (r = 0; r < BE.rank[0].length; r += 1) {    // initialize rank_a[r]
          pn = BE.rank[0][r][0];
          pc = BE.rank[0][r][1];
          rank_a[r] = [r, pn, r + 1, "", pc];
      }

      for (r = 1; r < BE.rank[0].length; r += 1) {
          if(rank_a[r][4] === rank_a[r - 1][4]) {  // same %
              rank_a[r][2] = rank_a[r - 1][2];  
              rank_a[r][3] = "=";
              rank_a[r - 1][3] = "=";
  //  alert("resultsRank  r = " + r);
          }
      }
      
  //  alert("rank_a = " + rank_a);
      for (r = 0; r < BE.rank[0].length; r += 1) {  // write ranks to BE.travellers[board][r][index2]
          pn = BE.rank[0][r][0];
          BE.pairs[pn][2] = rank_a[r][2] + rank_a[r][3];
          
  //  alert("NS pn = " + pn + "  rank = " + BE.pairs[pn][2]); 
      }
  }
  
  else {  //2 winners
      // NS
      for (r = 0; r < BE.tables; r += 1) {    // initialize rank_a[r]
          pn = BE.rank[ns][r][0];
          pc = BE.rank[ns][r][1];
          rank_a[r] = [r, pn, r + 1, "", pc];
      }

      for (r = 1; r <  BE.tables; r += 1) {
          if(rank_a[r][4] === rank_a[r - 1][4]) {  // same %
              rank_a[r][2] = rank_a[r - 1][2];  
              rank_a[r][3] = "=";
              rank_a[r - 1][3] = "=";
      //alert("NS resultsRank  r = " + r);
          }
      }
      
      //alert("rank_a = " + rank_a);
      for (r = 0; r < BE.rank[0].length; r += 1) {  // write ranks to BE.pairs[pn][2]
          pn = BE.rank[ns][r][0];
          BE.pairs[pn][2] = rank_a[r][2] + rank_a[r][3];
      }
      
      // EW
      for (r = 0; r < BE.tables; r += 1) {    // initialize rank_a[r]
          pn = BE.rank[ew][r][0];
          pc = BE.rank[ew][r][1];
          rank_a[r] = [r, pn, r + 1, "", pc];
      }
//alert("A rank_a = " + rank_a);
      for (r = 1; r < BE.tables; r += 1) {
          if(rank_a[r][4] === rank_a[r - 1][4]) {  // same %
              rank_a[r][2] = rank_a[r - 1][2];  
              rank_a[r][3] = "=";
              rank_a[r - 1][3] = "=";
//        alert("EW resultsRank  r = " + r);
          }
      }
      
//alert("EW rank_a = " + rank_a);
      for (r = 0; r < BE.rank[1].length; r += 1) {  // write ranks to BE.travellers[board][r][index2]
          pn = BE.rank[ew][r][0];
          BE.pairs[pn][2] = rank_a[r][2] + rank_a[r][3];
          
//        alert("EW pn = " + pn + "  rank = " + BE.pairs[pn][2]); 
      }
  }
} //END function rankResults()

function filterNames(){
  var id1, id2, id1spouse;
  
  //tag visitors as <i>name</i> - the name is then displayed in italics
  visitor = false;
  for (pn = 1; pn < BE.pairs.length; pn +=1) {
      if (BE.pairs[pn][0] !== undefined) {    // is not a missing pair
          
          //name1
          id1 = getMembersID(BE.pairs[pn][0]);    
          if (id1 === 0) {    //a visitor
              visitor = true;
              BE.pairs[pn][0] = "<i>" + BE.pairs[pn][0] + "</i>";
              id1spouse = 0;
              //alert("visitor: pn = " + pn + "  " + BE.pairs[pn][0]);
          }
          else {  // member
              if (members[id1][1].length > 0) {   // has nickname
                  BE.pairs[pn][0] = members[id1][1] + BE.pairs[pn][0].substring(BE.pairs[pn][0].indexOf(' '));
                  //alert("BE.pairs[pn][0] = " + BE.pairs[pn][0]);
              }
              id1spouse = members[id1][2];
          }
          
          //name2
          id2 = getMembersID(BE.pairs[pn][1]);    
          if (id2 === 0) {    //a visitor
              visitor = true;
              BE.pairs[pn][1] = "<i>" + BE.pairs[pn][1] + "</i>";
              //alert("visitor: pn = " + pn + "  " + BE.pairs[pn][1]);
          }
          else {  // member
              if (members[id2][1].length > 0) {   // has nickname
                  BE.pairs[pn][1] = members[id2][1] + BE.pairs[pn][1].substring(BE.pairs[pn][1].indexOf(' '));
                  //alert("nickname = " + members[id2][1]);
                  //alert("surname = " + BE.pairs[pn][1].substring(BE.pairs[pn][1].indexOf(' ')));
                  //alert("BE.pairs[pn][1] = " + BE.pairs[pn][1]);
              }
              //look for couples
              if (id2 === id1spouse) {    // a couple
                  BE.pairs[pn][0] = BE.pairs[pn][0].substring(0, BE.pairs[pn][0].indexOf(' '));
                  //alert("couple pn = " + pn + "  " + BE.pairs[pn][0] + " & " + BE.pairs[pn][1]);
              }
          }
      }
  }
}

function travellerRank(board, index1, index2) {
// Sorts the traveller rows in order of BE.travellers[board][index1] and places the ranks in BE.travellers[board][index2]
// On exit the traveller rows are in the final sorted order

  var r, rank_a = [[], [], [], []];
  
  sortArray(BE.travellers[board], index1);
  for (r = 0; r < BE.travellers[board].length; r += 1) {  // initialize rank_a[r]
      rank_a[r] = [r, BE.travellers[board][r][index1], r + 1, ""];
  }
  for (r = 1; r < BE.travellers[board].length; r += 1) {
      if(rank_a[r][1] === rank_a[r - 1][1]) {  // find = positions
          rank_a[r][2] = rank_a[r - 1][2];
          rank_a[r][3] = "=";
          rank_a[r - 1][3] = "=";
      }
  }
  for (r = 0; r < BE.travellers[board].length; r += 1) {  // write ranks to BE.travellers[board][r][index2]
      BE.travellers[board][r][index2] = rank_a[r][2] + rank_a[r][3];
  }
}//END function travellerRank(board, indrx)


function displayResults() {

  function writePairData(pair) {
      var url, id1, id2;

      if (BE.pairs[pair][0] === undefined) {
          divString += "<td class='right2px' colspan=" + nCols + "><font color='DarkGrey'>missing pair</fontcolor></td>";
      }
      else {
          //alert(getMembersID("Peter Brazier"));
          divString += "<td>" + BE.pairs[pair][2] + "</td>";  //Rank
          url =  "javascript: displayScoreCard(" + pair + ")";
          
          divString += "<td class='left'>" + (BE.pairs[pair][0] + " & " + BE.pairs[pair][1]).link(url) + "</td>";   //pair names
          divString += "<td>" + BE.pairs[pair][5] + "</td>";  //%
          if (BE.points[2]) {  // green points awarded
              divString += "<td>" + (BE.pairs[pair][6] === undefined ? "" : BE.pairs[pair][6]) + "</td>";   //green points  
          }
          if (BE.points[1]) {  // blue points awarded
              divString += "<td>" + (BE.pairs[pair][7] === undefined ? "" : BE.pairs[pair][7]) + "</td>";   //green points  
          }
          if (BE.points[0]) {  // local points awarded
              divString += "<td>" + (BE.pairs[pair][8] === undefined ? "" : BE.pairs[pair][8]) + "</td>";   //green points  
          }
          
          divString += "<td>" + BE.pairs[pair][3] + "</td>";  //match points
          divString += "<td class='right2px'>" + BE.pairs[pair][4] + "</td>"; //max match points
      }
  }   //END function writePairData(pair)
  
      function writePointsHeadings() {
          if (BE.points[2]) {
              divString +=  "<th class='small'>green<br>pts</th>";
          }
          if (BE.points[1]) {
              divString += "<th class='small'>blue<br>pts</th>";
          }
          if (BE.points[0]) {
              divString += "<th class='small'>local<br>pts</th>";
          }
      }   //END function writePointsHeadings
      
      
  var r, b, url, pair, pairNames, nCols = 5, divString = "";
  
  divString += "<div class='page'>";
  divString += "<div class ='banner'>";
  divString += "<h2>" + BE.sessionDateStr;
  
  if (BE.session !== 1 && BE.section === '') {
      divString +=  "-" + BE.session;
  }
  if (BE.section !== ''){
      divString +=  "-" + BE.session + "-" + BE.section;
  }
  divString +=  "&nbsp;&nbsp;&nbsp;"  + BE.title +"</h2>";
  divString += "<h3>" + BE.movementDescription + "&nbsp;&nbsp;&nbsp; Director: " + BE.director + "&nbsp;&nbsp;&nbsp;Scorer: " + BE.scorer + "</h3>";
  if (BE.simsLink !== '') {   //displays sims linl  
      divString += "<p><a href='" + BE.simsLink + "')>" + BE.simsLinkCaption + "</a></p>";
  }
  divString += "</div>";
  
  divString += "<div class ='main'>";
  divString += "<table>";
  
  if (BE.winners === 1) {
      nCols = nCols + BE.points[0] + BE.points[1] + BE.points[2]
      divString += "<tr><th>Rank</th><th>Pair</th><th>%</th>";
      writePointsHeadings();
      //divString += GPs ? "<th>GP</th>" : "";
      //divString += "<th>LP</th>";
      divString += "<th class='small'>match<br>points</th><th class='small'>max<br>mps</th></tr>";
      for (r = 0; r < BE.pairs.length - 1; r += 1) {
          pair = BE.rank[0][r][0];
          divString += "<tr>";
          writePairData(pair);
          divString += "</tr>";
      }
  }
  else{   // 2 winners
      nCols = nCols + BE.points[0] + BE.points[1] + BE.points[2]
      //alert(nCols);
      divString += "<tr><th class='right2px' colspan=" + nCols + "><b>North/South</b></th><th colspan=" + nCols + "><b>East/West</b></th></tr>";
      divString += "<tr>";
      divString += "<th>Rank</th><th>Pair</th><th>%</th>";
      writePointsHeadings();
      divString += "<th class='small'>match<br>points</th><th class='small right2px'>max<br>mps</th>";
      divString += "<th>Rank</th><th>Pair</th><th>%</th>";
      writePointsHeadings();
      divString += "<th class='small'>match<br>points</th><th class='small right2px'>max<br>mps</th>";
      divString += "</tr>";
  
      for (r = 0; r <= BE.tables - 1; r += 1) {
          divString += "<tr>";
          pair = BE.rank[0][r][0];    // NS
          writePairData(pair);

          pair = BE.rank[1][r][0];    // EW
          writePairData(pair);
          divString += "</tr>";
      }
  }
  divString += "</table>";
  if (visitor) {
      divString += "<i>Vistors are shown in italics</i>";
  }
  
  divString += "<div class ='footer'>";
  divString += "<p>For a pair's score card click on their names or for a board's traveller";
  if (BE.hands.length>0) {    //H file present
      divString += " and hands";
  }
  divString +=    " - click on its board number below:</p>";

  for (b = 1; b < BE.travellers.length; b += 1) {
      divString += "<a href='javascript:displayTraveller(" + b + ")'>" + b + "</a>";
      divString += "&nbsp;&nbsp";
  }

  //Close window and return to Home page of web site
  
  divString += "<p>Scored with PairsScorer " + BE.version + "(c)JAS<p>";
  divString += "</div>";
  divString += "</div>";
  divString += "</div>";
  
  //Set the divString to the div on the page
  document.getElementById('pageContent').innerHTML = divString;
}// END function DisplayResults



function displayTraveller(board) {
  

  function displayHand(){
  
      function writeHand(iSeat){
          return "&spades;&nbsp;" + thisHand[iSeat][0] + "<br>" + "<font color='red'>&hearts;&nbsp;</font>" + thisHand[iSeat][1] + "<br>" + "<font color='red'>&diams;&nbsp;</font>" + thisHand[iSeat][2] + "<br>" + "&clubs;&nbsp;" + thisHand[iSeat][3];
      } //END function writeHand(hand)
  
  //Start of function displayHand()
  
  var thisHand, iSeat;
      if (BE.hands[board] === undefined){ //no hand data for this board
          return;
      }
      else {  //generate hand[seat][suit] array where seat = 0 for N, 1 for E, 2 for S and 3 for W suit = 0 for spades, 1 for hearts, 2 for diamonds and 3 for clubs
          //alert("BE.hands[board].length = " + BE.hands[1].length);
          if (BE.hands[board].length === 67){ //exact number of characters required
              
              thisHand = BE.hands[board];
              thisHand = thisHand.split(",");
              for (iSeat = 0; iSeat < 4; iSeat += 1){
                  thisHand[iSeat] = thisHand[iSeat].split(" ");
              }
      
              divString += "<table class='hands'>";
              divString += "<tr><td class='blank'></td><td class='cards' colspan='2'>" + writeHand(0) + "</td></tr>"; //north
              divString += "<tr><td class='cards'>" + writeHand(3) + "</td>"; //west
              divString += "<td class='tableTop' bgcolor='#80FF80'><div class='dealer_" + dealer + "'><img src='dealer.gif' width='20' height='20'></div></td>";
              divString += "<td class='cards'>" + writeHand(1) + "</td></tr>";//east
              divString += "<tr><td class='blank'></td><td class='cards' colspan='2'>" + writeHand(2) + "</td></tr>"; //south
              
              divString += "</table>";
          }
      }
      
  }   //end of displayHand()
  
//Start of function displayTraveller(board)

  var positions = ['north','east','south','west'],
      b, row, url, leadColumn,
      contract,
      dealer = positions[(board-1)%4],
      
      NSvul = (vulnerable(board, 0) ? true: false),
      EWvul = (vulnerable(board, 1) ? true: false),
      divString = "";
      
  divString += "<link rel='stylesheet' type='text/css' href='ResultsStyles.css'>";
  divString += "<h2>Traveller for Board " + board + "&nbsp;&nbsp;-&nbsp;&nbsp" + BE.sessionDateStr + "</h2>";

  if (BE.hands.length>0) {    //H file present
      displayHand();
  }
  
  leadColumn = displayLead(board);    //true if a lead on this board has been entered
  
  divString += "<table class='table'>";
  divString += "<tr>";
  divString += "<th colspan='2' class='right2px " + (NSvul ? "vul" : "nonvul") + "'>North/South&nbsp;&nbsp;" + (NSvul ? "(vulnerable)" : "(not vulnerable)") + "</th>";
  divString += "<th colspan='2' class='right2px " + (EWvul ? "vul" : "nonvul") + "'>East/West&nbsp;&nbsp;" + (EWvul ? "(vulnerable)" : "(not vulnerable)") + "</th>";
  divString += leadColumn ? "<th colspan='7'>" + "  Dealer " + dealer + "</th>" : "<th colspan='6'>" + "  Dealer " + dealer + "</th>";
  divString += "</tr>";
  
  divString += "<tr>";
  divString += "<th class='small'>rank on<br>board</th><th class='right2px'>pair</th><th class='small'>rank on<br>board</th><th class='right2px'>pair</th>";
  divString += "<th>contract</th><th align='center'>by</th>";
  if (leadColumn) {
      divString +=  "<th align='center'>lead</th>";
  }
  divString += "<th>tricks</th><th class='small'> score<br>NS</th><th colspan='2' class='small'>match pts<br>NS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EW</th></tr>";

  for (row = 0; row < BE.travellers[board].length; row += 1) {
      clrStr = parseCRLstr(board, row);
      contract = clrStr[0];
      tricksMade = clrStr[1];
      declarer = clrStr[2];
      lead = clrStr[3];

      divString += "<tr>";
      divString += "<td>" + BE.travellers[board][row][6] + "</td>";   //rank 
      divString += "<td class='right2px left " + (NSvul ? "vul" : "nonvul") + "'>" + (BE.pairs[BE.travellers[board][row][0]][0] + " & " + BE.pairs[BE.travellers[board][row][0]][1]) + "</td>";   //NS pair names
      divString += "<td>" + BE.travellers[board][row][7] + "</td>";   //EW rank
      divString += "<td class='right2px left " + (EWvul ? "vul" : "nonvul") + "'>" + (BE.pairs[BE.travellers[board][row][1]][0] + " & " + BE.pairs[BE.travellers[board][row][1]][1]) + "</td>";   //EW pair names
      divString += "<td>" + contract + '</td>'; //contract
      divString += "<td>" + declarer + '</td>'; //by
      
      if (leadColumn) {
          divString += "<td>" + lead + '</td>';
      }

      if (contract !== "Pass") {
          divString += '<td>' + tricksMade + '</td>'; //tricks
      }
      else {
          divString += '<td></td>';   //tricks blank
      }
      divString += '<td>' + BE.travellers[board][row][3] + '</td>';   //NS score
      divString += '<td>' + round2dp(BE.travellers[board][row][4]) + '</td>'; //NS match points rounded to nearest/up 2dp
      divString += '<td>' + round2dp(BE.travellers[board][row][5]) + '</td>'; //EW match points rounded to nearest/up 2dp
      divString += '</tr>';
  }
  divString += '</table>';
  
  divString += "<p>For another traveller click on the board number below</p>";
  if(board > 1) {
      b = board - 1;
      divString += "<a href='javascript:displayTraveller(" + b + ")'>Previous&nbsp;&nbsp;</a>";
  }
  else {
      divString += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
  }
  for (b = 1; b < BE.travellers.length; b += 1) {
      divString += "<a href='javascript:displayTraveller(" + b + ")'>" + b + "</a>";
      divString += "&nbsp;&nbsp";
  }
  if(board < BE.travellers.length - 1) {
      b = board + 1;
      divString += "<a href='javascript:displayTraveller(" + b + ")'>&nbsp;Next&nbsp;</a>";
  }
  
  divString += "<p><a href='javascript:displayResults();'>Back to Results</a>";
  if(BE.lastPair !== undefined) {
      divString += "<a href='javascript:displayScoreCard(BE.lastPair);'>&nbsp;&nbsp;&nbsp;&nbsp;Back to Score Card</a>";
  }
  divString += "</p>";
  
  document.getElementById('pageContent').innerHTML = divString;
  
} //End displayTraveller(board)


function getTravellerRow(board, pair) {// finds the row in travN in which pair occurs and returns the array[row][0 if sitting NS or 1 for EW][opposition pair number]
  var r = 0;
  for (r = 0; r < BE.travellers[board].length; r += 1) {
      if (pair === BE.travellers[board][r][0] || pair === BE.travellers[board][r][1]) {
          return r;
      }
  }
  return undefined;   // pair did not play board
}

function parseCRLstr(board, row) {
  var crlStr, // the Contract/Score/Lead string from PairsScorer
      i,  //index starting ar 0 of character in crlStr
      contract, tricksBid, tricksMade, declarer, lead;
  
  crlStr = BE.travellers[board][row][2];
  if(crlStr.length > 0) { //not an average
      tricksBid = parseInt(crlStr,10);
      if (tricksBid > 0 && tricksBid < 8) {
          i = 1;
          if (crlStr.charAt(i) === 'N') {
              declarer = 'NT';
              i = 3;
          }
          else {
              declarer = crlStr.charAt(i);
              i = 2;
          } 
          
          while (crlStr.charAt(i) === 'x') {  //skip over x or xx
              i += 1;
          }
  
          contract = crlStr.slice(0, i);
  //alert("contract = " + contract);
          
          switch(crlStr.charAt(i)) {
              case '=':
                  tricksMade = tricksBid + 6;
                  break;
              case '+':
                  i += 1;
                  tricksMade = tricksBid + 6 + parseInt(crlStr.charAt(i), 10);
                  break;
              case '-':
                  i += 1;
                  tricksMade = tricksBid + 6 - parseInt(crlStr.charAt(i), 10);
                  break;
          }
          
          i += 1;
          
          declarer = crlStr.charAt(i);
          i += 1;
          if (crlStr.length > i) {    //lead has been entered
              lead = crlStr.slice(i);
          }
          else {
              lead = ' ';
          }
          return [contract, tricksMade, declarer, lead];
      }
      if (crlStr.charAt(0) === 'P') { //Passed out
          return ['Pass',' ',' ',' '];
  }
  else
      return [' ',' ',' ',' '];   //average
  }   
} //END function parseCRLstr(board, row)

function displayLead(board) {
  var row, lead;
  for (row = 0; row < BE.travellers[board].length; row += 1) {
      lead = parseCRLstr(board, row)[3];
      if (lead.length > 1) {
          return true;
      }
  }
  return false;
}

function displayScoreCard(pair) { 
  var NSvul, EWvul, clrStr, contract, score, matchPoints, rank, sitting, board, url, row, oppPair, tricksMade, divString = "";
  
  BE.lastPair = pair;

  divString += "<div class='page'>";
  divString += "<div class ='banner'>";
  divString = "<h2>Score Card for " + (BE.pairs[pair][0] + " & " + BE.pairs[pair][1]) + "&nbsp;&nbsp;-&nbsp;&nbsp" + BE.sessionDateStr + "</h2>"; //pair = primary pair number
  divString += "</div>";
  
  divString += "<div class ='main'>";
  divString += "<table class='center'>";
  divString += "<tr>";
  divString += "<th> Board </th><th> Sitting </th><th>Opponents</th>";
  divString += "<th rowspan='1'>contract</th><th rowspan='1'>by</th><th rowspan='1'>tricks</th>";
  divString += "<th>score</th><th class='small'>match<br>points</th><th class='small'>rank on <br>board</th>";
  divString += "</tr>";
  
  for (board = 1; board < BE.travellers.length; board += 1) { 
      row = getTravellerRow(board, pair);
      
      if (row !== undefined) {
          clrStr = parseCRLstr(board, row);
          contract = clrStr[0];
          tricksMade = clrStr[1];
          declarer = clrStr[2];
          lead = clrStr[3];

          NSvul = (vulnerable(board, 0) ? true: false);
          EWvul = (vulnerable(board, 1) ? true: false);
  
          divString += "<tr>";
          url =  "javascript: displayTraveller(" + board.toString() + ")";
          board_str = board.toString();
          divString += "<td>" + board.toString().link(url) + "</td>";
          sitting = (pair === BE.travellers[board][row][0]) ? "NS" : "EW";

          if (sitting === "NS") {
              divString += "<td class='" + (NSvul ? "vul": "nonvul") + "'>NS</td>";
              oppPair = BE.travellers[board][row][1];
              divString += "<td class='left " + (NSvul ? "vul": "nonvul") + "'>" + (BE.pairs[oppPair][0] + " & " + BE.pairs[oppPair][1]) + "</td>";
              rank = BE.travellers[board][row][6];
          }
          else {
              divString += "<td class='" + (EWvul ? "vul": "nonvul") + "'>EW</td>";
              oppPair = BE.travellers[board][row][0];
              divString += "<td class='left " + (EWvul ? "vul": "nonvul") + "'>" + (BE.pairs[oppPair][0] + " & " + BE.pairs[oppPair][1]) + "</td>";
              rank = BE.travellers[board][row][7];
            }
          
          divString += "<td>" + contract + "</td>";

          if (contract === "Pass") {
              divString += "<td></td>"; //by
              divString += "<td></td>"; //tricks made
              divString += "<td>" + 0 + "</td>";  //score
          }
          else if (contract ===' ') { // average
              divString += "<td></td>"; //by
              divString += "<td></td>"; //tricks made
              divString += "<td>" + BE.travellers[board][row][3] + "</td>";   //score
          }
          else {
              divString += "<td>" + declarer + "</td>";   //by
              divString += "<td>" + tricksMade + "</td>"; //tricks made
              score = BE.travellers[board][row][3];

              if (sitting === "EW") {
                  score *= -1;
              }
              divString += "<td>" + score + "</td>";  //score
          }

          if (sitting === "NS") {
              matchPoints = BE.travellers[board][row][4];
          }
          else {
              matchPoints = BE.travellers[board][row][5];
          }

          divString += "<td>" + round2dp(matchPoints) + "</td>";  //match points
          divString += "<td>" + rank + "</td>";   //rank
          divString += "</tr>";
      }
  }
  divString += "</table>";
  divString += "<div><span class='vul')>vulnerable</span>&nbsp;&nbsp;not vulnerable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>";
  
  divString += "<div class ='footer'>";
  divString += "<p>For a board's traveller click on the board number or ";
  divString += "<a href='javascript:displayResults();'>Back to results</a></p>";
  
  divString += "</div>";
  divString += "</div>";
  divString += "</div>";
  
  document.getElementById('pageContent').innerHTML = divString;
} //End displayScoreCard