/**** count field names ****/
var incols = new Array('d_clinton','d_obama','d_uncommitted','d_vacant','s_clinton','s_obama','s_uncommitted');
var hdrs = new Array('Clinton<br>Delegates', 'Obama<br>Delegates','Uncommitted<br>Delegates','Vacant<br>Delegates',
                'Clinton<br>Supporters','Obama<br>Supporters','Uncommitted<br>Supporters');
var refreshinput = false;
var tt = new Array(); /* Tooltips headers */

/**** only allows numbers, returning FALSE if a non-numeric key;
      if ENTER pressed, called POSTCHG to post changes ****/
function numenttest(event, siteno) {
   if (!isNumberKey(event))
      return false;
   try {
      charCode = evt.which;
   } catch(e) {
      charCode = event.keyCode;
   }
   if (charCode == 13)  /* ENTER key */
      postchg(siteno, true);
   return true;
}

/**** set the clock ****/
function clock(){
  var time = new Date();
  var hr = time.getHours();
  var min = time.getMinutes();
  var ampm = 'a.m.';
  if (hr == 0)
     hr = 12;
  else if (hr > 12) {
     hr -= 12;
     ampm = 'p.m';
  }
  if (hr < 10)
    hr = ' ' + hr;
  if(min < 10)
    min = '0' + min;
  eid('currtimei').innerHTML =  hr + ':' + min;
  eid('currampmi').innerHTML = ampm;
}

/**** refresh all sites or a selected site ****/
var cb_refresh = {
   success: function(o) {
   r = o.responseText;
//   alert(r);
   var s = 0;
   var totadj = new Array(0,0,0,0,0,0,0);
   while(true) {
      s = r.indexOf('<', s);
      if (s == -1)
         break;
      var siteno = '';
      while(true) {
         var sc = r.substr(++s, 1);
         if (sc != '>')
            siteno += sc;
         else
            break;
      }
      siteno = parseInt(siteno);
      /* Do NOT refresh a site being updated; unless updating input fields */
      if (siteno == parseInt(eid('siteproci').value) && !refreshinput)
         continue;
      var drs = (r.substr(++s)).split(',', 7);
      var allfilled = true;
      for (var i = 0; i < drs.length; i++) {
         var drsval = drs[i];
         var drsvale = drsval;
         if (drsval != parseInt(drsval)) {
            allfilled = false;
            drsvale = 0;
         }
         var fldid = 'o' + siteno + '_' + incols[i] + 'i';
         var fldobj = eid(fldid);
         var oldval = fldobj.innerHTML;
         if (oldval != parseInt(oldval))
            oldval = 0;
         fldobj.innerHTML = drsval;
         totadj[i] += drsvale - oldval;
         if (refreshinput) {
            fldid = 'i' + siteno + '_' + incols[i] + 'i';
            eid(fldid).value = drsval;
         }
      }
      fldid = 'o' + siteno + '_facilityi';
      if (allfilled)
         eid(fldid).style.color = '#0' + rgb(1,180,1);
      else
         eid(fldid).style.color = '#' + rgb(180,1,1);
   }
   for (i = 0; i < incols.length; i++) {
      fldobj = eid('t_' + incols[i] + 'i');
      oldval = parseInt(fldobj.innerHTML);
      oldval += totadj[i];
      fldobj.innerHTML = oldval;
   }
   clock();
   },
   failure: function(o) {
   },
   timeout:10000
}

function refresh(siteno, infldalso) {    /* if siteno not passed, refresh all */
refreshinput = false;
if (infldalso != undefined && infldalso)
   refreshinput = true;
var httprqs = 'caucus_results_proc.php?sitenum=';
if (siteno == undefined)
   httprqs += 'all';
else
   httprqs += siteno;
var randno = new Date().getTime();
httprqs += '&__rand=' + randno;   /*  random number to prevent caching  */
// alert('RQS = ' + httprqs);
var co = YAHOO.util.Connect.asyncRequest('GET', httprqs, cb_refresh);
}

