var undefined;

function returnFalse(e){
  return false;
}

function addHandler(element,event,action,param){
  if(document.addEventListener)element.addEventListener(event,action,param);
  else if(document.attachEvent)element.attachEvent('on'+event,action);
  else element['on'+event]=action;
}

function removeHandler(element,event,action,param){
  if(document.addEventListener)element.removeEventListener(event,action,param);
  else if(document.attachEvent)element.detachEvent('on'+event,action);
  else element['on'+event]=returnFalse;
}

function setDimension(element,e,textarea){
  element.style.width=(element.width+(e.clientX-element.resizeX))+'px';
  element.style.height=(element.height+(e.clientY-element.resizeY))+'px';
  if(textarea)textarea.style.height=(textarea.height+(e.clientY-element.resizeY))+'px';
}

function findPosition(element,e){
  var parent=element;
  var left=0,top=0;
  do{
    left+=parent.offsetLeft;
    top+=parent.offsetTop;
    parent=parent.offsetParent;
  }
  while(parent);
  element.left=left;
  element.top=top;
  if(e){
    e=e||event;
    element.deltaX=e.clientX-left;
    element.deltaY=e.clientY-top;
    element.bodyLeft=left-bodyScrollLeft();
    element.bodyTop=top-bodyScrollTop();
  }
}

function bodyWidth(){
  var body=document.body,documentElement=document.documentElement;
  return Math.min(body.offsetWidth,documentElement.offsetWidth);
}

function bodyHeight(){
  var body=document.body,documentElement=document.documentElement;
  return Math.min(body.offsetHeight,documentElement.offsetHeight);
}

function bodyScrollLeft(){
  var body=document.body,documentElement=document.documentElement;
  return Math.max(body.scrollLeft,documentElement.scrollLeft);
}

function bodyScrollTop(){
  var body=document.body,documentElement=document.documentElement;
  return Math.max(body.scrollTop,documentElement.scrollTop);
}

function addClass(element,name){
  element.className+=' '+name;
}

function removeClass(element,name){
  var sentence=new RegExp('\\s*\\b'+name+'\\b','g');
  element.className=element.className.replace(sentence,'');
}

function testClass(element,name){
  var sentence=new RegExp('\\b'+name+'\\b');
  return sentence.test(element.className);
}

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(element){
  if(element.parentNode)element.parentNode.removeChild(element);
}

function moveTo(element,left,top){
  element.style.left=left+'px';
  element.style.top=top+'px';
}

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));
  }
}