// PEOPLE FUNCTIONS (STORED PROCEDURES)
// sp_people.js
// NB: NEEDS database.js

// :: FUNCTIONS
// f_getPersonName(RecNo,AsIs) - RETURNS PERSONS NAME FROM PASSED ID
// f_linkPerson(RecNo) - CALLS f_getPersonName()
// f_committee(ClubID,ClubPos,TableRow) - RTN LIST OF COMMITTEE PEOPLE FOR CLUB
// f_formatPerson(RecNo,Detail) - FORMATS PERSON RECORD READY FOR DISPLAY
// f_popupPerson(RecNo,Detail) - POPS UP A WINDOW WITH THE CONTACT DETAILS IN
// f_countMembers(ClubID,MemberOnly) - STEPS THROUGH PeopleArr[] AND RETURNS NUMBER OF PEOPLE
// f_rtnMembers(ClubID,MemberOnly,Detail,TextOnly) - STEPS THROUGH PeopleArr[] AND WRITES OUT LIST OF PEOPLE
// f_rtnMembersList(ClubID,MemberOnly) - AS ABOVE, SHORT LIST
// f_rtnEmailList(ClubID,MemberOnly,Detail)
// f_playerLookup(Person,ClubID,Gender,Detail) - RTN LIST OF PEOPLE THAT MEETS CRITERIA

// CONSTANTS
var _MEMBERSONLY = true;
var _EVERYONE = false;

// RETURNS PERSONS NAME FROM PASSED ID
// RecNo - ARRAY NO. OR PersonID (INITIALS)
// AsIs - IF TRUE, THEN DOES NOT CONVERT SPACES INTO &nbsp; (DEFAULT: false)
// FieldNo - OPTIONAL FIELD No. (DEFAULT 2)
// Link - true/false TURN INTO POPUP LINK (DEFAULT false)
function f_getPersonName(RecNo,AsIs,FieldNo,Link) {
  var fields;
  var t;

  // INIT
  t = '';

  // SPECIAL CASES
  if (RecNo == 'X') t = 'None';
  if (RecNo == '?') t = 'Unknown';
  if (t > '') return '<SPAN CLASS="faint"><I>' + t + '</I></SPAN>';

  // DEFAULT
  if (typeof(AsIs) == 'undefined') AsIs = false;
  if (typeof(FieldNo) == 'undefined') FieldNo = 2;
  if (typeof(Link) == 'undefined') Link = false;

  // GET RECORD
  if (typeof(RecNo) == 'number') {
    fields = PeopleArr[RecNo].split(',');
    RecNo = fields[0]; // INITIALS
  } else {
    // ASSUME STRING - INITIALS (BUT CHECK FOR ERROR)
    if (typeof(PeopleArrLookup[RecNo]) == 'undefined') {
      alert('"' + RecNo + '" is not a valid PeopleArr[] ID');
      return '*' + RecNo + '*';
    }
    fields = PeopleArr[PeopleArrLookup[RecNo]].split(',');
  }

  // GET NAME
  if (fields[FieldNo] > '') {
    t = fields[FieldNo];
  } else {
    return '*' + RecNo + '*';
  }

  // CONVERT SPACES INTO &nbsp;
  if (!AsIs) {
    t = t.replace(/\s/g,'&nbsp;');
  }

  // AT THIS POINT, RecNo HOLDS INITIALS AND MUST BE VALID
  if (Link) {
    t = '<A HREF="javascript:f_popupPerson(\'' + RecNo + '\');">' + t + '</A>';
  }

  return t;
}

// TURN INTO POPUP LINK
// NB: SHORT WAY OF CALLING f_getPersonName() ABOVE
function f_linkPerson(RecNo) {
  return f_getPersonName(RecNo,false,2,true);
}

