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 (typeof element.offsetWidth != "undefined" && typeof element.offsetHeight != "undefined")
 {
  w = element.offsetWidth;
  h = element.offsetHeight;
 }
 else if (element.clip && typeof element.clip.width != "undefined" && typeof element.clip.height != "undefined")
 {
  w = element.clip.width;
  h = element.clip.height;
 }
 else if (element.style && typeof element.style.pixelWidth != "undefined" && typeof element.style.pixelHeight != "undefined")
 {
  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 (typeof self.innerWidth != "undefined" && typeof self.innerHeight != "undefined")
 {
  w = self.innerWidth;
  h = self.innerHeight;
 }
 else if (document.documentElement && typeof document.documentElement.clientWidth != "undefined" && typeof document.documentElement.clientHeight != "undefined")
 {
  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 (typeof parent.clientWidth != "undefined" && typeof parent.clientHeight != "undefined")
  {
   w = parent.clientWidth;
   h = parent.clientHeight;
  }
  else if (typeof parent.offsetWidth != "undefined" && typeof parent.offsetHeight != "undefined")
  {
   w = parent.offsetWidth;
   h = parent.offsetHeight;
  }
  return {w: w, h: h};
 }
 else return get_window_size();
}

function get_scrolling(element)
{
 var x = 0, y = 0;
 if (element && typeof element.scrollLeft != "undefined" && typeof element.scrollTop != "undefined")
 {
  x = element.scrollLeft;
  y = element.scrollTop;
 }
 else if (typeof self.pageXOffset != "undefined" && typeof self.pageYOffset != "undefined")
 {
  x = self.pageXOffset;
  y = self.pageYOffset;
 }
 else if (document.documentElement && typeof document.documentElement.scrollLeft != "undefined" && typeof document.documentElement.scrollTop != "undefined")
 {
  x = document.documentElement.scrollLeft;
  y = document.documentElement.scrollTop;
 }
 else if (document.body && typeof document.body.scrollLeft != "undefined" && typeof document.body.scrollTop != "undefined")
 {
  x = document.body.scrollLeft;
  y = document.body.scrollTop;
 }
 return {x: x, y: y};
}

function has_class(element, class_name)
{
 return element.className && (element.className == class_name || (new RegExp("(^|\\s)" + class_name + "(\\s|$)")).test(element.className));
}

function add_class(element, class_name)
{
 if (element.className)
 {
  if (!(new RegExp("(^|\\s)" + class_name + "(\\s|$)")).test(element.className))
   element.className += " " + class_name;
 }
 else element.className = class_name;
 return false;
}

function remove_class(element, class_name)
{
 if (element.className)
 {
  if (element.className == class_name)
   element.className = ""; else
  if ((new RegExp("(^|\\s)" + class_name + "(\\s|$)")).test(element.className))
  {
   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(" ");
  }
 }
 return false;
}

function replace_class(element, class_name1, class_name2)
{
 remove_class(element, class_name1);
 add_class(element, class_name2); 
 return false;
}

function get_event_target(e)
{
 if (browser.msie) e = window.event;
 var element = browser.msie ? e.srcElement : e.target;
 while (element && element.nodeType != 1)
  element = element.parentNode;
 return element;
}

function get_real_event_target(e)
{
 var element;
 if (browser.msie)
 {
  e = window.event;
  element = e.fromElement == e.toElement.parentNode ? e.fromElement : e.toElement;
 }
 else element = e.relatedTarget;
 while (element && element.nodeType != 1)
  element = element.parentNode;
 return element;
}

function get_event_position(e)
{
 if (browser.msie) e = window.event;
 return browser.msie ? {x: e.clientX + document.body.scrollLeft, y: e.clientY + document.body.scrollTop} : {x: e.pageX, y: e.pageY};
}

function stop_event(e)
{
 if (browser.msie)
 {
  e = window.event;
  e.cancelBubble = true;
  e.returnValue = false;
 }
 else
 {
  e.preventDefault();
  e.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;
}

function create_event(element, event_name)
{
 if (browser.msie)
 {
  var e = document.createEventObject();
  return element.fireEvent("on" + event_name, e);
 }
 else
 {
  var e = document.createEvent("HTMLEvents");
  e.initEvent(event_name, true, true);
  return !element.dispatchEvent(e);
 }
}
