function $(id)
{
  var element = null;
  if (typeof id == 'string') 
  {
    element = document.getElementById(id);
  }
  else
  {
    element = id;
  }
  
  return element;
}

function $$(tag)
{
  return document.getElementsByTagName( tag);
}

function createXMLHttpRequest()
{
  try 
  {
    return new ActiveXObject("Msxml2.XMLHTTP");
  } 
  catch (e) 
  {
  }
  try 
  {
    return new ActiveXObject("Microsoft.XMLHTTP");
  } 
  catch (e) 
  {
  }
  try 
  {
    return new XMLHttpRequest();
  } 
  catch (e) 
  {
  }
  
  alert("XMLHttpRequest not supported");
  return null;
}

function setVisible( element, visible)
{
  $(element).style.display = (visible ? 'block' : 'none');
}

function showElement( element)
{
  setVisible( element, true);
}

function hideElement( element)
{
  setVisible( element, false);
}

function isVisible( element)
{
  return ($(element).style.display != 'none');
}

function toggleVisibility( element)
{
  if (isVisible( element))
  {
    hideElement( element);
  }
  else
  {
    showElement( element);
  }
}

var Ajax =
{
  xhr: null,
  onSuccess: null,
  onFailure: null,
  
  readyStateChange: function()
  {
    var scope = Ajax;
    if (scope.xhr.readyState == 4)
    {
      if (scope.xhr.status == 200) 
      {
        scope.onSuccess(scope.xhr);
      }
      else
      {
        scope.onFailure(scope.xhr);        
      }
    }
  },
  
  request: function (url, method, onSuccess, onFailure)
  { 
    if (this.xhr !== null)
    {
      this.xhr.abort();
      this.xhr = null;
    }
    
    this.xhr = createXMLHttpRequest();
    this.onSuccess = onSuccess;
    this.onFailure = onFailure;
    
    this.xhr.onreadystatechange = this.readyStateChange;
    this.xhr.open( method, url, true);
    this.xhr.send(null);
  },
  
  updateElement: function (element, url, onSuccess)
  {
    this.request( url, 'GET', function (xhr){
      element.innerHTML = xhr.responseText;
      
      if (onSuccess)
      {
        onSuccess();
      }
    });
  }
};