old_contents: var coge = window.coge = (function(ns) {
      ns.utils = {
          ascending: function(a, b) {
              return a < b ? -1 : a > b ? 1 : 0;
          },
  
          descending: function(a, b) {
              return a > b ? -1 : a < b ? 1 : 0;
          },
  
          open: function(link) {
              window.open(link, "_self");
          },
          shuffle: function(array) {
              var copy = [], n = array.length, i = 0;
  
              while (n) {
                  i = Math.floor(Math.random() * array.length);
                  if (i in array) {
                      copy.push(array[i]);
                      delete array[i];
                      n--;
                  }
              };
  
              return copy;
          }
      };
  
      return ns;
  })(coge || {});
  
new_contents: var coge = window.coge = (function(ns) {
      ns.utils = {
          ascending: function(a, b) {
              return a < b ? -1 : a > b ? 1 : 0;
          },
  
          descending: function(a, b) {
              return a > b ? -1 : a < b ? 1 : 0;
          },
  
          open: function(link) {
              window.open(link, "_self");
          },
          shuffle: function(array) {
              var copy = array.slice(0), n = array.length, tmp, i;
  
              while (n) {
                  i = Math.floor(Math.random() * n--);
                  tmp = copy[n];
                  copy[n] = copy[i];
                  copy[i] = tmp;
              };
  
              return copy;
          }
      };
  
      return ns;
  })(coge || {});
  
subject: fix shuffle to run in linear time