function addEvent(element, eventType, handler) {
	if (element.addEventListener) {
		element.addEventListener(eventType, handler, false);
  }
	else if (element.attachEvent) {
		element.attachEvent('on' + eventType, handler);
  }
}

function ucfirst(str) {
  return str.charAt(0).toUpperCase() + str.substr(1);
}

document.getElementsByClassName = function(className) {
  var elements = new Array ();
  var children = document.getElementsByTagName("*");
  for (var a = 0; a < children.length; a++) {
    if (hasClass(children[a], className)) elements.push (children[a]);
  }
  return elements;
}

function hasClass(el, className) {
  return ( 
    el.className && 
    el.className.match(new RegExp("\\b" + className + "\\b")) 
  ) ? true : false;
}

function addClass(el, className) {
  if (!hasClass(el, className)) {
    if (el.className && el.className.length > 0) {
      className = el.className + " " + className;
    }
    el.className = className;
  }
}

function removeClass(el, className) {
  if (hasClass(el, className)) {
    el.className = el.className.replace ( 
      new RegExp("\\b" + className + "\\b"), "" 
    );
  }
}

function toggleClass(el, className) {
  if (hasClass(el, className)) {
    return removeClass(el, className);
  }
  else {
    return addClass(el, className);
  }
}

function removeNode(node) {
  if (typeof node == 'string') {
    node = $(node);
  }
  if (node && node.parentNode) {
    return node.parentNode.removeChild(node);
  }
  else {
    return false;
  }
}

function createNode(type, options) {
  var el = document.createElement(type);
  for (var key in options) {
    el.setAttribute(key, options[key]);
  }
	return el;
}

function insertAfter(node, newnode) {
  if (node.nextSibling) {
        node.parentNode.insertBefore(newnode, node.nextSibling);
  }
  else {
    node.parentNode.appendChild(newnode);
  }
}

function is_all_ws(nod) {
  return !(/[^\t\n\r ]/.test(nod.data));
}

function is_ignorable(nod) {
  return (nod.nodeType == 8) || ((nod.nodeType == 3) && is_all_ws(nod));
}

function node_before(sib) {
  while ((sib = sib.previousSibling)) {
    if (!is_ignorable(sib)) return sib;
  }
  return null;
}

function node_after(sib) {
  while ((sib = sib.nextSibling)) {
    if (!is_ignorable(sib)) return sib;
  }
  return null;
}
