// copyright 2004 inlet media e.K. Norman Timmler

rollBuffer = Array();
rollLockList = Array();
rollPreloadState = false;
rollState = Array();


function rollPreload(images) {
  
  for (name in images) {
    
    img = findImage(name);
    if (img == null || !img.src) continue;
    matches = img.src.match(/^.+:\/\/.+?(\/.+\/)(.+?)((_lo|_hi)?)\.([^\.]+)$/);
    path = matches[1];
    filename = matches[2];
    highlow = matches[3].replace('_', '');
    type = matches[5];
    rollover = (images[name] == null) ? filename : images[name];
    
    
    triggers = Array();
    j = 1;
    trigger = xGetElementById(name + 'Trigger');
    do {
      if (trigger != null) triggers.push(trigger);
      trigger = xGetElementById(name + 'Trigger' + j);
    } while (trigger != null)
    
    
    rollBuffer[name] = Array();
    rollBuffer[name]['lo'] = new Image();
    rollBuffer[name]['hi'] = new Image();
    rollBuffer[name]['lo'].src = path + filename + ((highlow != '') ? '_lo.' : '.') + type;
    rollBuffer[name]['hi'].src = path + rollover + ((highlow != '') ? '_hi.' : '.') + type;
    
    if (triggers.length == 0) {
        img.onmouseover = rollEvent;
        img.onmouseout = rollEvent;
    } else {
      for (j=0; j < triggers.length; j++) {
        triggers[j].onmouseover = rollEvent;
        triggers[j].onmouseout = rollEvent;
      }
    }
  }
  
  rollPreloadState = true;
}

function rollEvent(e, name) {
  
  if (!name) {
    name = this.id.replace(/Trigger[0-9]?/, '');
  }
  
  if (!rollPreloadState || rollLockList[name] != null) return;

  img = findImage(name);
  
  if (rollState[img.id] == null) rollState[img.id] = -1;
  
  rollState[img.id] *= -1;
  
  if (rollState[img.id] == 1) {
    // indexOf instead of '==' to fix konquerors path truncation
    if (img.src.indexOf(rollBuffer[name]['hi'].src) == -1) {
      img.src = rollBuffer[name]['hi'].src;
    }
  } else {
    setTimeout("rollLow('" + name + "');", 5);
  }
  
}

function rollLow(name) {
  img = findImage(name);
  if (rollState[img.id] == -1) {
    img.src = rollBuffer[name]['lo'].src;
  }
}

function rollLockGroup(name) {
  rollUnlock(name, true);
  rollLock(name);
}

function rollLock(name) {
  rollLockList[name] = name;
}

function rollUnlock(name, group) {
  if (group) {
    for (_name in rollLockList) {
      if (rollLockList[_name] != null && 
        name.replace(/[0-9]+/, '') == _name.replace(/[0-9]+/, '') &&
        name != _name) {
        rollLockList[_name] = null;
        rollEvent(null, _name);
      }
    }
  } else {
    rollLockList[name] = null;
    rollEvent(null, name);
  }
}

function rollSetLow(target, name) {
  targets = rollFindAll(target)
  for (i=0; i < targets.length; i++) {
    rollBuffer[targets[i]]['lo'].src = rollBuffer[name]['hi'].src;
  }
}

function arrayFind(arr, value) {
  for (i=0; i < arr.length; i++) {
    if (value == arr[i]) return i;
  }
  return -1;
}

function findImage(name) {
  img = xGetElementById(name.replace(/[0-9]$/, '') + 'Target');
  if (img == null) img = xGetElementById(name.replace(/[0-9][0-9]$/, '') + 'Target');
  if (img != null) return img;
  return xGetElementById(name);
}

function rollFindAll(name) {
  i = 0;
  names = Array();
  searchName = name;
  do {
    if (rollBuffer[searchName] != null) names.push(searchName);
    i++;
    searchName = name + i;
  } while (rollBuffer[searchName] != null)
  return names;
}
