function encodeUtf8(string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    }

function storeText(text)
{ 
    var xhr; 
    document.getElementById('status').innerHTML = "<img src=\"loader.gif\" width=\"10\"/>";
    document.getElementById('status').style.visibility = "visible";
    try {  xhr = new ActiveXObject('Msxml2.XMLHTTP');   }
    catch (e) 
    {
        try {   xhr = new ActiveXObject('Microsoft.XMLHTTP');    }
        catch (e2) 
        {
          try {  xhr = new XMLHttpRequest();     }
          catch (e3) {  xhr = false;   }
        }
     }
  
    xhr.onreadystatechange  = function()
    { 
         if(xhr.readyState  == 4)
         {
              if(xhr.status  == 200) {
                  document.getElementById('status').innerHTML = "SAVED";                                 
              }
              else 
                  document.getElementById('current').innerHTML = "Error code " + xhr.status;
         } 
    }; 

   xhr.open('GET', 'keypress.php?key=' + escape(encodeUtf8(text)),  true); 
   xhr.send(null); 
}


function getWindowSizes() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return [myWidth, myHeight];
}


function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}


function findPosX(obj)
  {
    var curleft = 0;
    if(obj.offsetParent)
        while(1) 
        {
          curleft += obj.offsetLeft;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.x)
        curleft += obj.x;
    return curleft;
  }

  function findPosY(obj)
  {
    var curtop = 0;
    if(obj.offsetParent)
        while(1)
        {
          curtop += obj.offsetTop;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
  }


var desiredY;
var currentY;
var desiredX;
var currentX;
var intervalId;
var scrollTarget;
var desiredOpacity = 1.0;
var currentOpacity;
var lastStored = "";
var z=1;

function getText(curDiv) {
    var text = curDiv.innerHTML;
    if ( text.indexOf("<img") != -1 ) {
        text = text.substring(0, text.indexOf("<img"));
    } else if ( text.indexOf("<IMG") != -1 ) {
        text = text.substring(0, text.indexOf("<IMG"));
    }
    return text;
} 

function store() {
    var text = getText(scrollTarget);
    if ( text != lastStored ) {  
        lastStored = text;  
        storeText(text);
    }
}

function isScrollDone() {
    return desiredY == currentY && desiredX == currentX;
}

function isOpacityDone() {
    return currentOpacity >= desiredOpacity;
}

function getSpeedY() {
    if ( Math.abs( currentY - desiredY ) > 50 ) {
         return 30;
    }
    return 1;
}

function getSpeedX() {
    if ( Math.abs( currentX - desiredX ) > 50 ) {
         return 30;
    }
    return 1;
}



function scroll() {
    var speedy = getSpeedY();
    var speedx = getSpeedX();
    
    if ( !isScrollDone() ) {

       if ( desiredY < currentY ) {
           currentY = currentY - speedy;
       } 

       if ( desiredY > currentY ) {
           currentY = currentY + speedy;
       }

       if ( desiredX < currentX ) {
           currentX = currentX - speedx;
       } 

       if ( desiredX > currentX ) {
           currentX = currentX + speedx;
       } 

       window.scrollTo(currentX, currentY);
    } else {
       if ( !isOpacityDone() ) {
          currentOpacity += 0.05;
          curDiv.style.opacity = currentOpacity;
       } else {           
           clearInterval( intervalId );
       }
    }
}

function smoothScrollTo(curDiv) {
    var y = findPosY(curDiv); 
    var x = findPosX(curDiv);    
    var scrollPos;

    scrollTarget = curDiv;

    desiredY = y - 300;
    if ( desiredY < 0 ) {
        desiredY = 0;
    }

    desiredX = x - 300;
    if ( desiredX < 0 ) {
        desiredX = 0;
    }  

    scrollPos = getScrollXY();
    currentY = scrollPos[1];
    currentX = scrollPos[0];
    
    if (curDiv.style.visibility != "visible") {
       currentOpacity = 0.0;
       curDiv.style.opacity = currentOpacity;
       curDiv.style.visibility = "visible";
    }

    intervalId = setInterval( "scroll()", 1 );
}




var cursorStr = "<img src=\"cursor.gif\" width=\"5\" height=\"8\" align=\"bottom\"/>";


function raiseDiv(curDiv) {
   z += 1;
   curDiv.style.zIndex = z;
   return false;
}

var intervalStarted = false;

function cancelKeyEvent( evt )
{
   if ( window.createPopup )
       evt.keyCode = 0;
   else
       evt.preventDefault();
}

function handleBackspace(curDiv) {
      var content = getText(curDiv);
      var cutoff = 1;

      var m = /.*([<].*[>]|[&].*[;])$/i.exec(content);
      if ( m != null ) {
          cutoff = m[1].length;
      }
      curDiv.innerHTML = content.substring(0, content.length - cutoff);
}

 function keyHandler(e)
 {
 	var pressedKey;
        
        document.getElementById('status').style.visibility = 'hidden';

 	if (document.all)	{ e = window.event; }
        if (document.layers || e.which) { pressedKey = e.which; }
 	if (document.all)	{ pressedKey = e.keyCode; }
 	pressedCharacter = String.fromCharCode(pressedKey);
        curDiv = document.getElementById('current');
        
        log.debug( 'character pressed was ' + pressedCharacter.charCodeAt(0) );
        //alert( 'pressed key was ' + pressedCharacter.charCodeAt(0) );

        if ( pressedCharacter.charCodeAt(0) == 13 ) {
             var content = getText(curDiv);
             if ( content.length < 193 ) {
                curDiv.innerHTML = content + "<br/>"; 
             }
        } else if (pressedCharacter.charCodeAt(0) == 8) {
            handleBackspace(curDiv);
        } else {
           var content = getText(curDiv);
           if ( content.length < 199 ) {
              curDiv.innerHTML = content + pressedCharacter;
              raiseDiv(curDiv);
              raiseDiv(document.getElementById('status'));
           } else {
              curDiv.innerHTML = content;
           }
        }
        //window.scrollTo(findPosX(curDiv), findPosY(curDiv));
        //sendKeypress(pressedCharacter);                 
        smoothScrollTo(curDiv);
           
        curDiv.innerHTML += cursorStr;

        if ( !intervalStarted ) {
            intervalStarted = true;
            setInterval( "store()", 5000 );
        }        
        log.debug('keypress: ' + pressedCharacter.charCodeAt(0));
        if (pressedCharacter.charCodeAt(0) == 8 || pressedCharacter.charCodeAt(0) == 32 ||
            pressedCharacter.charCodeAt(0) == 39) {
            if (e.preventDefault) {
                e.preventDefault();
            }
            window.event.cancelBubble = true;
            window.event.returnValue = false;
            return false;  //eat backspace, space and '
        }
        return true;
}



function isIE()
{
      return /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent);
}

