function scrollToId( id) {
  if( document.all) {
    return false;
  }
  var elem = document.getElementById( id);
  if( id == 'top') {
    scroll( 0, 400);//, 0 Stopposition
    return true;
  } else
  if( elem) {
    //alert( elem.offsetLeft + ', ' + elem.offsetTop);
    scroll( elem.offsetLeft, elem.offsetTop);
    return true;
  } else {
    alert( 'Could not find an element with id="' + id + '"');
    return false;
  }
}

function scroll( pX, pY, facX, facY) {
  //if( ! confirm( pX + ', ' + pY)) { return; }
  var spd = 50;
  //
  var curX = getPageXOffset( );
  var curY = getPageYOffset( );
  //if( ! confirm( curX + ', ' + curY)) { return; }
  //
  var sX = Math.abs( Math.max( pX, curX) - Math.min( pX, curX));
  var sY = Math.abs( Math.max( pY, curY) - Math.min( pY, curY));
  //if( ! confirm( sX + ', ' + sY)) { return; }
  //
  if( ! facX && facX == undefined) {
    facX = Math.abs( sX / sY);
  }
  if( ! facY && facY == undefined) {
    facY = Math.abs( sY / sX);
  }
  //if( ! confirm( facX + ', ' + facY)) { return; }
  //
  var spdX = spd;
  var spdY = spd;
  //var spdX = Math.round( facX * spd);
  //var spdY = Math.round( facY * spd);
  //var spdX = Math.round( facX * spd);
  //var spdY = Math.round( facY * spd);
  //var spdX = Math.round( (sX * spd) / sY);
  //var spdY = Math.round( (sY * spd) / sX);
  //if( ! confirm( spdX + ', ' + spdY)) { return; }
  // Y
  if( curY != pY) {
    var dY = (curY > pY ? -1 : 1);
    spdY = spdY * dY;
    if( Math.abs( Math.max( pY, curY) - Math.min( pY, curY)) < Math.abs( spdY)) {
      spdY = Math.abs( Math.max( pY, curY) - Math.min( pY, curY)) * dY;
    }
    window.scrollBy( 0, spdY);
    if( getPageYOffset( ) == curY) {
      pY = curY;
    }
  }
  // X
  if( curX != pX) {
    var dX = (curX > pX ? -1 : 1);
    spdX = spdX * dX;
    if( Math.abs( Math.max( pX, curX) - Math.min( pX, curX)) < Math.abs( spdX)) {
      spdX = Math.abs( Math.max( pX, curX) - Math.min( pX, curX)) * dX;
    }
    window.scrollBy( spdX, 0);
    if( getPageXOffset( ) == curX) {
      pX = curX;
    }
  }
  // recurse
  if( getPageXOffset( ) != pX || getPageYOffset( ) != pY) {
    setTimeout( 'scroll( ' + pX + ', ' + pY + ', ' + facX + ', ' + facY + ');', 1);
  }
  return;
}

function getPageXOffset( ) {
  var x = parseInt( document.body.scrollLeft ? document.body.scrollLeft : window.pageXOffset);
  return x ? x : 0;
}

function getPageYOffset( ) {
  var y = parseInt( document.body.scrollTop ? document.body.scrollTop : window.pageYOffset);
  return y ? y : 0;
}

function getInnerWidth( ) {
  return window.innerWidth;
}

function getInnerHeight( ) {
  return window.innerHeight;
}

function jump( pX, pY) {
  window.scrollTo( pX, pY);
}

function debug( elem) {
  var res = '';
  for( var key in elem) {
    res += '\n' + key;
  }
  alert( res);
}
