
var browserId = "w3c";
if (document.all)
    browserId = "ie";

document.write('<script language="javascript" src="/toolkit/dom_'+browserId+'.js"></script>');

////////////////////////////////////////////////////////////////////////////////////////////////////
// DOM Iteration

function $(id)
{
    return document.getElementById(id);
}

function findNode(node, criteria, container)
{
    while (node)
    {
        if (criteria(node))
            return node;
            
        node = findNext(node, container);
    }
    
    return null;
}

function findNodeUp(node, criteria)
{
    while (node)
    {
        if (criteria(node))
            return node;
            
        node = node.parentNode;
    }
    
    return null;
}

function findNext(node, container)
{
    var next = node.firstChild;
    if (next)
        return next;
        
    while (node && node != container)
    {
        next = node.nextSibling;
        if (next)
            return next;
        
        node = node.parentNode;
    }
    return null;
}

function getElementByClass(root, className)
{
    return findNode(root,
        function(node) { return node.nodeType == 1 && hasClass(node, className) });
}

function clearChildren(node)
{
    while (node.firstChild)
        node.removeChild(node.firstChild);
}

////////////////////////////////////////////////////////////////////////////////////////////////////
// Serialization

function toInnerXML(aElt)
{
  var xml = "";
  var child = aElt.firstChild;
  while (child) {
    xml += toXML(child);
    child = child.nextSibling;
  }
  
  return xml;
}

function toXML(aElt)
{
  if (aElt.nodeType == 1) {
    var xml = "<" + aElt.nodeName;
    
    var child = aElt.firstChild;
    if (child) {
      xml += ">";
      while (child) {
        if (child.nodeType == 1) { // element node
          xml += toInnerXML(child);
        } else if (child.nodeType == 3) { // text node
          xml += child.nodeValue;
        }
        child = child.nextSibling;
      }
      xml += "</" + aElt.nodeName + ">";
    } else {
      xml += "/>";
    }
  
    return xml;
  } else {
    return aElt.nodeValue;
  }
}

////////////////////////////////////////////////////////////////////////////////////////////////////
// Classes

function addClass(elt, className)
{
    if (elt.className)
    {
        var classes = elt.className.split(" ");
        if (className in classes)
            return;
    
        for (var i in classes)
            className += " " + classes[i];
    }

    elt.className = className;
}

function setClass(elt, className)
{
    if (!hasClass(elt))
        addClass(elt, className);
}

function toggleClass(elt, className)
{
    if (hasClass(elt, "toggled"))
        removeClass(elt, "toggled");
    else
        addClass(elt, "toggled");
}

function removeClass(elt, className)
{
    if (!elt.className)
        return;

    var classes = elt.className.split(" ");

    for (var i in classes)
    {
        if (classes[i] == className)
            classes.splice(i, 1);
    }
    
    var classNames = "";
    for (var i in classes)
        classNames += classes[i] + " ";
    
    elt.className = classNames;
}

function hasClass(elt, className)
{
    if (elt.className)
    {
        var classes = elt.className.split(" ");
        for (var i in classes)
        {
            if (classes[i] == className)
                return true;
        }
    }
    
    return false;
}

////////////////////////////////////////////////////////////////////////////////////////////////////
// Positioning

function getClientOffset(elt)
{
    function addOffset(elt, coords, addStyle)
    {
        var style = computeStyle(elt);
        if (addStyle && style.position != "absolute")
        {
            coords.x += parseInt(style.marginLeft)
                + parseInt(style.borderLeftWidth);
            coords.y += parseInt(style.marginTop)
                + parseInt(style.borderTopWidth);
        }
        
        if (elt.offsetLeft)
            coords.x += elt.offsetLeft;
        if (elt.offsetTop)
            coords.y += elt.offsetTop;
        if (elt.offsetParent && elt.offsetParent.nodeType == 1)
            addOffset(elt.offsetParent, coords, false);
    }
    
    var coords = { x: 0, y: 0 };
    addOffset(elt, coords);
    return coords;
}

////////////////////////////////////////////////////////////////////////////////////////////////////
// Events

function registerPopup(popupElt)
{
    function onClick(event)
    {
        popupElt.style.visibility = "collapse";
        removeListener(window, "click", onClick, true);
    }

    addListener(window, "click", onClick, true);
}
