var browser = {
 msie: /MSIE/i.test(navigator.userAgent) && !/Opera/i.test(navigator.userAgent),
 opera: /Opera/i.test(navigator.userAgent),
 khtml: /Konqueror|Safari|KHTML/i.test(navigator.userAgent)
}

function create_element(type, container)
{
 var element = null;
 if (document.createElementNS)
  element = document.createElementNS("http://www.w3.org/1999/xhtml", type);
 else
  element = document.createElement(type);
 if (typeof container != "undefined")
  container.appendChild(element);
 return element;
};

function create_elements(elements, container)
{
 var element;
 for (var i in elements)
 {
  element = create_element(elements[i].type, container);
  if (elements[i].content)
   element.innerHTML = elements[i].content;
  if (elements[i].attributes)
   for (var j in elements[i].attributes)
    element.setAttribute(j, elements[i].attributes[j]);
  if (elements[i].style)
   for (var j in elements[i].style)
    element.style[j] = elements[i].style[j];
  if (elements[i].events)
   for (var j in elements[i].events)
    add_event(element, j, elements[i].events[j]);
  if (elements[i].childnodes)
   create_elements(elements[i].childnodes, element);
 }
 return element;
}

function get_absolute_position(element)
{
 var sl = 0, st = 0;
 var div = element.tagName == "DIV";
 if (div && element.scrollLeft) sl = element.scrollLeft;
 if (div && element.scrollTop) st = element.scrollTop;
 var r = { x: element.offsetLeft - sl, y: element.offsetTop - st };
 if (element.offsetParent)
 {
  var t = get_absolute_position(element.offsetParent);
  r.x += t.x;
  r.y += t.y;
 }
 return r;
};

function set_absolute_position(element, x, y)
{
 if (element.style.position != "absolute")
  element.style.position = "absolute";
 element.style.left = x + "px";
 element.style.top = y + "px";
}

function get_size(element)
{
 var w = 0, h = 0;
 if (element.offsetWidth)
 {
  w = element.offsetWidth;
  h = element.offsetHeight;
 }
 else if (element.clip && element.clip.width)
 {
  w = element.clip.width;
  h = element.clip.height;
 }
 else if (element.style && element.style.pixelWidth)
 {
  w = element.style.pixelWidth;
  h = element.style.pixelHeight;
 }
 return {w: parseInt(w), h: parseInt(h)};
}

function get_window_size()
{
 var w = 0, h = 0;
 if (self.innerHeight)
 {
  w = self.innerWidth;
  h = self.innerHeight;
 }
 else if (document.documentElement && document.documentElement.clientHeight)
 {
  w = document.documentElement.clientWidth;
  h = document.documentElement.clientHeight;
 }
 else if (document.body)
 {
  w = document.body.clientWidth;
  h = document.body.clientHeight;
 }
 return {w: w, h: h};
}

function get_parent_size(element)
{
 var parent = element.parentNode;
 var w = 0, h = 0;
 if (parent.tagName != "BODY")
 {
  if (parent.clientHeight)
  {
   w = parent.clientWidth;
   h = parent.clientHeight;
  }
  else if (parent.offsetHeight)
  {
   w = parent.offsetWidth;
   h = parent.offsetHeight;
  }
  return {w: w, h: h};
 }
 else return get_window_size();
}

function get_scrolling(element)
{
 var parent = element.parentNode;
 var x = 0, y = 0;
 if (parent.tagName != "BODY" && parent.scrollTop)
 {
  x = parent.scrollLeft;
  y = parent.scrollTop;
 }
 else if (self.pageYOffset)
 {
  x = self.pageXOffset;
  y = self.pageYOffset;
 }
 else if (document.documentElement && document.documentElement.scrollTop)
 {
  x = document.documentElement.scrollLeft;
  y = document.documentElement.scrollTop;
 }
 else if (document.body)
 {
  x = document.body.scrollLeft;
  y = document.body.scrollTop;
 }
 return {x: x, y: y};
}

function add_class(element, class_name)
{
 remove_class(element, class_name);
 el.className += " " + class_name;
};

function remove_class(element, class_name)
{
 var c = element.className.split(" ");
 for (var i = 0; i < c.length; i++)
  if (c[i] == class_name) c.splice(i, 1);
 element.className = c.join(" ");
};

function get_event_target(ev)
{
 var element = browser.msie ? window.event.srcElement : ev.target;
 while (element && element.nodeType != 1)
  element = element.parentNode;
 return element;
};

function get_event_position(ev)
{
 return browser.msie ? {x: window.event.clientX + document.body.scrollLeft, y: window.event.clientY + document.body.scrollTop} : {x: ev.pageX, y: ev.pageY};
}

function stop_event(ev)
{
 if (!ev) ev = window.event;
 if (browser.msie)
 {
  ev.cancelBubble = true;
  ev.returnValue = false;
 }
 else
 {
  ev.preventDefault();
  ev.stopPropagation();
 }
 return false;
};

function add_event(element, event_name, func)
{
 if (element.attachEvent)
  element.attachEvent("on" + event_name, func);
 else if (element.addEventListener)
  element.addEventListener(event_name, func, true);
 else
  element["on" + event_name] = func;
};

function remove_event(element, event_name, func)
{
 if (element.detachEvent)
  element.detachEvent("on" + event_name, func);
 else if (element.removeEventListener)
  element.removeEventListener(event_name, func, true);
 else
  element["on" + event_name] = null;
};