function $(id) { return document.getElementById(id); }

function AddHandler(object, event, handler)
{
  if (typeof object.addEventListener != 'undefined')
    object.addEventListener(event, handler, false);
  else if (typeof object.attachEvent != 'undefined')
    object.attachEvent('on' + event, handler);
  else
    throw "Incompatible browser";
}

function RemoveHandler(object, event, handler)
{
  if (typeof object.removeEventListener != 'undefined')
    object.removeEventListener(event, handler, false);
  else if (typeof object.detachEvent != 'undefined')
    object.detachEvent('on' + event, handler);
  else
    throw "Incompatible browser";
}

function PreventDefault(event)
{
  if (typeof(event.preventDefault) != 'undefined')
    event.preventDefault();
}

function GetTarget(e)
{
  return typeof(e.target) != 'undefined' ? e.target : e.srcElement;
}

function ParentNode(node)
{
  return typeof(node.parentNode) != 'undefined' ? node.parentNode : node.parentElement;
}

function ClearElement(elem)
{
  while (elem.hasChildNodes())
    elem.removeChild(elem.firstChild);
}

function FindParent(ctrl, tagName)
{
  var node = ctrl; 
  for(;;)
  {
    if (typeof(node.tagName) != 'string') return null;
    if (node.tagName.toUpperCase() == tagName.toUpperCase()) return node;

    node = ParentNode(node);
    if (node == null) return null;
  }  
}

function CalculateAbsoluteOffset(ctrl)
{
  var elem = ctrl;
	
  var left = 0;
  var top = 0;
	
  while (elem)
  {
    left += elem.offsetLeft;
    top += elem.offsetTop;
    elem = elem.offsetParent;
  }
  
  var retValue = new Object();
  retValue.left = left;
  retValue.top = top;
  return retValue;
}

function Move(ctrl, deltaX, deltaY)
{
  var left = ExtractPixelValue(ctrl.style.left);
  var top = ExtractPixelValue(ctrl.style.top);
  ctrl.style.left = left + deltaX + 'px';
  ctrl.style.top = top + deltaY + 'px';
}

function ExtractPixelValue(s)
{
  var suffix = s.length >= 2 ? s.substr(s.length-2, 2) : '';
  if (suffix.toLowerCase() == 'px')
    s = s.substr(0, s.length - 2);
  return parseInt(s);  
}



