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

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

function reStripe(el) {
  var c;

  if(!el) return;

  if(el.nodeName === 'TABLE') {
    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();
    }
  } else if(el.nodeName === 'UL'
            || el.nodeName === 'OL'
            || el.nodeName === 'DL') {
    c = el.childElements();
  } else {
    return;
  }

  if(c.length < 2)
    return;

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

  $w(el.className).each(function(cName){
    if(cName === 'reversestripe') {
      addzstripe = 0;
      return;
    }

    var cnt = cName.match('stripeevery([0-9]+)');
    if(cnt) {
      zscount = cnt[1];
      return;
    }

    cnt = cName.match('stripeodd_(.+)');
    if(cnt) {
      nostripeclass = cnt[1];
    }
  });

  var cnt = zscount;

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

    // Skip line-breaking rows
    if(multicol && el.childElements().length === 1
       && !el.hasClassName('stripeok'))
      continue;

    // Skip hidden rows too:
    if((el.getStyle('display') || '') === "none")
      continue;


    el.removeClassName('zstripe');
    el.removeClassName('zstripeodd');
    if(nostripeclass && nostripeclass !== 'zstripeodd')
      el.removeClassName(nostripeclass);

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

      continue;
    }

    if(addzstripe) {
      el.addClassName('zstripe');
    } else if(nostripeclass) {
      el.addClassName(nostripeclass);
    }

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