
Event.observe(window, 'load', function() { ApplyZebraStripes(); });

function ApplyZebraStripes(){
  $$('.canstripe').each(function(el){
    reStripe(el);
  });
}

function reStripe(el) {
  if(el.nodeName !== 'TABLE')
    return;

  var c = el.childElements();

  for(var i=0; i<c.length; i++) {
    if(c[i].nodeName == 'TBODY') {
      c = c[i].childElements();
      break;
    }
  }

  // Skip the headers in the first line of table:
  if(c[0]) {
    var start = 0;
    c[0].childElements().each(function(el){ if(el.nodeName == 'TH') start++; });
    if(start == c[0].childElements().length) c.shift();
  }

  if(c.length < 2)
    return;

  var zscount = 1;
  var nostripeclass;

  $w(el.className).each(function(cName){
    var cnt = cName.match('stripeevery([0-9]+)');
    if(cnt) {
      zscount = cnt[1];
    } else {
      cnt = cName.match('stripeodd_(.+)');
      if(cnt)
        nostripeclass = cnt[1];
    }
  });

  var addzstripe=1;
  var cnt = zscount;
  var multicol = c[0].childElements().length;

  for(var i=0; i<c.length; i++) {
    if(c[i].hasClassName('nostripe'))
      continue;

    // Skip line-breaking rows
    if(multicol && c[i].childElements().length == 1)
      continue;

    // Skip hidden rows too:
    if((c[i].getStyle('display') || '') == "none")
      continue;


    if(c[i].hasClassName('zstripe'))
      c[i].removeClassName('zstripe');
    if(nostripeclass && c[i].hasClassName(nostripeclass))
      c[i].removeClassName(nostripeclass);

    // Dupe the row before:
    if(i>0 && c[i].hasClassName('previousstriping')) {
      if(c[i-1].hasClassName('zstripe'))
        c[i].addClassName('zstripe');
      else if(nostripeclass && c[i-1].hasClassName(nostripeclass))
        c[i].addClassName(nostripeclass);

      continue;
    }

    if(addzstripe) {
      c[i].addClassName('zstripe');
    } else if(nostripeclass) {
      c[i].addClassName(nostripeclass);
    }

    if(cnt <=1) {
      addzstripe = !addzstripe;
      cnt = zscount;
    } else {
      cnt--;
    }
  }
};