// RTNS LIST OF PEOPLE (OFFICER / COMMITTEE MEMBERS) FOR ClubPos
// NB: CAN RETURN MORE THAN 1 PERSON
// TableRow - true/false WRITE COMPLETE TABLE ROW (DEFAULT false) 
function f_committee(ClubID,ClubPos,TableRow) {
  var i, j, t, fields, carr, count, nm;

  // INIT
  t = '';
  count = 0;
  if (typeof(TableRow) == 'undefined') TableRow = false;

  // STEP THROUGH PeopleArr[]
  for (i=0; i<PeopleArr.length; i++) {
    // GET RECORD
    fields = PeopleArr[i].split(',');

    // IF CLUBID IS SPECIFIED, DOES IT MATCH?
    // NB: PLAYER COULD BELONG TO MORE THAN 1 CLUB
    if ((ClubID != _ALL) && (fields[4].indexOf(ClubID) == -1)) {
      continue;
    }

    // Field#5 CONTAINS -ClubPos
    if (fields.length >= 6) {
      // NEED TO SEARCH...
      carr = fields[5].split('-');
      for(j=1; j<carr.length; j++) {
        if (carr[j] == ClubPos) {
          count++;
          if (count > 1) t += ', ';
          t += '<A HREF="javascript:f_popupPerson(\'' + fields[0] + '\');">' + fields[2].replace(/\s/g,'&nbsp;') + '</A>';
        }
      }
    }
  }

  // VACANT?
  if (count == 0) {
    t = '<SPAN CLASS="faint"><I>Vacant</I></SPAN>';
  }

  // WRITE COMPLETE TABLE ROW?
  if (TableRow) {
    fields = ClubPosArr[ClubPosArrLookup[ClubPos]].split(',');
    nm = t;
    t = '<TR><TH>' + fields[1];
    if ((ClubPos == 'T') && (count > 1)) {
      t += 's';
    }
    t += '<\/TH><TD>' + nm + '<\/TD><\/TR>';
  }

  // DONE
  return t;
}

