
function objdump(obj, maxDepth, prefix){
   var result = '';
   if (!prefix) prefix='';
   for(var key in obj){
       if (typeof obj[key] == 'object'){
           if (maxDepth !== undefined && maxDepth <= 1){
               result += (prefix + key + '=object [max depth reached]\n');
           } else {
               result += objdump(obj[key], (maxDepth) ? maxDepth - 1: maxDepth, prefix + key + '.');
           }
       } else {
           result += (prefix + key + '=' + obj[key] + '\n');
       }
   }
   return result;
}


function check_ranged_checkbox(evt) {
  if ( typeof check_ranged_checkbox.last_clicked == 'undefined' ) {
    check_ranged_checkbox.last_clicked = this;
    return;
  }
  if (evt.shiftKey) {
    var nodes = dojo.query(".rangecheck");
    var start = nodes.indexOf(this);
    var end = nodes.indexOf(check_ranged_checkbox.last_clicked);
    for(i = Math.min(start,end); i <= Math.max(start,end); i++) {
      nodes.at(i).forEach("item.checked = check_ranged_checkbox.last_clicked.checked;");
    }
  }
  check_ranged_checkbox.last_clicked = this;
}


function unassignwalker(theform) {
   dojo.xhrGet({ 
    form: theform, 
    content: {ajax: "yes"},
    handleAs: "json",
    error: function(resp, ioargs) {
      alert(object_members(resp));
    },
    load: function(resp, ioargs) {
      var ele = theform.election.value;
      var trk = theform.census_track.value;
      var blk = theform.block_group.value;
      if (resp.success > 0) {
        var myHTML = '';
        myHTML += '<form action="?" method="post">';
        myHTML += '<input type="hidden" name="action" value="assign_walker_block_groups" />';
        myHTML += '<input type="hidden" name="return" value="election" />';
        myHTML += '<input type="hidden" name="ajax" value="yes" />';
        myHTML += '<input type="hidden" name="election" value="' + ele + '" />';
        myHTML += '<input type="hidden" name="walker_block_groups[]" value="' + trk + '_' + blk + '" />';
        myHTML += '<input type="hidden" name="census_track" value="' + trk + '" />';
        myHTML += '<input type="hidden" name="block_group" value="' + blk + '" />';
        myHTML += '<select class="ajaxwalker" name="walker" onchange="assignwalker(this.form)">';
        myHTML += '<option label="Select a Walker..." value="select">Select a walker...</option>';
        for (var k in resp.walkers) 
          myHTML += '<option label="' + resp.walkers[k] + '" value="' + k + '">' + resp.walkers[k] + '</option>';
        myHTML += '</select>';
        myHTML += '</form>';
        theform.parentNode.innerHTML = myHTML;
      }
      else {
        alert(resp.pagemessage);
      }
    }
  });
}


function assignwalker(theform) {
  dojo.xhrGet({ 
    form: theform, 
    content: {ajax: "yes"},
    load: function() {
      var ele = theform.election.value;
      var val = theform.walker.options[theform.walker.selectedIndex].value;
      var lbl = theform.walker.options[theform.walker.selectedIndex].label;
      var trk = theform.census_track.value;
      var blk = theform.block_group.value;
      var myHTML = '';
      myHTML += '<form action="?" method="post">';
      myHTML += '<table><tr><td>';
      myHTML += '<input type="hidden" name="action" value="unassign_block_group" />';
      myHTML += '<input type="hidden" name="election" value="' + ele + '" />';
      myHTML += '<input type="hidden" name="census_track" value="' + trk + '" />';
      myHTML += '<input type="hidden" name="block_group" value="' + blk + '" />';
      myHTML += '<input type="hidden" name="walker" value="' + val + '" />';
      myHTML += '<input type="hidden" name="return" value="ajax" />';
      myHTML += '<input type="button" value="Unassign" onclick="unassignwalker(this.form)" />';
      myHTML += '</td><td>';
      myHTML += '<a href="?action=view_walker&amp;election=' + ele + '&amp;walker=' + val + '">' + lbl + '</a>';
      myHTML += '</td></tr></table>';
      myHTML += '</form>';
      theform.parentNode.innerHTML = myHTML;
    }
  });
}



function update_voter_total(evt) {
  voterstotal = dojo.byId("voterstotal");
  if (voterstotal) {
    var total = 0;
    dojo.query(".blockgroupassignment .rangecheck").forEach(
      function(node) {
        if (node.checked) {
          total = total + voter_counts[node.value];
        }
      }
    );
    voterstotal.innerHTML = total;
  }
}


function set_form_enabled_state(theform) {
  var response = get_form_response(theform);
  if (response != 'not home' && response != 'cant find' && response != 'unreachable' && response != false) {
    theform.wants_sign.disabled = false;
  }
  else {
    theform.wants_sign.disabled = true;
    theform.wants_sign.checked = false;
  }
  if (response != false) {
    theform.notes.disabled = false;
  }
  else {
    theform.notes.disabled = true;
  }
  if (response != 'unreachable') {
    theform.supporter_sign.checked = false; 
    theform.opposition_sign.checked = false; 
    dojo.query("[name='signcheckboxes']", theform).forEach(
      function(node) {
        node.style.display = 'none';
      }
    );
  }
  else {
    dojo.query("[name='signcheckboxes']", theform).forEach(
      function(node) {
        node.style.display = '';
      }
    );
  }
}


function enableform(evt) {
  set_form_enabled_state(this.form);
  process_form(this.form);
}


function object_members( obj ) {
  var str = '';
  for( var memb in obj )
    str += memb + ' = ' + obj[memb] + '\n';
  return str;
}


