var cur;

var checkEvent = function (e) {
  if (e.target.tagName == 'INPUT' && e.target.type == 'checkbox' && ((e.button==0||e.button==1) || e.keyCode==32)) {
    // already have a starting point, and shift is pressed?
    if (cur && e.shiftKey) selectRange(cur, e.target);
    cur = e.target;
  }
}

var selectRange = function (from,to) {
  var inputs = document.getElementsByTagName('input');
  var checkboxes = [];
  var last;
  var i;
 
  // this might be better with xpath, but I'm lazy
  for (i = 0; i < inputs.length; i++)
    if (inputs[i].getAttribute('type') == 'checkbox')
      checkboxes.push(inputs[i]);
 
  for (i = 0; i < checkboxes.length; i++) {
    if (checkboxes[i] == to) {
      last = from;
      break;
    }
    if (checkboxes[i] == from) {
      last = to;
      break;
    }
  }
 
  for (; i < checkboxes.length; i++) {
    if (checkboxes[i] != from && checkboxes[i] != to) { // from and to have been clicked by the user
      if (checkboxes[i].checked != from.checked) { // state change?
        // fire onclick (magic)
        var e = document.createEvent('MouseEvents');
        e.initEvent('click', true, false);
        checkboxes[i].dispatchEvent(e);
	checkboxes[i].checked = from.checked;
      }
    }
    if (checkboxes[i] == last) break;
  }
}

var init = function () {
   if (document.documentElement.addEventListener) {
  	document.documentElement.addEventListener('click', checkEvent, true);
  	document.documentElement.addEventListener('keyup', checkEvent, true);
   } else if (document.documentElement.attachEvent) {
  	document.documentElement.attachEvent('onclick', checkEvent);
  	document.documentElement.attachEvent('onkeyup', checkEvent);
   } else {
  	document.documentElement.onclick = checkEvent;
  	document.documentElement.onclick = checkEvent;
   }
}

init();