// FORMATS PERSON RECORD READY FOR DISPLAY
// RecNo - ARRAY NO. OR PersonID (INITIALS)
// Detail - _BRIEF, _VERBOSE (SHORT ADDR) or _COMPLETE (FULL ADDR)
// TextOnly - _TEXTONLY (true) / _FORMATTED false (DEFAULT)
// Link - _LINK (true) / false - PROVIDE A LINK TO detail.html (DEFAULT false), IF _TEXTONLY THEN false ALSO
function f_formatPerson(RecNo,Detail,TextOnly,Link) {
  var fields, arr, arrlookup;
  var t = '';
  var i, j;
  var verbose, complete;

  // CHECK FOR 'NULL'
  if (RecNo < ' ') return '<DIV CLASS="alert">No player ID has been specified.</DIV>';

  // INIT
  if (typeof(Detail) == 'undefined') Detail = _BRIEF;
  if (typeof(TextOnly) == 'undefined') TextOnly = _FORMATTED;
  if (typeof(Link) == 'undefined') Link = false;
  verbose = ((Detail == _VERBOSE) || (Detail == _COMPLETE));
  complete = (Detail == _COMPLETE);

  // DEFAULT
  if (TextOnly == _TEXTONLY) Link = false;

  // GET RECORD
  if (typeof(RecNo) == 'number') {
    fields = PeopleArr[RecNo].split(',');
  } else {
    // ASSUME STRING - INITIALS
    i = PeopleArrLookup[RecNo];
    if (typeof(i) == 'undefined') return '<DIV CLASS="alert">"' + RecNo + '" is not a valid player ID</DIV>';
    fields = PeopleArr[i].split(',');
  }
	
	// Step through fields, if any start '(' then clear entire field
	for (i=0; i<fields.length; i++) {
		if (fields[i].charAt(0) == '(') {
			fields[i] = '';
		}
	}

  // IF 'Current Member' (FIELD 5) IS NOT SET, THEN DEFAULT TO 'T'
  if (fields.length < 6) {
    fields[5] = 'T';
  }

  // SPECIAL CASE: CHAIRPERSON / SECRETARY / WEBMASTER / MATCH SECRETARY - VERBOSE
  // NB: NEED TO SEARCH PROPERLY
  //if ((fields[5].indexOf('-S') > 0) || (fields[5].indexOf('-W') > 0) || (fields[5].indexOf('-MS') > 0)) {
  //  verbose = true;
  //}
  arr = fields[5].split('-');
  if (arr.length > 1) {
    for (i=1; i<arr.length; i++) {
      if ((arr[i] == 'C') || (arr[i] == 'S') || (arr[i] == 'W') || (arr[i] == 'MS')) {
        verbose = true;
        break;
      }
    }
  }

  if (!TextOnly) {
    // BEGIN TABLE
    // width:450px;
    t += '<TABLE STYLE="margin-left:15px;margin-bottom:10px;font-size:100%;line-height:120%;" CELLPADDING="0" CELLSPACING="0" BORDER="0"><TR>';

    // ICON?
    t += '<TD STYLE="width:45px;"><IMG SRC="' + _ICON_PATH;
    if (fields[13] == '_ICON') {
      t += fields[0].toLowerCase();
    } else {
      t += 'noicon';
    }
    t += '.jpg" WIDTH=40 HEIGHT=40 BORDER=0></TD>';

    // START ADDRESS CELL
    t += '<TD>';
  }

  // NAME
  t += '<B><A NAME="' + fields[0] + '"';
  if (Link) {
    t += ' HREF="/members/detail.html?' + fields[0] + '&' + Detail + '"';
  }
  t += '>' + fields[2] + '</A></B>';

  // SEX (IGNORED IF TextOnly)
  if ((complete) && (!TextOnly)) {
    if (fields[3] == 'M') {
      t += '&nbsp;<IMG SRC="/img/male_f.gif" WIDTH=9 HEIGHT=9 ALT="Male">';
    } else if (fields[3] == 'F') {
      t += '&nbsp;<IMG SRC="/img/female_f.gif" WIDTH=6 HEIGHT=9 ALT="Female">';
    }
  }

  // CLUB POSITION? ('-' IS NEVER 1st CHAR)
  if (fields[5].indexOf('-') > 0) {
    t += ' (';
    arr = fields[5].split('-');
    for(i=1;i<arr.length;i++) {
      if (i > 1) t += ' and ';
      arrlookup = ClubPosArr[ClubPosArrLookup[arr[i]]].split(',');
      t += arrlookup[1];
    }
    t += ')';
  }

  // FULL or SHORT ADDRESS?
  // NB: NEED TO REPLACE ALL VERTICAL BARS '\|' WITH ', '
  if ((complete) && (fields[8] > ' ')) {
    t += '<BR>' + fields[8].replace(/\|/g,', ');
  } else if (fields[9] > '') {
    t += '<BR>' + fields[9].replace(/\|/g,', ');
  }

  // EMAIL
  if (fields[6] > '') {
		// IF LOGGED IN.... (FUTURE)
    // Need to split email address about '@'
		t += '<BR><b>E:</b> ';
/*		
    i = fields[6].indexOf('@');
    if (i > 0) {
      t += '<A CLASS="nounderline" HREF="javascript:sendMail(\'' + fields[6].substring(i+1) + '\',\'' + fields[6].substring(0,i) + '\');">' + fields[6] + '</A>';
    }
*/
		// Needs /antispam.js to be included
		t += emailToImg(fields[6]);
  }

  // WEB
  if (fields[7] > '') {
    t += '<BR><B>Web:</B> <A HREF="http://' + fields[7] + '" TARGET="_window">' + fields[7] + '</A>';
  }

  // HOME, WORK and MOBILE TEL
  if (verbose) {
    if (fields[10] > '') t += '<BR><B>H:</B> ' + fields[10];
    if (fields[11] > '') t += '<BR><B>W:</B> ' + fields[11];
    if (fields[12] > '') t += '<BR><B>M:</B> ' + fields[12];
  }

  // IF NOT HOME CLUB (ONLY) THEN SHOW CLUB(s)
  // NB: COULD BELONG TO MORE THAN 1 CLUB, SEPERATED WITH '|'
  if (fields[4] != _HOME_CLUBID) {
    arr = fields[4].split('|');
    if (arr.length == 1) {
      t += '<BR><B>Club:</B> ';
    } else {
      t += '<BR><B>Clubs:</B> ';
    }
    for (i=0; i<arr.length; i++) {
      t += (i>0) ? ', ' : '';
      t += f_lookupClub(arr[i]);
    }
    //t += '<BR><B>Club:</B> ' + f_lookupClub(fields[4]);
  }

  // END ADDRESS CELL AND TABLE
  if (!TextOnly) t += '</TD></TR></TABLE>';

  return t;
}