function isSafari()
{
      return /safari/i.test(navigator.userAgent);
}

function isFirefox()
{
      return /firefox/i.test(navigator.userAgent);
}


function backspaceKiller(e)
 {
 	var pressedKey;
 	if (document.all)	{ e = window.event; }
        if (document.layers || e.which) { pressedKey = e.which; }
 	if (document.all)	{ pressedKey = e.keyCode; }
 	pressedCharacter = String.fromCharCode(pressedKey);
        curDiv = document.getElementById('current');
        
        log.debug( 'character 2 pressed was ' + pressedCharacter.charCodeAt(0) );
       
        if (pressedCharacter.charCodeAt(0) == 8 && (isIE() || isSafari())) {
           handleBackspace(curDiv);
        }

        if (pressedCharacter.charCodeAt(0) == 8 ) {
            //alert( 'backspace is killed');
            if (e.preventDefault) {
                e.preventDefault();
            }
            window.event.cancelBubble = true;
            window.event.returnValue = false;
            return false;  //eat backspace, space and '
        }
        return true;
}


 document.onkeypress = keyHandler;
 document.onkeydown = backspaceKiller;

 function setFocusOn() {
     if ( isFirefox() ) {
        document.getElementById('dummy').focus();
     }
 }

 window.onfocus = setFocusOn;
 
 if ( isIE() ) {
    removeDummy();
 }


 
 log.toggle();




