function clearEntries() {
  document.getElementById('votingoptions').deleteRow(0);
  document.getElementById('addresses').deleteRow(0);
  document.getElementById('optionSource').deleteRow(0);
  document.getElementById('voterstorage').deleteRow(0);  

  if (document.datafields) {
    document.datafields.reset();
  }
 
}

function getVal(x) {
  return document.getElementById(x).value;
}

function displayIt(x,y) {
  document.getElementById(x).style.display=y;
}

function bkColor(x,y) {
  document.getElementById(x).style.backgroundColor = y;
}

function pglock(x) {
  document.getElementById('pagelock').value = x; 
}

function saveInfo(x) {
  if (x == 'votetype_yn') {
    document.getElementById('radiovalue').value='yesno';
    pglock('u');
  }
  else if (x == 'votetype_m') {
    document.getElementById('radiovalue').value='multiple';
    pglock('u');
  }
  
  if (x == 'anon') {  
    document.getElementById('anonymous').value = 0;
  }
  else if (x == 'nonanon') {   
    document.getElementById('anonymous').value = 1;
  }
}

function validate(x) {
  if (x == 'topic') {
  var topic = getVal('topiclabel');
    if (topic != '') {
      var ck = htmlCheck(topic);
      if( ck == 'n') {
        document.getElementById('topicinfo').value = topic;
        pglock('u');
      }
      else {
        alert('Remove html code (stuff in brackets < >)');
        pglock('l');
      }
    }
    else {
      alert('Please enter a topic label for your vote');
      pglock('l');
    }
  }

  if (x == 'votetype') {
    if (document.getElementById('radiovalue').value!='') {
      pglock('u');
    }  
    else {
      alert('Please select a vote option');
      pglock('l');
    }
  }

  if (x == 'choice_yn') {
    var qtext = getVal('questiontexty');
    if (qtext) {
      var len = qtext.length;
      var maxl = getVal('maxyn');
      if (len > maxl){
        pglock('l');
        var ex = len - maxl;
        alert("Text too long. Please remove " + ex + " or more characters.");
      }
      else if(htmlCheck(qtext) == 'y') {
        pglock('l');
        alert('Remove html code (stuff in brackets < >)');
      }
      else {
        document.getElementById('topicquestion').value = qtext;
        pglock('u');     
      }
    }
    else {
      pglock('l');    
      alert('You need to add a question to vote on.');
    }
  } 

  if (x == 'choice_m') {
    var is_error = '';
    var qmtext = getVal('questiontextm');
    if (qmtext) {
      var qlen = qmtext.length;
      var maxl = getVal('maxmi');
      if (qlen > maxl){
        var ex = qlen - maxl;
        is_error = "- Intro too long. Remove " + ex + " or more characters.\n";
      }
      else if(htmlCheck(qmtext) == 'y') {
        is_error = "- Remove html code (stuff in brackets < >) in question field'\n";
      }
      else {
        document.getElementById('topicquestion').value = qmtext;
      }
    }
    else {
      is_error = "- Please add a sentence to introduce the voting options.\n";
    }
    rows = numRows("optionSource");
    var numItems=new Array();
    var counter=0;
    for (i=0; i<=rows; i++) {
      var tmp = document.getElementById('optionSource').rows[i].cells[0].innerHTML;
      var len = tmp.length;
      if(len > 0) {
        counter++;
      }
      if (tmp != '') {
        numItems.push(tmp);
      }
      if((htmlCheck(tmp) == 'y') && (tohCk == undefined)) {
        is_error += "- Remove html code (stuff in brackets < >) in option fields\n";
        var tohCk = 1;
      }
    }
    var dedupeItems=new Array();
    dedupeItems = numItems.unique();
    if ((counter > 1) && (numItems.length > dedupeItems.length)){
      is_error += "- Please remove duplicate items.\n";
    }
    if (counter < 2) {
      is_error += '- You need at least two options to vote on.';
    }
    if (is_error) {
      alert(is_error);
      pglock('l');
    }
    else {
      pglock('u');
    }
  }
  
  if (x == 'adminemail') {
    if (!document.getElementById('adminemail').value) {
      alert('Email address in "Administrator" field is missing or incorrect.');
      pglock('l');
    }
  }

  if (x == 'voteremails') {
    if (document.getElementById('voteremails').value) {
      pglock('u');
    }
    else {
      alert('You need to add valid email addresses in the "Other Voters" field.');
      pglock('l');
    }
  }
  
  if (x == 'allemail') {
    var rows = getVal('numOfVoters');
    rows--;
    var numItems=new Array();
    s = document.getElementById('voterstorage');
    var testemail;
    var maxemails = getVal('maxNumVoters');
    var rows2 = rows+1;

    var is_bad=new Array();
    for (i = 0; i <= rows; i++) {
      if (s.rows[i].cells[1].innerHTML != '') {
        numItems.push(s.rows[i].cells[0].innerHTML);
      }
      if(s.rows[i].cells[2].innerHTML == 'bad email') {
        is_bad.push("- Fix bad email address\n");
      }
      if(htmlCheck(s.rows[i].cells[1].innerHTML) == 'y') {
        is_bad.push('- Remove html code (stuff in brackets < >) from name field(s)');
      }
    }

    if (is_bad[0]) {
      var bd = is_bad.join("");
      alert(bd);
      pglock('l');
    }    

    else {
      var dedupeItems=new Array();
      dedupeItems = numItems.unique();
      if (numItems.length > dedupeItems.length) {
        pglock('l');
        alert('Please remove duplicate email address(es).');
      }
      else if (rows2 > maxemails) {
        pglock('l');
        var rmv = rows2 - maxemails;
        alert('Too many email addresses. Please remove ' + rmv + '.'); 
      }
      else if (rows2 < 2) {
        pglock('l');
        alert('You need at least two voters.'); 
      }
      else {
        pglock('u');
      }
    }
  }

  if (x == 'deadline') {
    var timeunit = document.getElementById('timeunit').selectedIndex; 
    var timenum = getVal('timenumber');
    if (/^\d*$/.test(timenum)) {
      if (timeunit == 0) { ms = 60000 * timenum; } // minute
      else if (timeunit == 1) { ms = 3600000 * timenum; } // hour
      else { ms = 86400000 * timenum; } // day
      if (ms > 5184000000) {
        pglock('l');
        alert('Please set deadline to no more than sixty days.');
      }
      else if (ms < 300000) {
        pglock('l');
        alert('Please set deadline to no less than five minutes.');
      }
      else {
        pglock('u');
      }
    }
    else {
      pglock('l');
      alert('Use positive numbers only');
    }
  }
}

