function getViewportWidth()
{
  var viewportwidth;
  
  // the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight
  
  if (typeof window.innerWidth != 'undefined')
  {
    viewportwidth = window.innerWidth;
  }
  
  // IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
  
  else if (typeof document.documentElement != 'undefined'
   && typeof document.documentElement.clientWidth !=
   'undefined' && document.documentElement.clientWidth != 0)
  {
     viewportwidth = document.documentElement.clientWidth;
  }
  
  // older versions of IE
  
  else
  {
    viewportwidth = document.getElementsByTagName('body')[0].clientWidth;
  }
  return viewportwidth;
}

function getViewportHeight()
{
  var viewportheight;
  
  // the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight
  
  if (typeof window.innerWidth != 'undefined')
  {
    viewportheight = window.innerHeight;
  }
  
  // IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
  
  else if (typeof document.documentElement != 'undefined'
   && typeof document.documentElement.clientWidth !=
   'undefined' && document.documentElement.clientWidth != 0)
  {
     viewportheight = document.documentElement.clientHeight;
  }
  
  // older versions of IE
  
  else
  {
    viewportheight = document.getElementsByTagName('body')[0].clientHeight;
  }
  return viewportheight;
}

function sleep(n)
{
  var now = new Date();
  var et = now.getTime() + n;
  while (true)
  {
    now = new Date();
    if (now.getTime() > et)
    {
      return;
    }
  }
}


// toHex adapted from http://snipplr.com/view/139/base-conversion/
function toHex(dec)
{
  var base = "0123456789abcdef";
  var len=base.length;
  var ret='';
  while(dec > 0)
  {
    ret = base.charAt(dec%len) + ret;
    dec = Math.floor(dec/len);
  }
  return ret;
}