// POPS UP A WINDOW WITH THE CONTACT DETAILS IN
// CALLS f_formatPerson() ABOVE
// <A HREF="javascript:f_popupPerson('NP');">...</A>
function f_popupPerson(RecNo,Detail) {
  var nm = f_getPersonName(RecNo,true);

  var t = '<HTML><HEAD><TITLE>' + nm + '</TITLE>';
  t += '<LINK REL=STYLESHEET TYPE="text/css" HREF="/style.css" TITLE="Style">';
  t += '<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="/antispam.js"></SCRIPT></HEAD>';
  
  t += '<BODY CLASS="popup">'

  // CLOSE/PRINT BUTTON
  t += '<DIV STYLE="float:right;">';
  t += '<INPUT STYLE="width:50px;margin-bottom:2px;" TYPE="button" VALUE="Close" onClick="javascript:window.close();"><BR>';
  t += '<INPUT STYLE="width:50px;" TYPE="button" VALUE="Print" onClick="javascript:window.print();">';
  t += '</DIV>';

  t += f_formatPerson(RecNo,Detail);

  t += '</BODY></HTML>';

  // NB: popup *WAS* DECLARED GLOBAL...
  //     TYPE IS INITIALLY 'undefined' BUT ONCE WINDOW HAS BEEN CREATED IT IS TYPE 'object'
  //     EVEN AFTER USER HAS CLOSED THE WINDOW, WHEN OBJECT IS NO LONGER AVAILABLE
  //
  // WINDOW NAME OF RecNo ENSURES THAT EACH PERSON HAS THEIR OWN WINDOW
  popup = window.open('about:blank',RecNo,'resizable=yes,scrollbars=no,width=510,height=160');

  popup.document.open();
  popup.document.write(t);
  popup.document.title = nm;
  popup.document.close();

  popup.focus();
}

// STEPS THROUGH PeopleArr[] AND RETURNS NUMBER OF PEOPLE
// [ARGS AS FOR f_writePeople()]
// ClubID - 'SF' FOR SILVER FOX
// MemberOnly - CURRENT MEMBER? true/false
function f_countMembers(ClubID,MemberOnly) {
  var fields;
  var recno, count;

  // INIT
  if (typeof(ClubID) == 'undefined') ClubID = _ALL;
  if (typeof(MemberOnly) == 'undefined') MemberOnly = _MEMBERSONLY;

  // STEP THROUGH RECORDS
  count = 0;
  for (recno=0;recno<PeopleArr.length;recno++) {
    // GET RECORD
    fields = PeopleArr[recno].split(',');

    // IF 'Current Member' (FIELD 5) IS NOT SET, THEN DEFAULT TO 'T'
    if (fields.length < 6) {
      fields[5] = 'T';
    }

    // IF CLUBID IS SPECIFIED, DOES IT MATCH?  AND IF SO, IS MEMBER CURRENT?
    // NB: PLAYER COULD BELONG TO MORE THAN 1 CLUB
    if ((ClubID == _ALL) || ((fields[4].indexOf(ClubID) > -1) && ((!MemberOnly) || (fields[5].charAt(0) == 'T')))) {
      count++;
    }
  }

  return count;
}