function htmlCheck(x) {
  var mtch=/(<([^>]+)>)/ig;
  if(x.match(mtch)) {
    return 'y';
  }
  else {
    return 'n';
  }
}

function nextPage(x) {
  if(document.getElementById('pagelock').value == 'l') { 
    exit;
  }
  pglock('l');
  pageProcess();
  if (x == 'topic') {
    displayIt('topic','block');
    displayIt('blurb','inline');   
    bkColor('ontopic','orange');
  }
  
  if (x == 'votetype') {
    displayIt('votetype','block');
    bkColor('ontype','orange');
  }
    
  if (x == 'choices') {
    var w = getVal('radiovalue');
    if (w == 'yesno') {
      displayIt('choice_yn','block');
    }    
    else if (w == 'multiple') {
      if (document.getElementById('optionSource').rows[0] == null) {
        createStartChoices();
      }
      displayIt('choice_m','block');
    }
    bkColor('onchoice','orange');
  }
  if (x == 'voters') {
    displayIt('voters','block');
    bkColor('onvoters','orange');
  }

  if (x == 'deadline') {
    displayIt('deadline','block');
    bkColor('ondeadline','orange');
    updatePreviewEmail();
  }

  if (x == 'preview') {
    document.getElementById('voteoptions').innerHTML = previewOptions('preview');
    document.getElementById('topicvoteoptions').innerHTML = previewOptions('tosend');
    document.getElementById('previewtopic').innerHTML = getVal('topicinfo');
    document.getElementById('signature').innerHTML = getVal('adminname');
    document.getElementById('previewtopic2').value = getVal('topicinfo');
    if (document.getElementById('anonymous').value == 0) {
      document.getElementById('anon').innerHTML = "Your vote WILL NOT be seen by your fellow voters.";
    }
    else {
      document.getElementById('anon').innerHTML = "Your vote WILL be seen by your fellow voters.";
    }
    if(document.getElementById('voterstorage').rows[0].cells[1].innerHTML) {
      var nameemail = document.getElementById('voterstorage').rows[0].cells[1].innerHTML;
    }
    else {
      var nameemail = 'Voter at ' + document.getElementById('voterstorage').rows[0].cells[0].innerHTML;
    }
    document.getElementById('previewemail').innerHTML = nameemail;
    var q = getVal('topicquestion');
    document.getElementById('previewtopicquestion').innerHTML = q;
    document.getElementById('previewtimeunit').innerHTML = getVal('timeunit');
    document.getElementById('previewtimeunit2').value = getVal('timeunit');
    refreshDate();
    displayIt('preview','block');
    bkColor('onpreview','orange');
  }
}

