function buildKeyboardInputs() {
  var self = this;  this.target = "";  this.visible = -1;  this.shift = this.capslock = this.alternate = false;  this.kt = "US";  this.range = false;
  var inputElems = [    document.getElementsByTagName('input'),    document.getElementsByTagName('textarea'),  ]
  for (var y = 0, inputCount = 0; y < inputElems.length; y++) {
    if (inputElems[y]) {
      for (var x = 0; x < inputElems[y].length; x++) {
        if ((y || inputElems[y][x].type == "text" || inputElems[y][x].type == "password") && inputElems[y][x].className.indexOf("keyboardInput") > -1) {
          var keyid = (inputElems[y][x].id) ? inputElems[y][x].id : 'keyboardInputInitiator' + inputCount++;
          var keybut = document.createElement('img');
              keybut.src = "images/srk.gif"; keybut.alt = "Virtual Keyboard"; keybut.className = "keyboardInputInitiator";
              keybut.title = "Show Virtual Keyboard"; keybut.onclick = (function(a) { return function() { self.show(a); }; })(keyid);
          inputElems[y][x].id = keyid;inputElems[y][x].keyboardId = x;
          inputElems[y][x].parentNode.insertBefore(keybut, inputElems[y][x].nextSibling);
          inputElems[y][x].onclick = inputElems[y][x].onkeypress = inputElems[y][x].onselect = function() {
            if (self.target.createTextRange) self.range = document.selection.createRange();
          }}}}}
  this.keys = new Object();
  this.keys.US = [ 
    [["`", "~"], ["1", "!"], ["2", "@"], ["3", "#"], ["4", "$"], ["5", "%"], ["6", "^"], ["7", "&"], ["8", "*"], ["9", "("], ["0", ")"], ["-", "_"], ["=", "+"], ["Bksp", "Bksp", "Bksp"]],
    [["Tab", "Tab", "Tab"],["q", "Q"], ["w", "W"], ["e", "E"], ["r", "R"], ["t", "T"], ["y", "Y"], ["u", "U"], ["i", "I"], ["o", "O"], ["p", "P"], ["[", "{"], ["]", "}"], ["\\", "|"]],
    [["Caps", "CAPS", "Caps"], ["a", "A"], ["s", "S"], ["d", "D"], ["f", "F"], ["g", "G"], ["h", "H"], ["j", "J"], ["k", "K"], ["l", "L"], [";", ":"], ["'", '"'], ["Enter", "Enter", "Enter"]],
    [["Shift", "SHIFT", "Shift"], ["z", "Z"], ["x", "X"], ["c", "C"], ["v", "V"], ["b", "B"], ["n", "N"], ["m", "M"], [",", "<"], [".", ">"], ["/", "?"], ["Shift", "SHIFT", "Shift"]],
    [[" ", " "]]
  ];
  this.keyboard = document.createElement('div');  this.keyboard.id = "keyboardInputMaster";  var layouts = 0;
  for (ktype in this.keys) if (typeof this.keys[ktype] == "object") layouts++;
  if (layouts > 1) {
    var kblist = document.createElement('select');
      for (ktype in this.keys) {
        if (typeof this.keys[ktype] == "object") {
          var opt = document.createElement('option');
              opt.value = ktype;
              opt.appendChild(document.createTextNode(ktype)); kblist.appendChild(opt);
        }}
        kblist.value = this.kt;
        kblist.onchange = function() {  self.kt = this.value;  self.buildKeys();}
    this.keyboard.appendChild(kblist);  }
  var closer = document.createElement('span');
      closer.appendChild(document.createTextNode('X'));
      closer.title = "Close this window";
      closer.onclick = function(e) { self.close(); }
  this.keyboard.appendChild(closer);
  this.keyboard.appendChild(document.createElement('div'));      
  this.buildKeys = function() {
    this.shift = this.capslock = this.alternate = false;
    var container = this.keyboard.getElementsByTagName('div')[0];
    while (container.firstChild) container.removeChild(container.firstChild);
    for (var x = 0; x < this.keys[this.kt].length; x++) {
      var div = document.createElement('div');
      if (this.keys[this.kt][x].length <= 3) div.className = "keyboardInputCenter";
        var ul = document.createElement('ul');
        for (var y = 0; y < this.keys[this.kt][x].length; y++) {
          var li = document.createElement('li');
              li.appendChild(document.createTextNode(this.keys[this.kt][x][y][0]));
              if (this.keys[this.kt][x][y][0] == " ")
                li.style.paddingLeft = li.style.paddingRight = "50px";
              li.onmouseover = function(e) { this.className = "hover"; }
              li.onmouseout = function(e) { this.className = ""; }
              li.PrxOff_onmousedown = function(e) { this.className = "pressed"; }
              li.onmouseup = function(e) { this.className = "hover"; }
              li.ondblclick = function() { return false; }
              if (this.keys[this.kt][x][y].length == 3) {
                switch (this.keys[this.kt][x][y][2]) {
                  case "Caps":
                  case "Shift":
                  case "AltGr":
                    li.onclick = (function(type) { return function() { self.modify(type); return false; }})(this.keys[this.kt][x][y][2]);
                    break;
                  case "Tab":
                    li.onclick = function() { self.insert("\t"); return false; }
                    break;
                  case "Bksp":
                    li.onclick = function() {
                      self.target.focus();
                      if (self.target.setSelectionRange) {
                        var srt = self.target.selectionStart; var len = self.target.selectionEnd; if (srt < len) srt++;
                        self.target.value = self.target.value.substr(0, srt - 1) + self.target.value.substr(len);
                        self.target.setSelectionRange(srt - 1, srt - 1);
                      } else if (self.target.createTextRange) {
                        try { self.range.select(); } catch(e) {}
                        self.range = document.selection.createRange();
                        if (!self.range.text.length) self.range.moveStart('character', -1);
                        self.range.text = "";
                      } else self.target.value = self.target.value.substr(0, self.target.value.length - 1);
                      if (self.shift) self.modify("Shift");
                      if (self.alternate) self.modify("AltGr");
                      return false;
                    }
                    break;
                  case "Enter":
                    li.onclick = function() {
                      if (self.target.nodeName == "TEXTAREA") { self.insert("\n"); } else self.close();
                      return false; }
                    break;
                  default:
                   this.keys[this.kt][x][y][3] = "\xa0";
                }
              } else if (this.keys[this.kt][x][y].length == 2)
                this.keys[this.kt][x][y][2] = this.keys[this.kt][x][y][3] = "\xa0";
  
              if (!li.onclick) {
                li.onclick = function() {
                  if (this.firstChild.nodeValue != "\xa0") self.insert(this.firstChild.nodeValue);
                  return false;
                }}
            ul.appendChild(li);  div.appendChild(ul);
      }
      container.appendChild(div);
    }}
  this.buildKeys();
  this.keyboard.style.display = "none";
  document.body.appendChild(this.keyboard);
  this.modify = function(type) {
    switch (type) {
      case "Caps": this.capslock = !this.capslock; break;
      case "Shift": this.shift = !this.shift; break;
      case "AltGr": this.alternate = !this.alternate; break;
    }
    var vchar = 0;
    if (!this.shift != !this.capslock) vchar += 1;
    var uls = this.keyboard.getElementsByTagName('ul');
    for (var x = 0; x < uls.length; x++) {
      var lis = uls[x].getElementsByTagName('li');
      for (var y = 0; y < lis.length; y++)
        lis[y].firstChild.nodeValue = this.keys[this.kt][x][y][vchar + ((this.alternate && this.keys[this.kt][x][y].length == 4) ? 2 : 0)];
    }}
  this.insert = function(text) {
    this.target.focus();
    if (this.target.setSelectionRange) {
      var srt = this.target.selectionStart; var len = this.target.selectionEnd;
      this.target.value = this.target.value.substr(0, srt) + text + this.target.value.substr(len);
      if (text == "\n" && window.opera) srt++;
      this.target.setSelectionRange(srt + text.length, srt + text.length);
    } else if (this.target.createTextRange) {
      try { this.range.select(); } catch(e) {}
      this.range = document.selection.createRange(); this.range.text = text; this.range.collapse(true); this.range.select();
    } else this.target.value += text;
    if (this.shift) this.modify("Shift");
    if (this.alternate) this.modify("AltGr");
    this.target.focus();}
  this.show = function(id) {
    this.target = document.getElementById(id);
    if (this.visible != this.target.keyboardId) {
      this.range = ""; this.keyboard.style.display = "none"; var elem = this.target; this.target.keyboardPosition = "absolute";
      do {
        if (getStyle(elem, "position") == "fixed") {
          this.target.keyboardPosition = "fixed";
          break;}
      } while (elem = elem.offsetParent);
      this.keyboard.style.top = this.keyboard.style.right = this.keyboard.style.bottom = this.keyboard.style.left = "auto";
      this.keyboard.style.position = this.target.keyboardPosition;      this.keyboard.style.display = "block";      this.visible = this.target.keyboardId;      this.position();
      this.target.focus();
    } else this.close();
  }
  this.position = function() {
    if (this.visible > -1) {
      var inputElemPos = findPos(this.target);
      this.keyboard.style.top = inputElemPos[1] - ((this.target.keyboardPosition == "fixed") ? document.body.scrollTop : 0) + this.target.offsetHeight + 3 + "px";
      this.keyboard.style.left = Math.min(innerDimensions()[0] - this.keyboard.offsetWidth - 15, inputElemPos[0]) + "px";
    }}
  if (window.addEventListener) {
    window.addEventListener('resize', this.position, false); 
  } else if (window.attachEvent)
    window.attachEvent('onresize', this.position);
  this.close = function() {    this.target = "";    this.keyboard.style.display = "none";    this.visible = -1;  }
}
if (window.addEventListener) {
  window.addEventListener('load', buildKeyboardInputs, false); 
} else if (window.attachEvent)
  window.attachEvent('onload', buildKeyboardInputs);