function pad_2_digits(num) {
  num = num + "";
  if (num.length == 1) {
    num = "0" + num;
  }
  return num;
}


function my_formatted_date() {
  d = new Date();
  var str = d.getFullYear() + '-' + pad_2_digits(d.getMonth() + 1) + '-' +  pad_2_digits(d.getDate());
  str += ' ' + pad_2_digits(d.getHours()) + ':' + pad_2_digits(d.getMinutes()) + ':' + pad_2_digits(d.getSeconds());
  return str;
}


function get_form_response(theform) {
  var response = false;
  for (var i=0; i < theform.response.length; i++) {
    if (theform.response[i].checked) {
      response = theform.response[i].value;
    }
  }
  return response;
}


function setvoted(theform) {
  dojo.xhrGet({
    form: theform,
    content: {ajax: "yes"},
    handleAs: "json",
    error: function(resp, ioargs) {
    },
    load: function(resp, ioargs) {
      if (theform.voted.checked) {
        theform.parentNode.parentNode.className = 'voted';
      }
      else {
        theform.parentNode.parentNode.className = 'odd';
      }
    }
  });
}


function setbadnumber(theform) {
  dojo.xhrGet({
    form: theform,
    content: {ajax: "yes"},
    handleAs: "json",
    error: function(resp, ioargs) {
    },
    load: function(resp, ioargs) {
      if (theform.badnumber.checked) {
        theform.parentNode.parentNode.className = 'badnumber';
      }
      else {
        theform.parentNode.parentNode.className = 'odd';
      }
    }
  });
}


function settimes_called(node) {
  theform = dojo.byId(node).form;
  dojo.query('img', theform).forEach(function(el) {img = el;});
  img.setAttribute('src','images/hourglass-spinning.gif');
  dojo.xhrGet({
    form: theform,
    content: {ajax: "yes"},
    handleAs: "json",
    load: function(resp, ioargs) {
      img.setAttribute('src','images/pixel.gif');
    }
  });
}


function star(theform) {
  dojo.xhrGet({
    form: theform,
    content: {ajax: "yes"},
    handleAs: "json",
    error: function(resp, ioargs) {
    },
    load: function(resp, ioargs) {
      var myHTML = '';
      myHTML += ' <input type="hidden" name="action" value="unstar" />';
      myHTML += ' <input type="hidden" name="election" value="' + theform.election.value + '" />';
      myHTML += ' <input type="hidden" name="census_trk" value="' + theform.census_trk.value + '" />';
      myHTML += ' <input type="hidden" name="block_group" value="' + theform.block_group.value + '" />';
      myHTML += ' <input type="image" onclick="unstar(this.form); return false;" src="images/yellow-star.png" border="0" />';
      theform.innerHTML = myHTML;
    }
  });
}


function unstar(theform) {
  dojo.xhrGet({
    form: theform,
    content: {ajax: "yes"},
    handleAs: "json",
    error: function(resp, ioargs) {
    },
    load: function(resp, ioargs) {
      var myHTML = '';
      myHTML += ' <input type="hidden" name="action" value="star" />';
      myHTML += ' <input type="hidden" name="election" value="' + theform.election.value + '" />';
      myHTML += ' <input type="hidden" name="census_trk" value="' + theform.census_trk.value + '" />';
      myHTML += ' <input type="hidden" name="block_group" value="' + theform.block_group.value + '" />';
      myHTML += ' <input type="image" onclick="star(this.form); return false;" src="images/white-star.png" border="0" />';
      theform.innerHTML = myHTML;
    }
  });
}


function process_form(theform) {
  dojo.xhrGet({ 
    form: theform, 
    content: {ajax: "yes"},
    handleAs: "json",
    load: function(resp, ioargs) {
      var response = get_form_response(theform);
      var node = theform.parentNode.parentNode;
      dojo.query("[name='updatetime']", node).forEach(
        function(node) {
          node.innerHTML = my_formatted_date();
        }
      )
      dojo.query("[name='updateinitials']", node).forEach(
        function(node) {
          node.innerHTML = theform.initials.value;
        }
      )
      dojo.query("td[class='deleteresponse']", node).forEach(
        function(node) {
          var myHTML = '';
          myHTML += '<form>';
          myHTML += '  <input type="hidden" name="action" value="delete_response" />';
          myHTML += '  <input type="hidden" name="election" value="' + resp.election + '" />';
          myHTML += '  <input type="hidden" name="response_id" value="' + resp.response_id + '" />';
          myHTML += '  <input type="hidden" name="return_action" value="' + resp.return_action + '" />';
          myHTML += '  <input type="submit" value="X" />';
          myHTML += '</form>';
          node.innerHTML = myHTML;
        }
      )
      dojo.removeClass(node, 'even');
      dojo.removeClass(node, 'odd');
      dojo.removeClass(node, 'nothome');
      dojo.removeClass(node, 'hasvalue');
      if (response == 'not home') {
        dojo.addClass(node, 'nothome');
      }
      else {
        dojo.addClass(node, 'hasvalue');
      }
    }
  });
}


dojo.addOnLoad(function(){
  dojo.query(".rangecheck").forEach(
    function(node) {
      dojo.connect(node, 'onclick', check_ranged_checkbox)
    }
  );
  dojo.query(".blockgroupassignment .rangecheck").forEach(
    function(node) {
      dojo.connect(node, 'onclick', update_voter_total)
    }
  );
  dojo.query(".response input[name='wants_sign']").forEach(
    function(node) {
      set_form_enabled_state(node.form);
    }
  );  
  dojo.query(".response input").forEach(
    function(node) {
      dojo.connect(node, 'onchange', enableform)
    }
  );
});