// STEPS THROUGH PeopleArr[] AND RETURNS LIST OF PEOPLE
// ClubID - _HOME_CLUBID ('SF' SILVER FOX)
// MemberOnly - CURRENT MEMBER? _MEMBERSONLY / _EVERYONE
// Detail - _BRIEF (or 'undefined'), _VERBOSE, _COMPLETE
// TextOnly - _TEXTONLY (true) / false
function f_rtnMembers(ClubID,MemberOnly,Detail,TextOnly) {
  var t = '';
  var fields;
  var recno, count;

  // INIT
  if (typeof(ClubID) == 'undefined') ClubID = _ALL;
  if (typeof(MemberOnly) == 'undefined') MemberOnly = _MEMBERSONLY;
  if (typeof(Detail) == 'undefined') Detail = _BRIEF;

  // STEP THROUGH RECORDS
  count = 0;
  for (recno=0;recno<PeopleArr.length;recno++) {
    // GET RECORD
    fields = PeopleArr[recno].split(',');

    // IF 'Current Member' (FIELD 5) IS NOT SET, THEN DEFAULT TO 'T'
    if (fields.length < 6) {
      fields[5] = 'T';
    }

    // IF CLUBID IS SPECIFIED, DOES IT MATCH?  AND IF SO, IS MEMBER CURRENT?
    // NB: PLAYER COULD BELONG TO MORE THAN 1 CLUB
    if ((ClubID == _ALL) || ((fields[4].indexOf(ClubID) > -1) && ((!MemberOnly) || (fields[5].charAt(0) == 'T')))) {
      if ((count > 0) && (TextOnly)) {
        t += '<BR><BR>';
      }

      // FORMAT RECORD READY FOR DISPLAY
      // NB: IF TextOnly IS false, THEN Link WILL ALSO BE false IN f_formatPerson()
      t += f_formatPerson(recno,Detail,TextOnly,_LINK);

      count++;
    }
  }

  // IF TextOnly, WRITE SUMMARY...
  if (TextOnly) {
    t += '<P>' + count + ' member(s) listed.<BR>';
    t += 'Information correct as of ' + f_formatDateStr(_MEMBERS_UPDATED,false);
  }

  // DONE (PREVIOUSLY RTN'D count)
  //document.write(t);
  return t;
}

// STEPS THROUGH PeopleArr[] AND RETURNS SHORT LIST OF PEOPLE
// ClubID - 'SF' FOR SILVER FOX
// MemberOnly - CURRENT MEMBER? true/false
function f_rtnMembersList(ClubID,MemberOnly) {
  var t = '';
  var fields;
  var recno, count, ident;

  // INIT
  if (typeof(ClubID) == 'undefined') ClubID = _ALL;
  if (typeof(MemberOnly) == 'undefined') MemberOnly = _MEMBERSONLY;

  // STEP THROUGH RECORDS
  count = 0;
  for (recno=0;recno<PeopleArr.length;recno++) {
    // GET RECORD
    fields = PeopleArr[recno].split(',');

    // IF 'Current Member' (FIELD 5) IS NOT SET, THEN DEFAULT TO 'T'
    if (fields.length < 6) {
      fields[5] = 'T';
    }

    // IF CLUBID IS SPECIFIED, DOES IT MATCH?  AND IF SO, IS MEMBER CURRENT?
    // NB: PLAYER COULD BELONG TO MORE THAN 1 CLUB
    if ((ClubID == _ALL) || ((fields[4].indexOf(ClubID) > -1) && ((!MemberOnly) || (fields[5].charAt(0) == 'T')))) {
      count++;

      // LINK TO PERSON RECORD (TO BE DISPLAYED BELOW)
      if (t > ' ') {
        //t += ' | ';
        t += '<BR>';
      }
      ident = fields[1];
      if (ident < ' ') {
        ident = fields[2];
      }
      t += '<B>' + count + '</B> - <A CLASS="nounderline" HREF="#' + fields[0] + '">' + ident + '</A>';
    }
  }

  // DONE
  return t;
}

