Click here to Skip to main content
15,886,199 members
Articles / Web Development / HTML

JavaScript Virtual Keyboard

Rate me:
Please Sign up or sign in to vote.
4.91/5 (181 votes)
30 Mar 2008CPOL20 min read 1.2M   23.6K   323  
This article presents a Virtual Keyboard - an important addendum to the library of usability tools.
/* JavaScript Virtual Keyboard (numpad variant), version 2.7
 * (compressed with ESC: http://www.saltstorm.net/depo/esc/) 
 *
 * Copyright (C) 2006-2008 Dmitriy Khudorozhkov (mailto:dmitrykhudorozhkov@yahoo.com)
 *
 * This software is provided "as-is", without any express or implied warranty.
 * In no event will the author be held liable for any damages arising from the
 * use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
 *    appreciated but is not required.
 *
 * 2. Altered source versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 *
 * 3. This notice may not be removed or altered from any source distribution.
 */

function VNumpad($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n){return this.$0i($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n);};VNumpad.kbArray=[];VNumpad.prototype={$o:function($p,$q,$r){return($p.attachEvent?$p.attachEvent("on"+$q,$r):(($p.addEventListener)?$p.addEventListener($q,$r,false):null));},$s:function($t){function getColor($u,$v,$w){if(/rgb\((\d+),\s(\d+),\s(\d+)\)/.exec($u)){switch($v){case 1:return parseInt(RegExp.$1,10);case 2:return parseInt(RegExp.$2,10);case 3:return parseInt(RegExp.$3,10);default:return 0;}}else return $u.length==4?parseInt($u.substr($v,1)+$u.substr($v,1),16):parseInt($u.substr($w,2),16);};function getR($x){return getColor($x,1,1);};function getG($x){return getColor($x,2,3);};function getB($x){return getColor($x,3,5);};var el=$t.time?$t:($t.company&&$t.company.time?$t.company:null);if(el){el.time=0;clearInterval(el.timer);};var $y=this;var $z=$y.fontcolor,$A=$y.keycolor,$B=$y.bordercolor;if($t.dead)$z=$y.deadcolor;if((($t.innerHTML=="Shift")&&$y.Shift)||(($t.innerHTML=="Caps")&&$y.Caps)||(($t.innerHTML=="AltGr")&&$y.AltGr))$A=$y.lic;var fr=getR($z),fg=getG($z),fb=getB($z);var kr=getR($A),kg=getG($A),kb=getB($A);var br=getR($B),bg=getG($B),bb=getB($B);var $C=getR($y.cfc),$D=getG($y.cfc),$E=getB($y.cfc);var $F=getR($y.cbg),$G=getG($y.cbg),$H=getB($y.cbg);var $I=getR($y.cbr),$J=getG($y.cbr),$K=getB($y.cbr);var $L=function(){function dec2hex($M){var $N="0123456789ABCDEF";var a=$M%16;var b=($M-a)/16;return $N.charAt(b)+$N.charAt(a)+"";};$t.time=!$t.time?10:($t.time-1);function calc_color($O,end){return(end -($t.time/10)*(end -$O));};var $P=calc_color($C,fr),$Q=calc_color($D,fg),$R=calc_color($E,fb);var $S=calc_color($F,kr),$T=calc_color($G,kg),$U=calc_color($H,kb);var $V=calc_color($I,br),$W=calc_color($J,bg),$X=calc_color($K,bb);$t.style.color="#"+dec2hex($P)+dec2hex($Q)+dec2hex($R);$t.style.borderColor="#"+dec2hex($V)+dec2hex($W)+dec2hex($X);$t.style.backgroundColor="#"+dec2hex($S)+dec2hex($T)+dec2hex($U);if(!$t.time){clearInterval($t.timer);return;}};$L();$t.timer=window.setInterval($L,50);},$Y:function($Z,top,$00,$01,$02,$03,$h,$f,$04,$05,$d,$06,$07,$08){var os=$Z.style;if(top)os.top=top;if($00)os.left=$00;if($01)os.width=$01;if($02)os.height=$02;if($03)os.position=$03;if($h)os.border="1px solid "+$h;if($f)os.backgroundColor=$f;if($04)os.textAlign=$04;if($05)os.lineHeight=$05;if($d)os.fontSize=$d;os.fontWeight=$06||"bold";if($07)os.paddingLeft=$07;if($08)os.paddingRight=$08;},$09:function(parent,id,top,$00,$01,$02,$h,$f,$04,$05,$d,$06,$07,$08){var $0a=this.Cntr.id+id;var $0b=document.getElementById($0a);var $0c=$0b?$0b.parentNode:document.createElement("DIV");this.$Y($0c,top,$00,$01,$02,"absolute");var $0d=$0b||document.createElement("DIV");$0c.appendChild($0d);parent.appendChild($0c);this.$Y($0d,"","","",$05,"relative",$h,$f,$04,$05,$d,$06,$07,$08);$0d.id=$0a;if(!$0b)this.$o($0d,'mouseup',this.$0R);return $0d;},$0e:function($Z){return($Z&&$Z.parentNode)?parseFloat($Z.parentNode.offsetLeft):0;},$0f:function($Z){return($Z&&$Z.parentNode)?parseFloat($Z.parentNode.offsetTop):0;},$0g:function($Z){return($Z&&$Z.parentNode)?parseFloat($Z.parentNode.offsetWidth):0;},$0h:function($Z){return($Z&&$Z.parentNode)?parseFloat($Z.parentNode.offsetHeight):0;},$0i:function($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n){var $0b=(this.Cntr!=undefined),ct=$0b?this.Cntr:document.getElementById($a);var $0j=($d&&($d!=this.fontsize));this.$0V=((typeof($b)=="function")&&(($b.length==1)||($b.length==2)))?$b:(this.$0V||null);var ff=$c||this.fontname||"";var fs=$d||this.fontsize||"14px";var fc=$e||this.fontcolor||"#000";var bg=$f||this.bgcolor||"#FFF";var kc=$g||this.keycolor||"#FFF";var bc=$h||this.bordercolor||"#777";this.cfc=$j||this.cfc||"#CC3300";this.cbg=$k||this.cbg||"#FF9966";this.cbr=$l||this.cbr||"#CC3300";this.sc=($i==undefined)?((this.sc==undefined)?false:this.sc):$i;this.gap=($n!=undefined)?($n?1:-1):(this.gap||1);this.fontname=ff,this.fontsize=fs,this.fontcolor=fc;this.bgcolor=bg,this.keycolor=kc,this.bordercolor=bc;if(!$0b){this.Cntr=ct,this.LastKey=null;VNumpad.kbArray[$a]=this;};var kb=$0b?ct.childNodes[0]:document.createElement("DIV");if(!$0b){ct.appendChild(kb);ct.style.display="block";ct.style.zIndex=999;if($m)ct.style.position="relative";else{ct.style.position="absolute";var $0k=0,$0l=ct;if($0l.offsetParent){while($0l.offsetParent){$0k+=$0l.offsetLeft;$0l=$0l.offsetParent;}}else if($0l.x)$0k+=$0l.x;var $0m=0;$0l=ct;if($0l.offsetParent){while($0l.offsetParent){$0m+=$0l.offsetTop;$0l=$0l.offsetParent;}}else if($0l.y)$0m+=$0l.y;ct.style.top=$0m+"px",ct.style.left=$0k+"px";};kb.style.position="relative";kb.style.top="0px",kb.style.left="0px";};kb.style.border="1px solid "+bc;var $0n=$0b?kb.childNodes[0]:document.createElement("DIV"),ks=$0n.style;if(!$0b){kb.appendChild($0n);ks.position="relative";ks.width="1px";ks.cursor="default";};this.$o($0n,"selectstart",function(event){return false;});this.$o($0n,"mousedown",function(event){if(event.preventDefault)event.preventDefault();return false;});ks.fontFamily=ff,ks.backgroundColor=bg;if(!$0b||$0j){ks.width=this.$0o($a,$0n);ks.height=(this.$0f(this.LastKey)+this.$0h(this.LastKey)+this.gap)+"px";};return this;},$0o:function($a,parent){var c="center",n="normal",l="left",$0p=this.gap;var fs=this.fontsize,kc=this.keycolor,bc=this.bordercolor;var $0q=parseFloat(fs)/14.0,$0r=Math.floor(25.0*$0q);var $0s=2*$0r,dp=($0s+1)+"px",$0t=($0s-1-(($0p<0)?2:0))+"px";var cp=String($0r)+"px",lh=String(Math.floor($0r-2.0))+"px";var $0u=$0p+"px";var $0v=this.$09(parent,"___pad_eur",$0p+"px",$0u,cp,cp,bc,kc,c,lh,fs);$0v.innerHTML="&#x20AC;";var $0w=(this.$0e($0v)+this.$0g($0v)+$0p)+"px";var $0x=this.$09(parent,"___pad_slash",$0p+"px",$0w,cp,cp,bc,kc,c,lh,fs);$0x.innerHTML="/";var $0y=(this.$0e($0x)+this.$0g($0x)+$0p)+"px";var $0z=this.$09(parent,"___pad_star",$0p+"px",$0y,cp,cp,bc,kc,c,lh,fs);$0z.innerHTML="*";var $0A=(this.$0e($0z)+this.$0g($0z)+$0p)+"px";var $0B=this.$09(parent,"___pad_minus",$0p+"px",$0A,cp,cp,bc,kc,c,lh,fs);$0B.innerHTML="-";this.kbpM=this.$0e($0B)+this.$0g($0B)+$0p;var $0C=this.$0h($0v),$0D=(this.$0f($0v)+$0C+$0p)+"px";var $0E=this.$09(parent,"___pad_7",$0D,$0u,cp,cp,bc,kc,c,lh,fs);$0E.innerHTML="7";var $0F=this.$09(parent,"___pad_8",$0D,$0w,cp,cp,bc,kc,c,lh,fs);$0F.innerHTML="8";var $0G=this.$09(parent,"___pad_9",$0D,$0y,cp,cp,bc,kc,c,lh,fs);$0G.innerHTML="9";var $0H=this.$09(parent,"___pad_plus",$0D,$0A,cp,dp,bc,kc,c,$0t,fs);$0H.innerHTML="+";$0D=(this.$0f($0E)+$0C+$0p)+"px";var $0I=this.$09(parent,"___pad_4",$0D,$0u,cp,cp,bc,kc,c,lh,fs);$0I.innerHTML="4";var $0J=this.$09(parent,"___pad_5",$0D,$0w,cp,cp,bc,kc,c,lh,fs);$0J.innerHTML="5";var $0K=this.$09(parent,"___pad_6",$0D,$0y,cp,cp,bc,kc,c,lh,fs);$0K.innerHTML="6";$0D=(this.$0f($0I)+$0C+$0p)+"px";var $0L=this.$09(parent,"___pad_1",$0D,$0u,cp,cp,bc,kc,c,lh,fs);$0L.innerHTML="1";var $0M=this.$09(parent,"___pad_2",$0D,$0w,cp,cp,bc,kc,c,lh,fs);$0M.innerHTML="2";var $0N=this.$09(parent,"___pad_3",$0D,$0y,cp,cp,bc,kc,c,lh,fs);$0N.innerHTML="3";var $0O=this.$09(parent,"___pad_enter",$0D,$0A,cp,dp,bc,kc,c,$0t,parseFloat(fs)*0.643,n);$0O.innerHTML="Enter";$0D=(this.$0f($0L)+$0C+$0p)+"px";var $0P=this.$09(parent,"___pad_0",$0D,$0u,dp,cp,bc,kc,l,lh,fs,"",7*$0q+"px");$0P.innerHTML="0";var $0Q=this.$09(parent,"___pad_period",$0D,$0y,cp,cp,bc,kc,c,lh,fs);$0Q.innerHTML=".";this.LastKey=$0Q;return String(this.$0e($0B)+this.$0g($0B)+$0p)+"px";},$0R:function(event){var e=event||window.event;var $t=e.srcElement||e.target;var $a=$t.id.substring(0,$t.id.indexOf("___"));var $0S=VNumpad.kbArray[$a];if($0S.sc)$0S.$s($t);if($0S.$0V)$0S.$0V($t.innerHTML,$0S.Cntr.id);},SetParameters:function(){var l=arguments.length;if(!l||(l%2!=0))return false;var p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,$0T;while(--l>0){var $0U=arguments[l];switch(arguments[l-1]){case "callback":p0=((typeof($0U)=="function")&&(($0U.length==1)||($0U.length==2)))?$0U:this.$0V;break;case "font-name":p1=$0U;break;case "font-size":p2=$0U;break;case "font-color":p3=$0U;break;case "base-color":p4=$0U;break;case "key-color":p5=$0U;break;case "border-color":p6=$0U;break;case "show-click":p7=$0U;break;case "click-font-color":p8=$0U;break;case "click-key-color":p9=$0U;break;case "click-border-color":$0T=$0U;break;default:break;};l-=1;};this.$0i(this.Cntr.id,p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,$0T);return true;},Show:function($0U){var ct=this.Cntr.style;ct.display=(($0U==undefined)||($0U==true))?"block":(($0U==false)?"none":ct.display);}};

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Freelance software engineer
Russian Federation Russian Federation
Dmitry Khudorozhkov began programming (and gaming) with his ZX Spectrum in 1989. Having seen and used all IBM PCs from early XT to the latest x64 machines, now Dmitry is a freelance programmer, living in Moscow, Russia. He is a graduate of the Moscow State Institute of Electronics and Mathematics (Applied Mathematics).

He is proficient in:

- C/C++ - more that 9 years of experience. Pure Win32 API/MFC desktop programming, networking (BSD/Win sockets), databases (primarily SQLite), OpenGL;

- JavaScript - more that 6 years of experience. Client-side components, AJAX, jQuery installation and customization;

- Firefox extensions (immediatelly ready for addons.mozilla.org reviewing) and Greasemonkey scripts. As an example of extensions Dmitry made you can search for FoxyPrices or WhatBird Winged Toolbar;

- XML and it's applications (last 2 years): XSLT (+ XPath), XSD, SVG, VML;

- ASP.NET/C# (webservices mostly);

Also familiar with (= entry level):

- PHP;

- HTML/CSS slicing.

Trying to learn:

- Ruby/Ruby-on-Rails;

- Czech language.

If you wish to express your opinion, ask a question or report a bug, feel free to e-mail:dmitrykhudorozhkov@yahoo.com. Job offers are warmly welcome.

If you wish to donate - and, by doing so, support further development - you can send Dmitry a bonus through the Rentacoder.com service (registration is free, Paypal is supported). Russian users can donate to the Yandex.Money account 41001132298694.

-

Comments and Discussions