(function(){

if(!window.ADS) { window['ADS'] = {} }

function isCompatible(other) {
  if (other === false
      || !Array.prototype.push
      || !Object.hasOwnProperty
      || !document.createElement
      || !document.getElementsByTagName
     ) {
        return false;
  }

  return true;
}
window['ADS']['isCompatible'] = isCompatible;

function $() {
  var elements = new Array(),
      element, al;

  al = arguments.length;

  for (var i=0; i<al; i++) {
    element = arguments[i];

    if (typeof element == 'string') {
      element = document.getElementById(element);
    }

    if (al == 1) {
      return element;
    }

    elements.push(element);
  }

  return elements;
}
window['ADS']['$'] = $;

function addEvent(node, type, listener) {
  if (!isCompatible) { return false; }
  if (!(node = $(node))) { return false; }

  if (node.addEventListener) {
      node.addEventListener( type, listener, false );
      return true;
  } else if (node.attachEvent) { //msie
      node['e'+type+listener] = listener;
      node[type+listener] = function() {
        node['e'+type+listener](window.event);
      }
      node.attachEvent( 'on'+type, node[type+listener] );
      return true;
  }

  return false;
}
window['ADS']['addEvent'] = addEvent;

function walkElementsLinear(func, node) {
    var root = node || window.document;
    var nodes = root.getElementsByTagName("*");
    for(var i = 0 ; i < nodes.length ; i++) {
        func.call(nodes[i]);
    }
};
window['ADS']['walkElementsLinear'] = walkElementsLinear;

function getElementsByClassName(className, tag, parent){
    parent = parent || document;
    if(!(parent = $(parent))) return false;

    var allTags = (tag == "*" && parent.all) ? parent.all : parent.getElementsByTagName(tag);
    var matchingElements = new Array();

    className = className.replace(/\-/g, "\\-");
    var regex = new RegExp("(^|\\s)" + className + "(\\s|$)");

    var element;
    for(var i=0; i<allTags.length; i++){
        element = allTags[i];
        if(regex.test(element.className)){
            matchingElements.push(element);
        }
    }

    return matchingElements;
};
window['ADS']['getElementsByClassName'] = getElementsByClassName;

function getClassNames(element) {
    if(!(element = $(element))) return false;
    return element.className.replace(/\s+/,' ').split(' ');
};
window['ADS']['getClassNames'] = getClassNames;

function hasClassName(element, className) {
  if(!(element = $(element))) return false;
  var classes = getClassNames(element);

  for (var i = 0; i < classes.length; i++) {
      if (classes[i] === className) { return true; }
  }
  return false;
};
window['ADS']['hasClassName'] = hasClassName;

function addClassName(element, className) {
  if(!(element = $(element))) return false;
  element.className += (element.className ? ' ' : '') + className;
  return true;
};
window['ADS']['addClassName'] = addClassName;

function removeClassName(element, className) {
    if(!(element = $(element))) return false;
    var classes = getClassNames(element);
    var length = classes.length

    for (var i = length-1; i >= 0; i--) {
        if (classes[i] === className) { delete(classes[i]); }
    }
    element.className = classes.join(' ');
    return (length == classes.length ? false : true);
};
window['ADS']['removeClassName'] = removeClassName;

})();