function pageProcess() {
  displayIt('blurb','none');
  displayIt('topic','none');
  displayIt('votetype','none');
  displayIt('choice_yn','none');
  displayIt('choice_m','none');
  displayIt('voters','none');
  displayIt('deadline','none');
  displayIt('preview','none');
  bkColor('ontopic','white');
  bkColor('ontype','white');
  bkColor('onchoice','white');
  bkColor('ondeadline','white');  
  bkColor('onvoters','white');
  bkColor('onpreview','white');
}

function refreshDate() {
  var d=new Date();
  var timehere = d.getTime();
  var timeunit = document.getElementById('timeunit').selectedIndex;
  var timenum = getVal('timenumber');
  if (timeunit == 0) { ms = 60000 * timenum; } // minute
  else if (timeunit == 1) { ms = 3600000 * timenum; } // hour
  else { ms = 86400000 * timenum; } // day
  deadline_ms = timehere + ms;
  var nd = new Date(deadline_ms);
  var yr = nd.getUTCFullYear();
  var mo = nd.getUTCMonth();
  var dt = nd.getUTCDate();
  var da = nd.getUTCDay();
  var hr = nd.getUTCHours();
  var mi = nd.getUTCMinutes();
  vdeadline = fDate(yr, mo, dt, da, hr, mi);
  document.getElementById('previewlocaltime').innerHTML = vdeadline;
  document.getElementById('previewtimenumber').innerHTML = getVal('timenumber');
  document.getElementById('previewtimenumber2').value = getVal('timenumber');
  var seconds = ms/1000;
  document.getElementById('votingtime').value = seconds;
}

function fDate(yr, mo, dt, da, hr, mi) {
  var a_p = '';
  var month   = GetMonth(mo);
  var weekday = GetDay(da);
  if (hr < 12) {
   a_p = "am";
  }
  else {
   a_p = "pm";
  }
  if (hr == 0) {
   hr = 12;
  }
  if (hr > 12) {
   hr = hr - 12;
  }
  if (mi < 10) { mi = '0' + mi; }
  var dformatted = weekday + ", " + month + " " + dt + ", " + yr + " at " + hr + ":" + mi + " " + a_p + " " + " (GMT)";
  return dformatted;
}

function GetDay(intDay){
  var DayArray = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
  return DayArray[intDay];
}
function GetMonth(intMonth){
  var MonthArray = new Array("January", "February", "March", "April", "May", "June", "July", 
  "August", "September", "October", "November", "December");
  return MonthArray[intMonth];
}


// VOTE OPTIONS

