function $() {
  var elements = new Array();

  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);

    if (arguments.length == 1) 
      return element;

    elements.push(element);
  }

  return elements;
}

/**
 * Ajax constructor
 */
function Ajax() { }

/* public const variables */
Ajax.prototype.ERROR_FAIL = 1;

/* public variables */
Ajax.prototype.timeout = 5000; // timeout in msec, default = 5 seconds

/* private variables */
Ajax.prototype.success_codes = new Array(200, 201, 202, 203, 204, 205, 206);

/* public static XMLHttpRequest */ Ajax.prototype.getRequestObject = function() {
  if (window.XMLHttpRequest) {
    requestObject = new XMLHttpRequest();
    if (requestObject.overrideMimeType)
      requestObject.overrideMimeType('text/plain');
  } else {
    requestObject = new ActiveXObject("Microsoft.XMLHTTP");
  }

  return requestObject;
}

/* private void */ Ajax.prototype.defaultErrorFunction = function(code) { alert('ajax error: ' + code); }

/* private function() */ Ajax.prototype.dispatchResult = function(requestObject, success, failure) {
  return function() { 
    if (requestObject.readyState < 4) return;
    var status = requestObject.status;
    if (requestObject.readyState == 4 && status >= 200 && status <= 206) { success(requestObject.responseText); return; }
    failure(status); return;
  }
}

/* public string */ Ajax.prototype.getSyncHttpRequest = function(url) {
  requestObject = this.getRequestObject();
  requestObject.open("GET", url, false);
  requestObject.send(null);
      
  return requestObject.responseText;
}

/* public string */ Ajax.prototype.postSyncHttpRequest = function(url, params) {
  requestObject = this.getRequestObject();
  requestObject.open("POST", url, false);
  requestObject.setRequestHeader("Content-length", params.length);
  requestObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  requestObject.send(params);
      
  return requestObject.responseText;
}

/* public void */ Ajax.prototype.getAsyncHttpRequest = function(url, success_callback, error_callback) {
  requestObject = this.getRequestObject();
  if (arguments.length < 3)
    error_callback = this.defaultErrorFunction;
  if (arguments.length < 2) {
    alert("Ajax.getAsyncHttpRequest() expected at least 2 arguments");
    return;
  }
    
  requestObject.onreadystatechange = this.dispatchResult(requestObject, success_callback, error_callback);
  requestObject.open("GET", url, true);
  requestObject.send(null);
}

/* public void */ Ajax.prototype.postAsyncHttpRequest = function(url, params, success_callback, error_callback) {
  requestObject = this.getRequestObject();
  if (arguments.length < 4)
    error_callback = this.defaultErrorFunction;
  if (arguments.length < 3) {
    alert("Ajax.postAsyncHttpRequest() expected at least 3 arguments");
    return;
  } 

  requestObject = this.getRequestObject();
  requestObject.onReadyStateChange = this.dispatchResult(requestObject, success_callback, error_callback);
  requestObject.open("POST", url, true);
  requestObject.setRequestHeader("Content-length", params.length);
  requestObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  requestObject.send(params);
}