/****  Post field updates ****/
function postchg(sitenum, update) {
   if (update) {  /* update, not cancel */
      var totald = 0;
      var allfldsval = true;
      for (var i = 0; i < incols.length; i++) {
         var fldval = eid('i' + sitenum + '_' + incols[i] + 'i').value;
         if (fldval == "") {
            allfldsval = false;
            break;
         }
         else if (incols[i].substr(0, 2) == 'd_')  /* only total delegates */
            totald += parseInt(fldval);
      }
      if (!allfldsval) {
         var cf = confirm('All delegate and supporter fields must have a value. Enter 0 if count is zero.\nClick OK to retry, Cancel to reject update.');
         if (!cf) {  /* cancel */
            postchg(sitenum, false);
            return false;
         }
         return false;
      }
      var fldid = 'o' + sitenum + '_site_delegates_total';
      var total_site_delegates = parseInt(eid(fldid).innerHTML);
      if (totald != total_site_delegates) {
         var cf = confirm("Delegate count does not match the required total.\nClick OK to retry, Cancel to reject update.");
         if (!cf) {  /* cancel */
            postchg(sitenum, false);
            return false;
         }
         return false;
      }
      postsiterec(sitenum);
      return true;
   }
   eid('siteproci').value = '';
   refresh(sitenum);
   setinput(sitenum, false);
}



/****  Set a site's fields to input or output-only mode ****/
function setinput(sitenum, inmode) {    /* inmode = true or false */
   for (var i = 0;i < incols.length;i++) {
      var infld = eid('i' + sitenum + '_' + incols[i] + 'i');
      var outfld = eid('o' + sitenum + '_' + incols[i] + 'i');
      if (inmode) {
         infld.style.display = '';
         outfld.style.display = 'none';
         if (i == 0)
            infld.focus();
      } else {
         infld.style.display = 'none';
         outfld.style.display = '';
         tt[i].hide();
      }
   }
   if (inmode) {
      for (var i = 0;i < incols.length;i++) {  /* move tooltips after hidden fields display for better rendering */
         var infld = eid('i' + sitenum + '_' + incols[i] + 'i');
         tt[i] = new Tooltip();
         var bcolor = '#' + rgb(224,224,240);
         tt[i].show(hdrs[i], 0, -40, infld, '', bcolor);
      }   /* either display phone# or update/cancel buttons */
      eid('o' + sitenum + '_site_phonei').style.display = 'none';
      eid('o' + sitenum + '_update_buttoni').style.display = '';
   } else {
      eid('o' + sitenum + '_site_phonei').style.display = '';
      eid('o' + sitenum + '_update_buttoni').style.display = 'none';
   }
}

   
   
   
/**** update counts for a site; set up input fields ****/
function updtsitecount(sitenum) {
   var sitenumproc = eid('siteproci');
   if (sitenumproc.value != "") { /* an update in process */
      alert('Update is in process for site ' + sitenumproc.value + ' and must be completed.');
      return false;
   }
   refresh(sitenum, true);
   sitenumproc.value = sitenum;
   setinput(sitenum, true);
}

/**** post updates for a site ****/
var cb_postsiterec = {
   success: function(o) {
      var r = o.responseText;
      var s = r.indexOf('<error>');
      if (s >= 0) {
         alert(r.substr(s + 7));
         return false;
      }
      s = r.indexOf('<');
      var siteno = '';
      while(true) {
         var sc = r.substr(++s, 1);
         if (sc != '>')
            siteno += sc;
         else
            break;
      }
      eid('siteproci').value = '';
      refresh(siteno);
      setinput(siteno, false);
   },
   failure: function(o) {
      alert('Update request failed or timed out.');
   },
   timeout: 10000
}

/**** post site updates to the database ****/
function postsiterec(siteno) {
   var httprqs = 'caucus_results_proc.php?sitenum=' + siteno + '&update=y';
   for (var i = 0;i < incols.length; i++) {
      var fldid = incols[i];
      var fldval = eid('i' + siteno + '_' + fldid + 'i').value;
      httprqs += '&' + fldid + '=' + fldval;
   }
   var randno = new Date().getTime();
   httprqs += '&__rand=' + randno;
   var co = YAHOO.util.Connect.asyncRequest('GET', httprqs, cb_postsiterec);
}

/**** check for open updates at close of window ****/
function checkactive() {
   var x = eid('siteproci').value;
   if (x != '') {
//      alert('An update for site ' + x + ' was not completed.');
      return 'An update for site ' + x + ' was not completed.';
   }
   return;
}


