function x$(id) {  // the x is for extreme
  var to = new ToolsObject()
  return to.x$(id);
}

function ToolsObject() { 
  this.type = '';
  this.targetElem = false;
  this.elemArray = false;
  this.x$ = function(id) {
    if(typeof(id)=='string') {
      this.targetElem=document.getElementById(id);
      // if (!this.targetElem) alert('Cannot find element ' + id);
    } else if(typeof(id)=='object') {
      this.targetElem=id;
    }
    return this;
  };
  this.children = function(nodeName) {
    nodeName = nodeName.toUpperCase();
    var c = this.targetElem.childNodes;
    this.elemArray = [];
    for(var i in c) {
      if(c[i].nodeName == nodeName) {
        this.elemArray.push(c[i]);
      }
    }
    return this;
  };
  this.byClassName = function(c) {
    
    if(this.elemArray) {
      var searchElems = [];
      for(var i=0;i<this.elemArray.length;i++) {
        var elms = (this.elemArray[i].all) ? this.elemArray[i].all : this.elemArray[i].getElementsByTagName('*');
        for (var ei=0;i<elms.length;i++) {
          searchElems.push(elms[ei]);
        }
      }
    } else if(this.targetElem) {
      var searchElems = (this.targetElem.all) ? this.targetElem.all : this.targetElem.getElementsByTagName('*');
    }
    
    this.elemArray = [];
    var regexPat = new RegExp("(^|\\s)" + c + "(\\s|$)");
    for(var i = 0; i < searchElems.length; i++) {
      if (!regexPat.test(searchElems[i].className))
        continue;
      
      this.elemArray.push(searchElems[i]);
    }
    
    return this;
  }
  this._apply = function(fnt,data) {
    if(this.elemArray) {
      for(var i=0;i<this.elemArray.length;i++) {
        fnt(this.elemArray[i],data);
      }
    } else if(this.targetElem) {
      fnt(this.targetElem,data);
    } 
  }
  this.observe = function(event,fnt) {
    this._apply(this._eEvent,{event:event,fnt:fnt});
  };
  this.hide = function() {
    this._apply(this._eDisplay,false);
    return this;
  }
  this.show = function(show) {
    this._apply(this._eDisplay,true);
    return this;
  }
  this.toggle = function(elem) {
    this._apply(this._eToggle);
    return this;
  }
  this._eToggle = function(elem) {
    elem.style.display=elem.style.display=='none'?'':'none'; 
  }
  this._eDisplay = function(elem, show) {
    elem.style.display=show?'':'none'; 
  }
  this._eEvent = function(elem, data) {
    switch(data.event) {
      case 'click':
        elem.onclick = data.fnt;
        break; 
      case 'mouseover':
        elem.onmouseover = data.fnt;
        break;
    }    
  }
  this.focus = function() {
    if (this.elemArray) {
      this.elemArray[0].focus();
    } else if (this.targetElem) {
      this.targetElem.focus();
    }
    
    return this;
  }
  this.value = function() {
    if (this.elemArray) {
      var values = [];
      for (i = 0; i < this.elemArray.length; i++) {
        values.push(this._value(this.elemArray[i]));
      }
      return values;
    } else if (this.targetElem) {
      return this._value(this.targetElem);
    }
  }
  this._value = function(elem) {
    if (elem.type == 'radio' || elem.type == 'checkbox') {
      return elem.checked;
    }
    
    return elem.value;
  }
  this.exists = function() {
    return this.elemArray || this.targetElem ? true : false;
  }
}
