// Browser sniffing

is_opera = /opera/i.test(navigator.userAgent);
is_ie = ( /msie/i.test(navigator.userAgent) && !is_opera );
is_ie5 = ( is_ie && /msie 5\.0/i.test(navigator.userAgent) );
is_mac_ie = ( /msie.*mac/i.test(navigator.userAgent) && !is_opera );
is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
is_konqueror = /Konqueror/i.test(navigator.userAgent);
is_gecko = /Gecko/i.test(navigator.userAgent);

function createElement(tagName, attrs) {
  var el = document.createElement(tagName);
  for (attr in attrs) {
    var parts = attr.split('.');
    var part = el;
    for(var i=0; i<parts.length-1; ++i)
      part = part[parts[i]]; 
    if      (attr == 'className') el.className = attrs[attr];
    else                          part[parts[i]] = attrs[attr]; }
  return el; }

function localOffsetTop(el) {
  if (el.offsetParent == el.parentNode) 
    return el.offsetTop;
  else 
    return el.offsetTop - offsetTopRelativeTo(el.parentNode, el.offsetParent);
}

function globalOffsetTop(el) {
  if (el.offsetParent == null || el.offsetParent == document.body)
    return el.offsetTop;
  else
    return el.offsetTop + globalOffsetTop(el.offsetParent);
}

function offsetTopRelativeTo(inner, outer) {
  // N.B. What if an element between inner and outer has an
  // offsetParent above outer?!?!?
  if (inner.offsetParent == outer)
    return inner.offsetTop;
  else
    return inner.offsetTop - offsetTopRelativeTo(inner.parentNode, outer);
}

