String.prototype.in_ = function(haystack) {
  return haystack.indexOf(String(this)) > -1;
}
String.prototype.strip = function() {
  return this.lstrip().rstrip();
}
String.prototype.lstrip = function() {
  return this.replace(/^\s\s*/, '');
}
String.prototype.rstrip = function() {
  return this.replace(/\s\s*$/, '');
}
function getElementsByClassName(className, tag, elm){
  var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
  var tag = tag || "*";
  var elm = elm || document;
  var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
  var returnElements = [];
  var current;
  var length = elements.length;
  for(var i=0; i<length; i++){
    current = elements[i];
    if(testClass.test(current.className)){
      returnElements.push(current);
    }	
  }
  return returnElements;
}
function addEvent( obj, type, fn ) {
  if ( obj.attachEvent ) {
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
    obj.attachEvent( 'on'+type, obj[type+fn] );
  } else
    obj.addEventListener( type, fn, false );
}
function getEventTarget(e) {
	var targ;
	if (!e) var e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	return targ;
}
function hasClass(el, className) {
  if (!el || el.nodeType !== 1 || !className)
  {
    return false;
  }
  return className.in_(el.className);
}
function addClass(el, className) {
  if (!hasClass(el, className))
  {
    el.className += ' ' + className;
    el.className = el.className.strip();
  }
}
function removeClass(el, className) {
  if (hasClass(el, className))
  {
    var classes = el.className.split(' ');
    el.className = '';
    for (var i=0, len=classes.length; i < len; i++) 
    {
      var clas = classes[i];
      if (clas !== className)
      {
        el.className += clas + ' ';
      }
    }
    el.className = el.className.strip();
  }
}
function toggleClass(el, className) {
  if (hasClass(el, className))
  {
    removeClass(el, className);
  }
  else
  {
    addClass(el, className);
  }
}
function preventDefault(e) {
  e = e.browserEvent || e;
  if(e.preventDefault){
      e.preventDefault();
  }else{
      e.returnValue = false;
  }
}

function next(el, tagName) {
  var result;
  var nextEl = el.nextSibling;
  while (nextEl)
  {
    if (nextEl.tagName === tagName)
    {
      result = nextEl;
      break;
    }
    nextEl = nextEl.nextSibling;
  }
  return result;
}

function parent(el, tagName) {
  var result;
  var parentEl = el.parentNode;
  while (parentEl)
  {
    if (parentEl.tagName === tagName)
    {
      result = parentEl;
      break;
    }
    parentEl = parentEl.parentNode;
  }
  return result;
}

function getLocationParams() {
  var params = location.search.slice(1).split('&');
  var result = {};
  for (var i=0, len=params.length; i < len; i++) 
  {
    var param = params[i];
    var pair = param.split('=');
    result[pair[0]] = pair[1];
  }
  return result;
}