// STEPS THROUGH PeopleArr[] AND RETURNS LIST OF EMAIL ADDRESSES
// NB: DESIGNED TO BE OUTPUT TO <TEXTAREA>..</TEXTAREA>
// ClubID - 'SF' FOR SILVER FOX
// MemberOnly - CURRENT MEMBER? true/false
// Detail - _VERBOSE (inc. NAMES)
function f_rtnEmailList(ClubID,MemberOnly,Detail) {
  var t = '';
  var fields;
  var recno, count, ident;
  var verbose, complete;
	
	// CONST
	var SEP = ',';	// Email Separater ie ';' or ','

  // INIT
  if (typeof(ClubID) == 'undefined') ClubID = _ALL;
  if (typeof(MemberOnly) == 'undefined') MemberOnly = _MEMBERSONLY;
  if (typeof(Detail) == 'undefined') Detail = _BRIEF;
  verbose = ((Detail == _VERBOSE) || (Detail == _COMPLETE));
  complete = (Detail == _COMPLETE);

  // STEP THROUGH RECORDS
  count = 0;
  for (recno=0;recno<PeopleArr.length;recno++) {
    // GET RECORD
    fields = PeopleArr[recno].split(',');

    // IF 'Current Member' (FIELD 5) IS NOT SET, THEN DEFAULT TO 'T'
    if (fields.length < 6) {
      fields[5] = 'T';
    }

    // IF CLUBID IS SPECIFIED, DOES IT MATCH?  AND IF SO, IS MEMBER CURRENT?
    // NB: PLAYER COULD BELONG TO MORE THAN 1 CLUB
    if ((ClubID == _ALL) || ((fields[4].indexOf(ClubID) > -1) && ((!MemberOnly) || (fields[5].charAt(0) == 'T')))) {

      // EMAIL
      if (fields[6] > ' ') {
        if (count > 0) {
          t += SEP;
          if (complete) {
            t += '\n';
          } else {
            t += ' ';
          }
        }
        if (verbose) {
          t += fields[2] + ' <' + fields[6] + '>';
        } else {
          t += fields[6];
        }
        count++;
      }
    }
  }

  // Previously tagged count on at end...
	// Now returns stats (ie. count) if _STATS specified in detail
	if (Detail == _STATS) {
		// Overwrite what we've already created
		//t = 'Retrieved ' + count + ' email addresses.';
		t = count;
	}

  // DONE
  return t;
}

