var undefined;

function $(e){
  return document.getElementById(e);
}

function _(parent, name, e){
  var collection=parent.getElementsByTagName(name);
  if (e) {
    for(var i=0; collection[i]; i++) {
      if (e == collection[i]) {
        collection.index=i;
      }
    }
  }
  return collection;
}

function create(e, container) {
  container = container||document;
  var attribute = e.match(/(\.|#)*\w+/g);
  var element=container.createElement(attribute[0]);
  for (var i=1, j; attribute[i]; i++) {
    j = attribute[i].substring(1);
    if (/^\./.test(attribute[i])&&!testClass(element,j)) {
      addClass(element,j);
    } else if (/^#/.test(attribute[i])) {
      element.id=j;
    }
  }
  return element;
}

function returnFalse(e){
  return false;
}

function cancelEvent(e) {
  if (e.preventDefault) {
    e.preventDefault();
  } else {
    e.returnValue = false;
  }
}

function stopEvent(e) {
  if (e.stopPropagation) {
    e.stopPropagation();
  } else {
    e.cancelBubble = true;
  }
}

function removeElement(e){
  if (e.parentNode) {
    e.parentNode.removeChild(e);
  }
}

function addHandler(e, event, action, param) {
  if (document.addEventListener) {
    e.addEventListener(event,action,param);
  } else if (document.attachEvent) {
    e.attachEvent('on'+event,action);
  } else {
    e['on' + event] = action;
  }
}

function removeHandler(e, event, action, param) {
  if (document.addEventListener) {
    e.removeEventListener(event, action, param);
  } else if(document.attachEvent) {
    e.detachEvent('on' + event, action);
  } else {
    e['on' + event] = returnFalse;
  }
}

function getStyle(e, styleName) {
  return document.defaultView ? document.defaultView.getComputedStyle(e,null)[styleName] : e.currentStyle[styleName];
}

function addClass(e, name, index) {
  if(e.nodeType == 1){
    if (index) {
      e.className = name;
    } else {
      e.className += ' ' + name;
    }
  }
}

function removeClass(e, name) {
  if (name) {
    name = name.split(' ');
    for (var i=0; name[i]; i++) {
      var sentence = new RegExp('\\s*\\b'+name[i]+'\\b', 'g');
      e.className = e.className.replace(sentence, '');
    }
  } else {
    e.className = '';
  }
}

function testClass(e,name) {
  if (name&&/\w/.test(name)) {
    var sentence=new RegExp('\\b'+name+'\\b');
  } else {
    var sentence = new RegExp('^\\s*$');
  }
  if(e && e.className) {
    return sentence.test(e.className);
  }
}

function findClass(e, name) {
  var nodes_set = [];
  find_child(e, name, nodes_set);
  function find_child(e, name, nodes_set) {
    var child = e.childNodes;
    for (var i=0; child[i]; i++) {
      if (testClass(child[i],name)) {
        nodes_set.push(child[i]);
      }
      if (child[i].childNodes) {
        find_child(child[i], name, nodes_set);
      }
    }
  }
  return nodes_set;
}

function returnParent(e, name) {
  return findElement(e, name, 'parentNode');
}

function returnPrevious(e, name) {
  return findElement(e, name, 'previousSibling');
}

function returnNext(e, name) {
  return findElement(e, name, 'nextSibling');
}

function findElement(e, name, type) {
  var parent = e;
  var param = 'tagName';
  if (/^\#/.test(name)) {
    name = name.replace(/^\#/, '');
    param = 'id';
  }
  else if(/^\./.test(name)){
    name = name.replace(/^\./, '');
    param = 'className';
  }
  else name=name.toUpperCase();
  var check = function(e) {
    switch(param){
      case 'className':
        return !testClass(e, name);
        break;
      default:
        return e[param] != name;
        break;
    }
  }
  while (parent[type]&&check(parent)) {
    parent=parent[type];
  }
  if (!check(parent)) {
    return parent;
  } else {
    return null;
  }
}

function getElementsByClassName(e,node_name,class_name){
  var nodes=e.getElementsByTagName(node_name);
  if(!class_name)return nodes;
  var need_nodes=[];
  for(var i=0;nodes[i];i++)if(testClass(nodes[i],class_name))need_nodes.push(nodes[i]);
  return need_nodes;
}

function bodyWidth() {
  return document.documentElement.offsetWidth || document.body.offsetWidth;
}

function bodyHeight() {
  return document.documentElement.offsetHeight || document.body.offsetHeight;
}

function bodyScrollLeft() {
  return document.documentElement.scrollLeft || document.body.scrollLeft;
}

function bodyScrollTop() {
  return document.documentElement.scrollTop || document.body.scrollTop;
}

function setDimension(e, x, y) {
  setDimensionX(e, x);
  if (y) {
    setDimensionY(e, y);
  }
}

function setDimensionX(e, x) {
  e.style.width = x + 'px';
}

function setDimensionY(e, y) {
  e.style.height = y + 'px';
}

function moveTo(e,left,top) {
  moveToX(e,left);
  if (top) {
    moveToY(e, top);
  }
}

function moveToX(e, left){
  e.left = left;
  e.style.left = left + 'px';
}

function moveToY(e, top) {
  e.top = top;
  e.style.top = top+'px';
}

function getMousePosition(e){
  return { x : e.clientX + bodyScrollLeft(), y : e.clientY + bodyScrollTop() };
}

function offset(e){
  return { x : offsetX(e), y : offsetY(e) };
}

function offsetX(e) {
  e.offsetX = e.offsetLeft;
  var parent = e.offsetParent;
  while (parent) {
    e.offsetX += parent.offsetLeft;
    parent = parent.offsetParent;
  }
  return e.offsetX;
}

function offsetY(e) {
  e.offsetY = e.offsetTop;
  var parent = e.offsetParent;
  while (parent) {
    e.offsetY += parent.offsetTop;
    parent = parent.offsetParent;
  }
  return e.offsetY;
}

if (!Array.prototype.push) {
  Array.prototype.push = function(e) {
    this[this.length] = e;
    return this.length;
  }
  Array.prototype.pop = function(){
    var e = this.slice(this.length - 1);
    this.length = this.length - 1;
    return e;
  }
  Array.prototype.shift = function(){
    this.reverse();
    var e = this.pop();
    this.reverse();
    return e;
  }
  Array.prototype.unshift = function(e){
    this.reverse();
    this.push(e);
    this.reverse();
    return this.length;
  }
  Array.prototype.splice=function(e, index){
    return this.concat(this.slice(0, e), this.slice(e + index));
  }
}

function get_node_text(e){
  if (!e) {
    return '';
  }
  return e.text || e.textContent || (function(e){
    var result = '';
    var childrens = e.childNodes;
    for (var i = 0; childrens[i]; i++) {
      if (childrens[i].nodeValue) {
        result += childrens[i].nodeValue;
      }
    }
    return result;
  }(e));
}

function create_request(){
  var request;
  if (window.XMLHttpRequest) {
    request = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    try {
      request = new ActiveXObject('Msxml2.XMLHTTP');
    } catch(e) {
      try {
        request = new ActiveXObject('Microsoft.XMLHTTP');
      } catch(e) {
        
      }
    }
  }
  return request;
}

function send_request(request,path,action,type){
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      if (request.status == 200) {
        if (action && window[action]) {
          window[action](request.responseText);
        } else {
          return request.responseXML.documentElement;
        }
      }
    }
  }
  request.open(type, path, true);
  request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  //request.send(null);
  request.send('');
}

function changeText(e, a, b, c){
  if (c) {
    e[c] = e[c].replace(a, b);
  } else {
    e=e.replace(a, b);
  }
}
