function array_intersect() {
  var sorted, shortest, ret = [], add, found, obj={}, nOthers;
  sorted = Array.prototype.slice.call(arguments).sort(function(i,j){return i.length>j.length;});
  nOthers = sorted.length-1;
  shortest = sorted[0];
  
  for (var i=nOthers; i>0; --i) {
    for (var j=sorted[i].length-1; j>=0; --j) {
      obj[sorted[i][j]] = (obj[sorted[i][j]]||0)+1;
    }
  }
  for (var k=shortest.length-1; k>=0; k--) {
    if (obj[shortest[k]]===nOthers) {ret.push(shortest[k]);}
  }
  return ret;
}