function findPos(obj) {
  var curleft = curtop = 0;
  do {
    curleft += obj.offsetLeft;    curtop += obj.offsetTop;  } while (obj = obj.offsetParent);      return [curleft, curtop];
}
function innerDimensions() {
  if (self.innerHeight) {
    return [self.innerWidth, self.innerHeight];
  } else if (document.documentElement && document.documentElement.clientHeight) {
    return [document.documentElement.clientWidth, document.documentElement.clientHeight];
  } else if (document.body)
    return [document.body.clientWidth, document.body.clientHeight];
  return [0, 0];
}
function scroll(){ window.defaultStatus=x.substring(i,x.length)+x;  i++; if (i==x.length) i=0;  tid=setTimeout("scroll()",100)}
function stopScroll(){    window.defaultStatus=" ";    window.clearTimeout(tid);} 
function fullScreen(theURL) {	window.open(theURL,'small','fullscreen=no,scrollbars=no,width=180,height=180');}
function scrollScreen(theURL) {	window.open(theURL,'small','fullscreen=no,scrollbars=yes,width=360,height=420');}
function submit(){	document.forms[0].submit();}
function getlist(frm,vname){	var len = frm.elements.length; lst = "";	for(var i=0;i<len;i++){		if (frm.elements[i].name==vname && frm.elements[i].checked)	lst += frm.elements[i].value + ",";	}
	return (lst.length>0)?lst.substr(0,lst.length-1):"";}
function MM_preloadImages() {  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}}
function MM_swapImgRestore() {   var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;}
function MM_findObj(n, d) {   var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);  if(!x && d.getElementById) x=d.getElementById(n); return x;}
function MM_swapImage() {   var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}}
function MM_openBrWindow(theURL,winName,features) {   window.open(theURL,winName,features);}
function setLabelText(ID, Text){ document.getElementById(ID).innerHTML = Text;}
function getStyle(obj, styleProp) {
  if (obj.currentStyle) {
    var y = obj.currentStyle[styleProp];
  } else if (window.getComputedStyle)
    var y = window.getComputedStyle(obj, null)[styleProp];
  return y;}
function clearDefault(el) {
  if (el.defaultValue==el.value) el.value = "";
}