// RTNS LIST OF PEOPLE WHICH MEET CRITERIA, WITH OPTION TO GET DETAILS OF EACH
// CASE-INSENSITIVE
// WRITES TO DIV ID="results"
function f_playerLookup(Person,ClubID,Gender,Detail) {
  var x, t, i, j, fields, parr, oarr, carr, found, val, updated, count, tmp, total;
  var clistarr, cposarr, arrlookup, heading;

  // LOADING MSG...
  x = new getObj('results');
  x.obj.innerHTML = 'Loading data...';

  // INIT
  total = 0;
  parr = new Array();	// PEOPLE ARRAY (THOSE FOUND)
  oarr = new Array();	// ORDERED
  clistarr = new Array();	// LIST OF CLUB(S) FOR PERSON
  cposarr = new Array();	// CLUB POS(s) FOR PERSON
  if (typeof(Person) == 'undefined') Person = '';
  Person = Person.toLowerCase();
  if (typeof(ClubID) == 'undefined') ClubID = _ALL;
  if ((typeof(Gender) == 'undefined') || ('MF'.indexOf(Gender) == -1)) {Gender = '';}
  if (typeof(Detail) == 'undefined') {Detail = _BRIEF};

  // NEED TO STEP THROUGH ALL PEOPLE!
  // BUILD LIST OF ALL THOSE FOUND...
  for (i=0; i<PeopleArr.length; i++) {
    fields = PeopleArr[i].split(',');

    // CORRECT GENDER?
    // NB: GENDER MAY BE RECORDED AS '?' (OTHER THAN 'M' OR 'F') - PASS
    if ((Gender > '') && ('MF'.indexOf(fields[3]) != -1)) {
      if (fields[3] != Gender) continue;
    }

    // SEARCH SHORT NAME AND FULL NAME
    if (Person > '') {
      if ((fields[1].toLowerCase().indexOf(Person) == -1) && (fields[2].toLowerCase().indexOf(Person) == -1)) {
        continue;
      }
    }

    // CORRECT CLUB?
    // NB: PERSON MAY BELONG TO MORE THAN ONE CLUB (NEED TO SEARCH FOR IT)
    // NB: PREVIOUSLY ONLY PERFORMED THIS CHECK IF ClubID IS SPECIFIED, BUT WE NEED TO CONSTRUCT
    //     LIST OF CLUBS THAT PERSON BELONGS TO ANYWAY...
    if (ClubID != _ALL) {
      found = false;
    } else {
      found = true;
    }
    clistarr[fields[0]] = '';
    carr = fields[4].split('|');
    for (j=0; j<carr.length; j++) {
      if (clistarr[fields[0]] > ' ') clistarr[fields[0]] += ', ';
      clistarr[fields[0]] += f_lookupClub(carr[j]);
      if (carr[j] == ClubID) {
        found = true;
        //break;
      }
    }
    if (!found) continue;

    // FOUND PERSON - STORE IT!
    total++;
    parr[fields[0]] = fields[2];
    // IF SHORT NAME IS NOT PART OF FULL NAME THEN TAG ON END
    if ((fields[1] > ' ') && (fields[2].indexOf(fields[1]) == -1)) {
      parr[fields[0]] += ' (' + fields[1] + ')';
    }

    // RECORD CLUB POSITION? ('-' IS NEVER 1st CHAR)
    // NB: REUSE carr[]
    t = '<SPAN CLASS="faint">n/k</SPAN>';
    if ((typeof(fields[5]) != 'undefined') && (fields[5].indexOf('-') > 0)) {
      t = ' (';
      //t += fields[5];
      carr = fields[5].split('-');
      for(j=1;j<carr.length;j++) {
        if (j > 1) t += ' and ';
        if (typeof(ClubPosArrLookup[carr[j]]) == 'undefined') {
          t += '<SPAN CLASS="alert">' + carr[j] + '</SPAN>';
        } else  {
          arrlookup = ClubPosArr[ClubPosArrLookup[carr[j]]].split(',');
          t += arrlookup[1];
        }
      }
      t += ')';
    }
    cposarr[fields[0]] = t;
  }

  // GOT LIST OF PEOPLE
  // NEED CREATE ORDERED ARRAY...

  // INIT ORDER ARRAY FROM parr[]
  i = -1;
  for (val in parr) {
    oarr[++i] = val;
  }

  // BUBBLE SORT
  count = 0;
  do {
    count++;	// JUST TO TEST (FAIL SAFE) - IF SORTING WHOLE DB, COULD BE > 200
    updated = false;
    for (i=0; i<(oarr.length - 1); i++) {
      if (parr[oarr[i]] > parr[oarr[i+1]]) {
        updated = true;
        // SWAP VALUES
        tmp = oarr[i];
        oarr[i] = oarr[i+1];
        oarr[i+1] = tmp;
      }
    }
  } while ((updated) && (count < 300));
//if (updated) alert(count);

  // WRITE OUT SORTED LIST
  t = '';
  if (total == 0) {
    t = '<DIV CLASS="alert">No people found that match the specified criteria!</DIV>';
  } else {
    t = '<P><B>' + total;
    if (total == 1) {
      t += ' person';
    } else {
      t += ' people';
    }
    t += ' found...</B><BR>Click on a name below to view more details about that person...</P>';
    t += '<TABLE CLASS="fixtures" CELLPADDING=0 CELLSPACING=0 BORDER=0>';
    //heading = '<TR><TH colspan="3">Name</TH><TH colspan="2">Club(s)</TH><TH>Position</TH></TR>';
    //t += heading + '<TD COLSPAN=4>&nbsp;</TD>';
    heading = '<TR><TH>Name</TH><TH>Club(s)</TH></TR>';
    t += heading;
		//t += '<TD COLSPAN=2>&nbsp;</TD>';
    for (i=0; i<oarr.length; i++) {
      t += '<TR';
      if ((i % 2) != 0) { t += ' CLASS="highlight"'; }
      t += '>';
      //t += '<TD><IMG SRC="/img/bullyt.gif" WIDTH=5 HEIGHT=8 HSPACE=5></TD>';
      t += '<TD><A HREF="/members/detail.html?' + oarr[i] + '&' + Detail + '">';
      t += parr[oarr[i]] + '</A></TD>';
      t += '<TD>' + clistarr[oarr[i]] + '</TD>';
      //t += '<TD>&nbsp;</TD><TD>' + cposarr[oarr[i]] + '</TD>';
      t += '</TR>';
    }
    //t += '<TD COLSPAN=2>&nbsp;</TD>';
    t += heading + '</TABLE>';
  }

  // DONE
  x.obj.innerHTML = t;
  return total;
}



