  // etc

  function getXMLHttpRequest() {
    var xmlHttpRequest = null;

    try {
      xmlHttpRequest = new XMLHttpRequest(); // Firefox, Opera 8.0+, Safari
    } catch (e) {
      try {
        xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer
      } catch (e) {
        try {
          xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP"); // Internet Explorer
        } catch (e) {
          xmlHttpRequest = null
        }
      }
    }

    return xmlHttpRequest;
  }


  //-------------------------------------------------------------------------

  function registerEvent(element, event, callback) {
    var onEvent = "on" + event;
    if (element.addEventListener) {
      element.addEventListener(event, callback, false);
    } else {
      if (element.attachEvent) {
        element.attachEvent(onEvent, callback);
      } else {
        var f = element[onEvent];
        element[onEvent] = function() {
          var g = f.apply(this, arguments);
          var k = callback.apply(this, arguments);
          return g == undefined ? k : (k == undefined ? g : k && g)
        }
      }
    }
  }

  //-------------------------------------------------------------------------

  function elementsForName(name) {
    var retElements = new Array();
    var elements = document.getElementsByTagName("*");
    if (elements != null && elements.length > 0) {
      for ( var i = 0; i < elements.length; i++) {
        if (elements[i].name == name) {
          retElements.push(elements[i]);
        }
      }
    }
    return retElements;
  }

  //-------------------------------------------------------------------------

  function evalPosition(element, direction) {
    var posi = 0;
    while (element) {
      posi += element[direction];
      element = element.offsetParent
    }
    return posi
  }

  //-------------------------------------------------------------------------

  function Position(x, y) {
    this.x = (!x) ? 0 : x;
    this.y = (!y) ? 0 : y;

    this.toString = function() {
      return "( x=" + this.x + ", y=" + this.y + ")";
    }
  }

  //-------------------------------------------------------------------------

  function Bounds(x, y, w, h) {
    this.x = (!x) ? 0 : x;
    this.y = (!y) ? 0 : y;
    this.w = (!w) ? 0 : w;
    this.h = (!h) ? 0 : h;

    this.toString = function() {
      return "( x=" + this.x + ", y=" + this.y + ", w=" + this.w + ", h="
          + this.h + ")";
    }
  }

  //-------------------------------------------------------------------------

  function PreviewImage(src, width, height, showMagni) {
    this.src = (!src) ? '' : src;
    this.width = (!width) ? 0 : width;
    this.height = (!height) ? 0 : height;
    this.showMagni = (!showMagni) ? 0 : showMagni;

    this.toString = function() {
      return "( src=" + this.src + ",  width=" + this.width + ", height="
          + this.height + ", showMagni=" + this.showMagni + ")";
    }
  }

  //-------------------------------------------------------------------------

  function findPosition(element) {
    return new Position(evalPosition(element, "offsetLeft"), evalPosition(
        element, "offsetTop"));
  }

  //-------------------------------------------------------------------------

  function findBounds(element) {
    var position = findPosition(element);

    return new Bounds(position.x, position.y, element.offsetWidth,
        element.offsetHeight);
  }

  //-------------------------------------------------------------------------

  function getMouseXY(evt) {
    var position = new Position();

    if (evt && evt.pageX) {
      position.x = evt.pageX;
      position.y = evt.pageY;
    } else {
      if (window.event && window.event.clientX) {
        var isStrictMode = document.compatMode
            && document.compatMode != 'BackCompat' ? true : false;

        var scrollX = isStrictMode ? document.documentElement.scrollLeft
            : document.body.scrollLeft;
        var scrollY = isStrictMode ? document.documentElement.scrollTop
            : document.body.scrollTop;

        position.x = window.event.clientX + scrollX - 2;
        position.y = window.event.clientY + scrollY - 2;
      }
    }

    return position;
  }
