Array.prototype.push = function(value) {this[this.length] = value}

function getElementsByClassName(strClass, strTag, objContElm) {
  strTag = strTag || "*";
  objContElm = objContElm || document;
  var objColl = (strTag == '*' && document.all) ? document.all : objContElm.getElementsByTagName(strTag);
  var arr = new Array();
  var delim = strClass.indexOf('|') != -1  ? '|' : ' ';
  var arrClass = strClass.split(delim);
  for (i = 0, j = objColl.length; i < j; i++) {
    var arrObjClass = objColl[i].className.split(' ');
    if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
    var c = 0;
    comparisonLoop:
    for (k = 0, l = arrObjClass.length; k < l; k++) {
      for (m = 0, n = arrClass.length; m < n; m++) {
        if (arrClass[m] == arrObjClass[k]) c++;
        if (( delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length)) {
          arr.push(objColl[i]);
          break comparisonLoop;
        }
      }
    }
  }
  return arr;
}

var SIR = {
  // used to apply behavior to elements
  class_hook: 'SIR',
  
  // Convention for naming image rollover states
  over_convention: '_over',
  
  // Regular expression patterns for matching relevant parts of the image src
  // Note capturing parens: they are used in the mouseover/out functions
  ext_re:    '(\.(png|gif|jpe?g))$',
  freeze_re: '(-[ao])' + this.ext_re,
  
  over_src: function(src) {
    return src.replace(new RegExp(SIR.ext_re), SIR.over_convention + '$1')
  },
  out_src: function(src) {
    return src.replace(new RegExp(SIR.over_convention + SIR.ext_re), '$1')
  },  
  
	over: function(img) {
    if (!img || !img.src) img = this
    img.src = SIR.over_src(img.src)
	},	
	out: function(img) {
    if (!img || !img.src) img = this
    img.src = SIR.out_src(img.src)
	},    
  
  attach_to: function(img) {
    img.onmouseover = SIR.over
    img.onmouseout  = SIR.out
    SIR.preload_rollover(img)
  },
  
  preload_rollover: function(img) {
    var pre = new Image()
    pre.src = SIR.over_src(img.src)
  },
  
  // append init() to window.onload to enable
	init:	function() {
    var marked = getElementsByClassName(SIR.class_hook)
    var imgs
    for (var i=0; i<marked.length; i++) {
      imgs = (marked[i].nodeName == 'IMG') ? [marked[i]] : marked[i].getElementsByTagName('img')
      for (var j=0; j<imgs.length; j++) {
        // only do rollover if not on 'over' or 'active' state already
        if (!imgs[j].src.match(new RegExp(/_over/gi))) {
          SIR.attach_to(imgs[j])
        }
      }
    }
	}
  
}

Event.observe(window, 'load', SIR.init)