function previewOptions(x) {
  var line = '';
  var info = '';
  if (document.getElementById('radiovalue').value == 'multiple') {
    var rows = getVal('numOfOptions');
    rows--;
    for (i = 0; i <= rows; i++) {
      info = document.getElementById('optionSource').rows[i].cells[0].innerHTML;
      info = info.replace(/\"/g, '&quot;');
      if ((x == 'tosend') && (info != '')) {
        line = line + '<input type="hidden" name="olist[' + i + ']" value="' + info + '" />';
      }
      else if ((x != 'tosend') && (info != '')) {
        line = line + '<a href="JavaScript:void(0);" onclick="alert(\'Clicking this link in final email will record a vote.\')">' + info + '</a><br />';
      }  
    }
  }
  else { // if a yesno vote
    if (x == 'tosend') {
      line = '<input type="hidden" name="olist[0]" value="Yes" /><input type="hidden" name="olist[1]" value="No" />';
    }
    else {
      line = '<a href="JavaScript:void(0);" onclick="alert(\'Clicking this link in the final email will record a YES vote.\')">Yes</a><br /><a href="JavaScript:void(0);" onclick="alert(\'Clicking this link in the final email will record a NO vote.\')">No</a><br />';
    }
  }
  return line;
}

function createStartChoices() {
  var numOps = getVal('numOfOptions');
  numOps--;
  for (r = 0; r <= numOps; r++) {
    document.getElementById('optionSource').insertRow(r).insertCell(0);
    n = r +1;
    insertOption(r,n);
  }
  showAddOpButton();
}

function addNewOption() {
  var numOps = getVal('numOfOptions');
  document.getElementById('optionSource').insertRow(numOps).insertCell(0);
  var newnum = numOps;
  newnum++;
  insertOption(numOps,newnum);
  document.getElementById('numOfOptions').value = newnum;
  showAddOpButton();
}

function insertOption(i,n) {
  var vo=document.getElementById('votingoptions').insertRow(i);   
  vo.insertCell(0).innerHTML = n + '.';
  vo.insertCell(1).innerHTML = '<input type="text" value="" maxlength="150" onblur=\"saveOp(this.parentNode.parentNode.rowIndex, this.value)\" /><input type="button" class="btn" value="-" onclick="delOpBut(this.parentNode.parentNode.rowIndex)" />';
}

function saveOp(y,z) {
  var src = document.getElementById('optionSource');
  src.rows[y].cells[0].innerHTML = z;
}

function delOpBut(r) {
  var num = getVal('numOfOptions');
  if (num > 2) {
    document.getElementById('votingoptions').deleteRow(r);
    document.getElementById('optionSource').deleteRow(r);
    document.getElementById('numOfOptions').value--;
    showAddOpButton();
    reNumberOps();
  }
}

function reNumberOps() {
  var rows = getVal('numOfOptions');
  var vo = document.getElementById('votingoptions');
  for (i = 0; i <= rows-1; i++) {
    var n = i + 1;
    vo.rows[i].cells[0].innerHTML = n + '.';
  }
}

function showAddOpButton() {
  var rows = getVal('numOfOptions');
  if(rows == getVal('maxNumOptions')) {
    displayIt('addoption','none');
  }
  else {
    displayIt('addoption','inline');
  }
}
// END Vote Options


// Start Voter Name and Email
function processVoters() {
  validate('adminemail');
  validate('voteremails');
  clearAddressTable();
  var e = getVal('adminemail') + '; ' + getVal('voteremails');
  var t = ckVoterQuote(e);
  if (t != 'error') { e = t; }
  e = e.replace(/^\s+/g, ""); 
  e = e.replace(/\s+$/g, "");
  e = e.replace(/\s+\n/g, "\n");
  e = e.replace(/\n\s+/g, "\n");
  e = e.replace(/ *~BrK~ */g, ",");
  e = e.replace(/[\,\;]\s*/g, "\n");
  e = e.replace(/~cMa~/g, ',');
  e = e.replace(/\n+$/, "");  
  e = e.replace(/\n+/g, "\n");
 
  var earray = e.split("\n");
  var len = earray.length;
  len--;
  var compile = '';
  var email = '';
  var aname = '';
  
  var row = 0;
  for (i=0; i <= len; i++) {
    var ln = earray[i];
    ln = ln.replace(/^From:\s+/, '');
    ln = ln.replace(/^To:\s+/, '');
    ln = ln.replace(/^Cc:\s+/, '');
    ln = ln.replace(/^Bcc:\s+/, '');
    ln = ln.replace(/^cc\s+/, '');
    // add bcc   
    
    // process addresses preceeded by name and bracketed with <>
    if (/</.test(ln)) {
      if (/ </.test(ln)) {
        ln = ln.split(' <');
        ln[1] = ln[1].replace(/>\s*$/, '');
        if ( (/.+@.+\..+/.test(ln[0])) && (/[^ ]/.test(ln[0])) ) {
          aname  = ln[1];
          email = ln[0];        
        }
        else {
          aname  = ln[0];
          email = ln[1];
        }
      }
      else {
        ln = ln.split('> ');
        ln[0] = ln[0].replace(/^</, '');
        if ( (/.+@.+\..+/.test(ln[0])) && (/[^ ]/.test(ln[0])) ) {
          aname  = ln[1];
          email = ln[0];        
        }
        else {
          aname  = ln[0];
          email = ln[1];
        }
      }
      compile = compile + assembleEN(row, email, aname);
      row++;
    }

    // process email-name separated by tab    
    else if (/\t/.test(ln)) {
      nmemail = ln.split("\t");
      if (/@/.test(nmemail[0])) {
        email = nmemail[0];
        aname = nmemail[1];
      }
      else if (/@/.test(nmemail[1])) {
        email = nmemail[1];
        aname = nmemail[0];
      }
      compile = compile + assembleEN(row, email, aname);
      row++;
    }
    
    // process email-name separated by space
    else if (/ /.test(ln)) {
      nmemail = ln.split(" ");
      var items = (nmemail.length)-1;

      // gather email-name pattern to file: enene, nnne, etc
      var totest = '';
      for (x=0; x <= items; x++) {
        if (/@/.test(nmemail[x])) {
          totest = totest + 'e';
        }
        else {
          totest = totest + 'n';
        }
      }     

      var ee = /ee/;
      var nn = /nn/;
      mod = (totest.length) % 2;

      // if it IS a strictly repeated email-name sequence
      if ( (/^en/.test(totest)) && (mod == 0) && (!ee.test(totest)) && (!nn.test(totest)) ) {
        for (r=0; r <= items/2; r++) {
          email = nmemail.shift();
          aname = nmemail.shift();
          compile = compile + assembleEN(row, email, aname);
          row++;
        }
      }      
      // if it IS a strictly repeated name-email sequence
      else if ( (/^ne/.test(totest)) && (mod == 0) && (!ee.test(totest)) && (!nn.test(totest)) ) { 
        for (r=0; r <= items/2; r++) {
          aname = nmemail.shift();
          email = nmemail.shift();
          compile = compile + assembleEN(row, email, aname);
          row++;
        }
      }        
      // combine this format: e@email.com Charles Bill Smith
      else if (/^en+$/.test(totest)) {
        email = nmemail.shift();
        aname = nmemail.join(" ");
        compile = compile + assembleEN(row, email, aname);
        row++;
      }
      // combine this format: Charles Bill Smith e@email.com
      else if (/^n+e$/.test(totest)) {     
        email = nmemail.pop();
        aname = nmemail.join(" ");
        compile = compile + assembleEN(row, email, aname);
        row++;
      }
      
      // if NOT a strictly repeated email-name or name-email sequence, just gather emails
      else if ( (ee.test(totest)) || (nn.test(totest)) || (mod != 0) ) {
        for (r=0; r <= items; r++) {
          if (/@/.test(nmemail[r])) {
           compile = compile + assembleEN(row, nmemail[r], aname);
           row++;
          }
        }
      }
    }

    // if it is a single email on a line
    else {
      email = earray[i];
      aname = '';
      compile = compile + assembleEN(row, email, aname);
      row++;
    }
   aname = '';
   email = '';
  }
  var compilearray = compile.split('<bRk>');
  compilearray.shift();
  var len = compilearray.length;
  len--;
  for (r=0; r <= len; r++) {
    var emailname = compilearray[r].split('~|~');
    emailname[3] = emailname[3].replace(/=s=/, ' ');
    // 0 = row, 1 = email, 2 = good or bad email, 3 = name
    numVoters("plus");
    addToAddressTable(emailname[0], emailname[1], emailname[2], emailname[3]);
    if (r == 0) { 
      if (emailname[3]) {
        document.getElementById('adminname').value = emailname[3];
      }
      else {
        document.getElementById('adminname').value = 'Voter at ' + emailname[1];
      }
    }
  }
  addVoterControls();
}

function updatePreviewEmail() {
  var list = '';
  var previewlist = '<b>Will be sent to ...</b><br />'; 
  row = getVal('numOfVoters');
  row--;
  var i=0;
  for (i=0; i<=row; i++) {  
    var cell0=document.getElementById('voterstorage').rows[i].cells[0].innerHTML;
    var cell1=document.getElementById('voterstorage').rows[i].cells[1].innerHTML;
    previewlist = previewlist + cell0 + '&nbsp;' + cell1 + '<br />';
    list = list + '<input type="hidden" name="elist[' + i + ']" value="' + cell0 + ' | ' + cell1 + '" />';
  } 
  document.getElementById('voteraddresses').innerHTML = list;
  document.getElementById('previewemaillist').innerHTML = previewlist;
  return true;
}

function assembleEN(row, email, name) {
 ok = ckEmail(email);
 var x = '<bRk>' + row + '~|~' + email + '~|~' + ok + '~|~' + name;
 return x;
}

function ckEmail(x) {
  var totest = /^\w+[\+\.\w-]*@([\w-]+\.)*\w+[\w-]*\.([a-z]{2,4}|\d+)$/i;
  if (totest.test(x)) { 
    return 'good';
  }
  else {
    pglock('l');
    return 'bad email';
  }
}

function saveEmail(e,r) {
  r--;
  var ok = ckEmail(e);
  if (ok == 'good') {
    document.getElementById('addresses').rows[r].cells[1].innerHTML = '';
  }
  else {
    document.getElementById('addresses').rows[r].cells[1].innerHTML = 'bad email';
  }
  if (ok == 'good') { ok = ''; }
  document.getElementById('voterstorage').rows[r].cells[0].innerHTML = e;
  document.getElementById('voterstorage').rows[r].cells[2].innerHTML = ok;
  addVoterControls();
}

function saveName(n,r) {
  r--;
  if (r == 0) {
    document.getElementById('adminname').value = n;
  }  
  document.getElementById('voterstorage').rows[r].cells[1].innerHTML = n;
  addVoterControls();
}

function ckVoterQuote(e) {
  var start = /^[\'\"]/;
  var end = /['"][,;]* *$/;
  var at = /[a-zA-Z]@[a-zA-Z]/;
  var look = 'n';
  e = e.replace(/ *[,\;] *\n+/g, ' ~BrK~ ');
  var ta = e.split(" ");
  var l = ta.length;
  l--;
  for (x=0; x <= l; x++) {
    if (start.test(ta[x])) {                       // first position (starts w ')
      ta[x] = ta[x].replace(/^[\'\"]/, "");
      ta[x] = ta[x].replace(/,/g, "~cMa~");
      ta[x] = ta[x].replace(/$/, "=s=");
      look = 'y';
      if (at.test(ta[x])) { var err = 'y'; }
    }
    else if (look == 'y') {
      if (end.test(ta[x])) {                      // last position (ends w ')
        ta[x] = ta[x].replace(/['\"],$/, ",");
        ta[x] = ta[x].replace(/[/'\"];$/, ";");
        ta[x] = ta[x].replace(/[/'\"]$/, "");
        look = 'n';
        if (at.test(ta[x])) { var err = 'y'; }
      }
      else {                                     // not last position
        ta[x] = ta[x].replace(/,/g, "~cMa~");
        ta[x] = ta[x].replace(/$/, "=s=");
        if (at.test(ta[x])) { var err = 'y'; }
      }
    }
  }
  e = ta.join(" ");
  e = e.replace(/=s= /g, '=s=');
  e = e.replace(/  +/g, ' ');
  if (err == 'y') {
    return 'error'; 
  } 
  else {
    return e; 
  }
}

function clearAddressTable() {
  var rows = getVal('numOfVoters');
  rows--;
  var i=0;
  for (i=0; i<=rows; i++) {
    document.getElementById('addresses').deleteRow(0);
    document.getElementById('voterstorage').deleteRow(0);
  }
  document.getElementById('numOfVoters').value = '0';
}

function addToAddressTable(r, x, o, y) {
  // r = row, x = email, o = good or bad email, y = name
  if (o == 'good') { o = ''; }
  var lt=document.getElementById('addresses').insertRow(r);
  lt.insertCell(0).innerHTML = '<input type="text" onblur="saveEmail(this.value, this.parentNode.parentNode.rowIndex)" value="' + x + '">';
  lt.insertCell(1).innerHTML = o;
  if (r == 0) {
    lt.insertCell(2).innerHTML = '<input type="text" onblur="saveName(this.value, this.parentNode.parentNode.rowIndex)" value="' + y + '"> Admin';
    displayIt('addressesBox','block');
  }
  else {
    lt.insertCell(2).innerHTML = '<input type="text" onblur="saveName(this.value, this.parentNode.parentNode.rowIndex)" value="' + y + '"><input type="button" class="btn" value="-" onclick="delVoterButton(this.parentNode.parentNode.rowIndex)" />';
  }
  var vt=document.getElementById('voterstorage').insertRow(r);
  vt.insertCell(0).innerHTML = x;        // EMAIL
  vt.insertCell(1).innerHTML = y;        // NAME
  vt.insertCell(2).innerHTML = o;        // GOOD OR BAD
}

function addVoterButton() {
  var row = getVal('numOfVoters');
  var lt=document.getElementById('addresses').insertRow(row);
  lt.insertCell(0).innerHTML = '<input type="text" onblur="saveEmail(this.value, this.parentNode.parentNode.rowIndex)" value="" maxlength="150" />';
  lt.insertCell(1).innerHTML = '';
  lt.insertCell(2).innerHTML = '<input type="text" onblur="saveName(this.value, this.parentNode.parentNode.rowIndex)" value="" maxlength="150" /><input type="button" value="-" class="btn" onclick="delVoterButton(this.parentNode.parentNode.rowIndex)" />';
  var vt=document.getElementById('voterstorage').insertRow(row);
  vt.insertCell(0).innerHTML = ' '; // EMAIL
  vt.insertCell(1).innerHTML = ' '; // NAME
  vt.insertCell(2).innerHTML = ' '; // GOOD OR BAD
  numVoters("plus");
  addVoterControls();
}

function addVoterControls() {
  var row = getVal('numOfVoters');
  row = row * 1;
  var max = getVal('maxNumVoters');
  max = max * 1;
  if (max <= row) { 
    displayIt('addvoter','none');
  }
  else {
    displayIt('addvoter','block');
  }
  displayIt('voternext','inline');
}

function delVoterButton(r) {
  r--;
  document.getElementById('addresses').deleteRow(r);
  document.getElementById('voterstorage').deleteRow(r);
  numVoters("minus");
  addVoterControls();
}

function numVoters(x) {
  var nv = getVal('numOfVoters');
  nv = nv * 1;
  if (x == "minus") { nv--; }
  if (x == "plus") { nv++; }
  document.getElementById('numOfVoters').value = nv;
}
// END Email and Names


// Return new array with duplicate values removed
Array.prototype.unique =
  function() {
    var a = [];
    var l = this.length;
    for(var i=0; i<l; i++) {
      for(var j=i+1; j<l; j++) {
        // If this[i] is found later in the array
        if (this[i] === this[j])
          j = ++i;
      }
      a.push(this[i]);
    }
    return a;
  };
  
// Number of rows in a table
function numRows(x) {
 var r = document.getElementById(x).getElementsByTagName('tr');
 var rn = (r.length);
 rn--;
 return rn;
}

