ÿþ<html> <head> <title>Skrivemaskinen 10 finger skrift Typewriting course</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF8"> <meta NAME="Title" CONTENT="dr.dk"> <meta NAME="Description" CONTENT="Gratis online skrivemaskine kursus for 10 finger skrift. Multi keyboard layout. Free of charge typewriting course. "> <meta NAME="Keywords" CONTENT="typewriting course, skrivemaskine, b&oslash;rn, 10-finger skrift, Typewriting, blindskrift,dactylographie,frensh keyboard, russian keyboard, greek keyboard, dansk keyboard, svenskt keyboard,Skrivmaskinkurs "> <meta NAME="Author" CONTENT="oleviolin"> <LINK REV=made href="mailto:oleq@post8.tele.dk"> <meta HTTP-EQUIV="Reply-to" CONTENT=""> <meta NAME="Copyright" CONTENT="Ole Quistgaard"> <meta HTTP-EQUIV="Content-language" CONTENT="dan"> <meta NAME="Rating" CONTENT="General"> <script language=javascript > /*Copy right This program is made by Ole Quistgaard oleq@post8.tele.dk You may use it and copy it to friend, you are not allowed to upload it to the internet without my written concent. You may modify the code but not erase this message. */ var tastOp=true; var Grafik=true; var farv="#ff0000,#00b000,#0000ff,#ff0000,#ff0000" farver=farv.split(","); var LetterLearnSequence="FJKASDKLÆFUJFJRERTKJIODSDFENKVMLERTUBVNIOWMNBVCXZPQWÅØ,." //var LetterLearnSequence="FJKLSEADQMURVNCNWABGHIEOZX'èàçé" var numkey="45,35,40,34,37,12,39,36,38,33"; numKeys=numkey.split(","); var DefaultKeyBoard='Dansk'; var SelectedLevel=0; var recording=false;//Når denne er true, så optager man positionen af tasterne var recordNewKeyBoard=true;//Set this variable to true when you want to read in a new keyboard. var RecordInactiveCodes=false;//Key on all inactive; Click on reset for writing var Debugging=false;//Displays some variables when you click on the keyboard var KeybTop =-44; var SpecialKeyPushed; var IsOpera=false; var KeybLeft=0; var lydOn=true; var SpecialKeyPushSeq=0; var tastOp=true; var AllKeyBoards var tastkode=0; var tastkode=0; var MaxSkriveLength=45; var text=""; var tegn=""; var tegnOrg="" var I=0; var match=false var TheFinger= '' var storeBogstaver=false; var ShiftIsDown=false; var AltIsDown=false; var START=""; var FoersteGang=true; var LineNo=0; var LinieIndex=0; var MATCH=""; var ANIMER=""; var PAUSE=""; var LYD=""; var tegnet='' var TheFingersCount=0; var NumberOfCounts=1; var TimeOn= 5000; var TimeOff=5000; var c=65; var t=1000; var fso; var BogstavetNo=0; var Index = 0; var DivLayTop=320; var LeftHandDivLeft=178; var RightHandDivLeft=473; var strLevel = "Level" var initRuns=true; var LastChar=""; var Index2Tegn; var StartTime=0; var SkrEftMellemRum=19; //Courrier=20point var SkrEftMellemRum=17; //Courrier=18point //var SkrEftMellemRum=11; //Courrier=10point var LastRightHit=0; var LastWrongHit=0; var TheUpTegn=0; var AltGrOn=false; var ShowPointer=true; var VarArray; var IsLCase=0;//0= LCase, 1=UCase,2=Alt,3=Other var KeyboardLetter='';//on the keyboard var WriteLetter='';//Letter Written var Players = '' var OutLine var factor = 0.92; //this factor makes the keyboard smaller i TasterPosition= new Array; Tegn2Index = new Array; Index2Tegn = new Array; FingerTips=new Array; Fingre2Index = new Array; TheLines=new Array; StoredKeyCodes=new Array; RightHitStatistics = new Array; WrongHitStatistics=new Array; InactiveCodes=new Array; SpecialChars=new Array; //KeyCode, Left, Top, Finger, Char | //This array was created by recording and clicking on the fingertips. (you must click twice on the first) var InactiveCodes; //used for var InactiveCodesTxt="0,18,17,255,16,37,40,39,38,127"; InactiveCodes=InactiveCodesTxt.split(',') var SpecialCharsTxt="À,`,A|Á,´,A|Â,^,A|Ä,¨,A|È,`,E|É,´,E|Ê,^,E|Ë,¨,E|Ì,`,I|Í,´,I|Î,^,I|Ï,¨,I|Ò,`,O|Ó,´,O|Ô,^,O|Ö,¨,O|Ù,`,U|Ú,´,U|Û,^,U|Ü,¨,U|Õ,~,O|Ã,~,A|à,`,a|á,´,a|ä,¨,a|ã,~,a|â,^,a|è,`,e|é,´,e|ê,^,e|ë,¨,e|ú,´,u|ù,`,u|û,^,u|ü,¨,u|ì,´,i|ï,¨,i|ñ,~,n|ÿ,¨,y|ò,`,o|ó,´,o|ô,^,o|ö,¨,o|õ,~,o" SpecialCharsComb=SpecialCharsTxt.split("|") for(i=0;i<SpecialCharsComb.length;i++) { SpecialChars[i]=new MakeSpecialChars(SpecialCharsComb[i]) } var AllFingerTips="0,220,320,38,L1,,#FF80FF|0,270,300,38,L2,,#FFAAAA|0,200,290,38,L3,,#EEEE11|0,155,300,38,L4,,#00bfff|0,100,350,38,L5,,#66EE66|0,348,435,38,R1,,#9dadff|0,430,300,38,R2,,#FFAAAA|0,495,280,38,R3,,#EEEd05|0,530,290,38,R4,,#AFEEEE|0,580,332,38,R5,,#66EE66|" fingerTip=AllFingerTips.split("|"); for(i=0;i<fingerTip.length;i++) { FingerTips[i] = new MakeTaster(fingerTip[i],'Fingre',i) } var FirstLoading=true; //var TasterStr ="220,66,162,L5,1/2|49,118,162,L5,1|50,170,162,L2,2|51,223,162,L2,3|52,276,162,L2,4|53,328,162,L2,5|54,382,161,R2,6|55,435,161,R2,7|56,485,160,R2,8|57,537,159,R3,9|48,588,160,R4,0|187,643,160,R5,+|219,693,160,R5,0|8,746,160,R5,&lt;-|9,69,216,L5,-&gt;|81,149,214,L5,q|87,199,213,L4,w|69,251,212,L3,e|82,304,213,L2,r|84,355,212,L2,t|89,408,211,R2,y|85,460,210,R2,u|73,511,211,R3,i|79,562,211,R4,o|80,614,210,R5,p|221,667,211,R5,å|186,715,210,R5,|13,768,210,R5,|20,73,267,L5,|65,163,266,L5,a|83,214,265,L4,s|68,266,265,L3,d|70,318,264,L2,f|71,369,264,L2,g|72,421,263,R2,h|74,474,264,R2,j|75,524,264,R3,k|76,576,264,R4,l|192,629,262,R5,æ|222,679,263,R5,ø|191,731,262,R5,'|16,74,317,L2,shift|226,138,317,L5,<|90,190,315,L5,z|88,241,316,L4,x|67,293,316,L3,c|86,344,315,L2,v|66,395,314,L2,b|78,447,315,R2,n|77,497,315,R3,m|188,550,313,R4,|46,550,313,R4,|190,601,315,R5,|189,653,314,R5,|16,706,313,R5,|17,76,369,R5,|91,402,471,L2,m|32,400,368,R1,|18,588,365,R5,|93,716,362,L2,|93,716,362,L2,|17,778,364,R5,|" //Remember that left shiftkey is set to 316 //Pattern keycode,Xpos,Ypos,Finger,TheLetter,TheKeyCodeTxtLCase,TheKeyCodeTxtUCase,TheKeyCodeTxtAltGr var TasterStr="220,66,162,38,L5,1/2,,189,167,189,189|49,118,162,38,L5,1,,49,33,49,|50,170,162,38,L4,2,,50,34,50,64|51,223,162,38,L3,3,,51,35,51,163|52,276,162,38,L3,4,,52,164,52,36|53,328,162,38,L2,5,,53,37,53,8364|54,382,161,38,L2,6,,54,38,54,|55,435,161,38,R2,7,,55,47,55,123|56,485,160,38,R2,8,,56,40,56,91|57,537,159,38,R3,9,,57,41,57,93|48,588,160,38,R4,0,,48,61,48,125|187,643,160,38,R5,+,,43,63,43,|219,693,160,38,R5,0,,180,96,180,124|127,760,160,38,R5,Del,,,,,|8,746,160,38,R5,&lt;-,,,,,|9,69,216,38,L5,-&gt;,,,,,|81,149,214,38,L5,q,,113,81,113,|87,199,213,38,L4,w,,119,87,119,|69,251,212,38,L3,e,,101,69,101,|82,304,213,38,L2,r,,114,82,114,|84,355,212,38,L2,t,,116,84,116,|89,408,211,38,R2,y,,121,89,121,|85,460,210,38,R2,u,,117,85,117,|73,511,211,38,R3,i,,105,73,105,|79,562,211,38,R4,o,,111,79,111,|80,614,210,38,R5,p,,112,80,112,|221,667,211,38,R5,å,,229,197,229,|186,715,210,38,R5,,,168,94,168,126|13,768,210,38,R5,,,,,,|20,73,267,38,L5,,,,,,|65,163,266,38,L5,a,,97,65,97,|83,214,265,38,L4,s,,115,83,115,|68,266,265,38,L3,d,,100,68,100,|70,318,264,38,L2,f,,102,70,102,|71,369,264,38,L2,g,,103,71,103,|72,421,263,38,R2,h,,104,72,104,|74,474,264,38,R2,j,,106,74,106,|75,524,264,38,R3,k,,107,75,107,|76,576,264,38,R4,l,,108,76,108,|192,629,262,38,R5,æ,,230,198,230,|222,679,263,38,R5,ø,,248,216,248,|191,731,262,38,R5,',,39,42,39,|316,74,317,38,L5,shift,,,,,|226,138,317,38,L5,<,,60,62,60,92|90,190,315,38,L5,z,,122,90,122,|88,241,316,38,L4,x,,120,88,120,|67,293,316,38,L3,c,,99,67,99,|86,344,315,38,L2,v,,118,86,118,|66,395,314,38,L2,b,,98,66,98,|78,447,315,38,R2,n,,110,78,110,|77,497,315,38,R3,m,,109,77,109,181|188,550,313,38,R4,,,44,59,44,|190,601,315,38,R5,,,46,58,46,|189,653,314,38,R5,,,45,95,45,|16,706,313,38,R5,,,16,16,16,|17,76,369,38,L5,,,,,,|91,241,365,38,L2,,,,,,|32,400,368,38,R1,,,,,,|18,588,365,38,R5,,,,,,|93,716,362,38,L2,,,,,,|93,716,362,38,L2,,,,,,|17,778,364,38,R5,,,,,,|" //Note this is later read in throug I-frame. function BodyOnLoad() { } function init() { //<div onmousedown=ClickHand(); id="LeftHandDiv" style="Z-INDEX: 106; LEFT: 178px; VISIBILITY: visible; WIDTH: 158px; POSITION: absolute; TOP: 376px; HEIGHT: 157px"><IMG src="LClosed.gif" name=LeftHand> // </div> GetKeyBoard(); ReadAllKeyBoards(); switchBack=window.setTimeout('tom()',500); //initialize switchBack SkriveLag.style.top = factor* 56 RightHandDiv.style.width = parseInt( 277 * factor) + "px"; RightHandDiv.style.height = parseInt(233 * factor) + "px"; //Starts the script } function GetKeyBoard() { //Gets the keyboard from the URL string var TheLoc, TheKeyBoards,KeyB; TheLoc=window.location.search; TheKeyBs=TheLoc.split("="); if(TheKeyBs.length>1) { KeyB=TheKeyBs[1] DefaultKeyBoard=KeyB; LineNo=0; } else { } //This is peculiar, but it is to avoid an error ShiftToNewLine(); //First time the user comes in he will see the fingers how they should rest UdgangStilling(); } var HelpHide=true function hideBogs() { var TheBog if(HelpHide) { HelpHide=false LayerInfo.style.visibility ='hidden' Help.style.visibility='visible' Help.style.top ='380px' HelpText1.style.visibility='visible' HelpText1.style.top ='380px' LeftHandDiv.style.visibility ='hidden' RightHandDiv.style.visibility ='hidden' } else { HelpHide=true LayerInfo.style.visibility ='visible' LeftHandDiv.style.visibility ='visible' RightHandDiv.style.visibility ='visible' HelpText1.style.visibility='hidden' HelpText1.style.top='0px' Help.style.visibility='hidden' Help.style.top ='0px'; //HelpText.style.visibility='hidden' HelpEng.style.visibility='hidden' HelpEng.style.top='0px' HelpTextEng.style.visibility='hidden' HelpTextEng.style.top ='0px' } for(i=0;i<62;i++) { if(HelpHide) { TheBogs=eval('bogs'+i) TheBogs.style.visiblity ='hidden' } else { TheBogs=eval('bogs'+i) TheBogs.style.visiblity ='visible' } } } var DanskLan=true function shiftLan() { if(DanskLan) { DanskLan = false HelpText1.style.visibility ='visible'; Help.style.visibility='visible'; HelpTextEng.style.visibility ='hidden'; HelpEng.style.visibility='hidden'; } else { DanskLan=true HelpText1.style.visibility ='hidden'; Help.style.visibility='hidden'; HelpTextEng.style.visibility ='visible'; HelpTextEng.style.top='380px' HelpEng.style.visibility='visible'; } } function ReadAllKeyBoards() { //This is the first procedure run Reads in all boards from the fill Keyboards.txt //Sets Default keyboard to the first keyboard in the list txt=KeyBoards.document.body.innerText AllKeyBoards=txt.split('\r\n') //DefaultKeyBoard=AllKeyBoards[0] for(i=0;i<AllKeyBoards.length;i++) { addOption(Select1,AllKeyBoards[i],AllKeyBoards[i] ); //AllKeyBoards[i] } ChangeKeyBoard(DefaultKeyBoard); } function ChangeKeyBoard(theval) { DefaultKeyBoard=theval; KeySource=theval //theval is the name of the keyboard (Default, Dansk, German etc. //Changes keyboard //The Next procdure ReadInBoard() is called when loaded if(IsOpera) { KeySource = theval+'Opera' } IframeKeyBoardsCharsDiv.innerHTML=' <IFRAME name="txtKeyBoard" onload=ReadInBoard("'+theval+'"); src="'+KeySource+'KeyBoard.txt" ></IFRAME>' //<IFRAME id="txtinput" onload="init1(); name="txtinpt" src="'+theval+'Text.txt"></IFRAME> //Write the name so the user knows LayKeybName.innerText=theval //Start from the beginning when keyboard is changed LineNo=0; } function ReadInBoard(KeyB) { TasterStr=txtKeyBoard.document.body.innerText; TasterPos=TasterStr.split("|"); for(i=0;i<TasterPos.length;i++) { TasterPosition[i] = new MakeTaster(TasterPos[i],'Taster',i) } WriteKeyBoard(KeyB); //Read in text in correct language: tastkode=SkrivEfterLag.innerText.charCodeAt(0); LaySkrEftPointer.innerText=SkrivEfterLag.innerText.slice(0,1); SkriveLag.innerText = '' //SelectKeyBoards.style.visibility='hidden' } function WriteKeyBoard(KeyB) { for(i=0;i<TasterPosition.length-1;i++) { TheBogs=eval('bogs'+i) UCaseLetter=String.fromCharCode(TasterPosition[i].TheKeyCodeTxtUCase) LCaseLetter=String.fromCharCode(TasterPosition[i].TheKeyCodeTxtLCase) if(!isNaN(TasterPosition[i].Xpos)) { TheBogs.style.left=TasterPosition[i].Xpos } if(!isNaN(TasterPosition[i].Ypos)) { TheBogs.style.top=TasterPosition[i].Ypos*1+KeybTop*1 } if(!isNaN(TasterPosition[i].Width)) { TheBogs.style.width=TasterPosition[i].Width } if(UCaseLetter!=LCaseLetter.toUpperCase()) { TheBogs.innerHTML=UCaseLetter+'<br>'+LCaseLetter } else { if(isNaN(TasterPosition[i].TheKeyCodeTxtUCase)||TasterPosition[i].TheKeyCodeTxtUCase=='') { TheBogs.innerHTML=TasterPosition[i].TheLetter } else { TheBogs.innerHTML=String.fromCharCode(TasterPosition[i].TheKeyCodeTxtUCase) } } if(TasterPosition[i].TheKeyCodeTxtAltGr!='') { TheBogs.innerHTML+='&nbsp;<font size="1">&nbsp;&nbsp;'+String.fromCharCode(TasterPosition[i].TheKeyCodeTxtAltGr)+'</font>' } } WriteTxtIframe(KeyB); } function WriteTxtIframe(KeyB) { IframTxtDiv.innerHTML='<iframe id=txtinput onload="ReadTextFromIframe();" name=txtinput src="'+KeyB+'Text.txt"></iframe>' } function ShiftToNewLine() { var expdate = new Date(); FoersteGang=true; SkriveLag.innerText = '' tastkode=SkrivEfterLag.innerText.charCodeAt(0); LineNo++ if(LineNo>=TheLines.length) { if(LineNo>2) alert('Her slutter øvelsen, tak fordi du prøvede - \nThis is the end of the exercise thanks for trying '); return false; } if(TheLines[LineNo].length>MaxSkriveLength) { //Cut away too long lines SkrivEfterLag.innerText=TheLines[LineNo].slice(0,MaxSkriveLength) } else { SkrivEfterLag.innerText=TheLines[LineNo] } FirstChar=TheLines[LineNo].charAt(0) if(FirstChar=='[') { SelectedLevel++ BrugerInfo.TheLevel.selectedIndex=SelectedLevel LineNo++ SkrivEfterLag.innerText=TheLines[LineNo] eraseCookie(strLevel) SetCookie(strLevel,SelectedLevel,30); } SwitchBackFinger() tastkode=SkrivEfterLag.innerText.charCodeAt(0); ShowFinger(tastkode); FoersteGang=false; LayBogs.innerText=String.fromCharCode(tastkode).toUpperCase(); PositionPointer(tastkode,0); //skriv(tastkode); } function ReadTextFromIframe() { //txtinput er navnet på IFRAMEN innerText indeholder teksten txt = txtinput.document.body.innerText TheLines = txt.split('\r\n') SkriveLag.innerText='' FirstChar=SkrivEfterLag.innerText.charAt(0) if(FirstChar=='[') //Nyt stykke { SelectedLevel++; ReadTextFromIframe(); TheShowText='Sektion '+TheLines[LineNo-1].slice(1,TheLines[LineNo].length) document.title =TheShowText; BrugerInfo.TheLevel.options.selectedIndex=SelectedLevel; SelectOption(); } if(LineNo<2) { BrugerInfo.TheLevel.options.length=0; for(i=0;i<TheLines.length;i++) { FirstChar=TheLines[i].charAt(0) if(FirstChar=='[') { TheText=TheLines[i].split(']') //TheText=TheText[1].split(']') TheShowText='Sektion '+TheText[0].slice(1,TheText[0].length) addOption(BrugerInfo.TheLevel,i,TheShowText ); if(i==LineNo) { } } } if( FirstLoading) { FirstLoading=false; //Gets the cookie stored level SelectedLevel=GetCookie(strLevel); BrugerInfo.TheLevel.options.selectedIndex=SelectedLevel; SelectOption(); } Start(); } } function Start() { if (ShowPointer) { LaySkrEftPointer.style.visibility='visible' } else { LaySkrEftPointer.style.visibility='hidden' } FoersteGang=true; //First time variable TheFingersCount=0 //Reads in what to do tastkode=SkrivEfterLag.innerText.charCodeAt(0); skriv(tastkode); GetUsers(); VarArray= new Array(); var complete=false; if (recording) { fso = new ActiveXObject("Scripting.FileSystemObject"); } } function tom() { //empty function doing nothing //ShiftToNewLine(); UdgangStilling(); //witchBack=window.setTimeout('GetKeyBoard()',1000); } function SetCookie(name,value,days) { if (days) { var date = new Date(); date.setTime(date.getTime()+(days*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); } else var expires = ""; document.cookie = name+"="+value+expires+"; path=/"; //alert(name+' '+value) } function GetCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(";"); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) { //alert(name+' '+c.substring(nameEQ.length,c.length)) return c.substring(nameEQ.length,c.length); } } return null; } function eraseCookie(name) { SetCookie(name,"",-1); } /* function GetCookie(name) { var dcookie=document.cookie var cname=name+"=" var clen=dcookie.length var cbegin=0; while(cbegin<clen) { var vbegin=cbegin +cname.length; { var vend=dcookie.indexOf(";",vbegin); if (vend==-1) vend=clen; return unescape(dcookie.substring(vbegin,vend)); } cbegin=dcookie.indexOf(" ",cbegin)+1; if(cbegin==0) break; } return null; } function SetCookie(name,value,expires) { if(!expires) expires= new Date(); document.cookie = name+"="+escape(value) + "; expires="+expires.toGMTString()+"; path=/"; } function delCookie(name) { var expireNow=new Date() document.cookie=name+"="+";expires=Thu,01-Jan70 00:00:01 GMT"+"; path=/" } function SetCookieTime() { var expdate= new Date(); expdate.setTime(expdate.getTime()+(24*60*60*1000*90)); return expdate; } */ function SelectOption() { var SelectedLevel=0 SelectedLevel=BrugerInfo.TheLevel.selectedIndex var num; //Level bliver gemt i 3 måneder eraseCookie(strLevel) SetCookie(strLevel,SelectedLevel,30); if(BrugerInfo.TheLevel.selectedIndex>-1) { LineNo=BrugerInfo.TheLevel.options[BrugerInfo.TheLevel.selectedIndex].value*1 //if(BrugerInfo.TheLevel.selectedIndex<BrugerInfo.TheLevel.options.length+1) //BrugerInfo.TheLevel.options[BrugerInfo.TheLevel.selectedIndex+1].selected=true; BrugerInfo.TheLevel.options[BrugerInfo.TheLevel.selectedIndex].selected=true; TheSelectedText=BrugerInfo.TheLevel.options[BrugerInfo.TheLevel.selectedIndex].text document.title =TheSelectedText; } if(TheLines.length>=LineNo) { SkrivEfterLag.innerText=TheLines[LineNo*1 + 1].slice(0,MaxSkriveLength) } LaySkrEftPointer.innerText=SkrivEfterLag.innerText.slice(0,1); SkriveLag.innerText = '' FoersteGang=true; tastkode=SkrivEfterLag.innerText.charCodeAt(0); skriv(tastkode); BrugerInfo.TheLevel.blur(); UserLogin.style.visibility='visible' BrugerInfo.txtNyeBruger.focus(); BrugerInfo.txtNyeBruger.blur(); UserLogin.style.visibility='hidden' ShiftToNewLine(); //nødredning //ShowFinger(13) } function TheKeyDown() { ShiftIsDown=window.event.shiftKey AltIsDown=window.event.altKey tastkode=event.keyCode if(tastkode==32) { window.scrollTo(0,0); } if(tastkode==13) //New line { if(LineNo==0) LineNo++; ShiftToNewLine(); return; } if(tastkode==17)//altGr { AltGrOn=true } if(tastkode==8) { TheTxt=SkriveLag.innerText SkriveLag.innerText=TheTxt.slice(0,SkriveLag.innerText.length-1); TheCode=SkriveLag.innerText.charCodeAt(SkriveLag.innerText.length-1) tastkode=findTegn(TheCode) //alert(tastkode) } LayBogs.style.visibility = 'visible' window.clearTimeout TheFingersCount=0 window.clearTimeout(switchBack); skriv(tastkode) window.scrollTo(0,0) } function TheKeyUp() { tastkode=event.keyCode TheUpTegn=event.keyCode ShiftIsDown=window.event.shiftKey AltIsDown=window.event.altKey if(tastkode==17); { AltGrOn=false; } if(!ShiftIsDown) { DivShiftLeft.style.visibillity='hidden' } window.scrollTo(0,0) } function GetUsers() { var strPlayers='' strPlayers=GetCookie('Players') if(strPlayers) { Players=strPlayers.split('|'); for (i=0;i<Players.length;i++) { addOption(BrugerInfo.UserName,Players[i],Players[i]) } } } function addOption(oSelect,OptionValue,OptionText) { var oOption = document.createElement("OPTION"); oOption.text=OptionText; oOption.value=OptionValue; oSelect.add(oOption); } function findTastPos(tegn) { for(i=0;i<TasterPosition.length;i++) { if(tegn==TasterPosition[i].TheKeyCodeTxtLCase) { return TasterPosition[i].KeyCode; } if(tegn==TasterPosition[i].TheKeyCodeTxtUCase) { return TasterPosition[i].KeyCode; } if(tegn==TasterPosition[i].TheKeyCodeTxtAltGr) { return TasterPosition[i].KeyCode; } } return false; } function findTegn(tegn) { var TheFing=''; for(i=0;i<TasterPosition.length;i++) { if(TasterPosition[i].TheKeyCodeTxtLCase==tegn) {IsLCase=0; if(i<14) { KeyboardLetter=TasterPosition[i].TheKeyCodeTxtLCase } else { KeyboardLetter=TasterPosition[i].TheKeyCodeTxtUCase } if(ShiftIsDown) { WriteLetter=TasterPosition[i].TheKeyCodeTxtUCase } else { WriteLetter=TasterPosition[i].TheKeyCodeTxtLCase } return TasterPosition[i].KeyCode; } if(TasterPosition[i].TheKeyCodeTxtUCase==tegn) { IsLCase=1; if(i<14) { KeyboardLetter=TasterPosition[i].TheKeyCodeTxtUCase } else { KeyboardLetter=TasterPosition[i].TheKeyCodeTxtUCase } if(ShiftIsDown) { WriteLetter=TasterPosition[i].TheKeyCodeTxtUCase } else { WriteLetter=TasterPosition[i].TheKeyCodeTxtLCase } return TasterPosition[i].KeyCode; } if(TasterPosition[i].TheKeyCodeTxtAltGr==tegn) {IsLCase=2; if(i<14) { KeyboardLetter=TasterPosition[i].TheKeyCodeTxtLCase } else { KeyboardLetter=TasterPosition[i].TheKeyCodeTxtUCase } if(ShiftIsDown) { WriteLetter=TasterPosition[i].TheKeyCodeTxtUCase } else { WriteLetter=TasterPosition[i].TheKeyCodeTxtLCase } WriteLetter=TasterPosition[i].TheKeyCodeTxtAltGr; if(AltGrOn) { return TasterPosition[i].KeyCode; } else { return tegn; } } //TheKeyCodeTxtLCase //TheKeyCodeTxtUCase //TheKeyCodeTxtAltGr } //alert(tegn) //Default: KeyboardLetter=tegn; WriteLetter=tegn; return tegn; } function findTast(tegn) { for(i=0;i<TasterPosition.length;i++) { if(TasterPosition[i].KeyCode==tegn) { if(i<13||i==41) { return TasterPosition[i].TheKeyCodeTxtLCase } else { return TasterPosition[i].TheKeyCodeTxtUCase } } } } function advance(tegn) { } function RecordInactive() { this.KeyCode=event.keyCode } function CheckIfUpper(tegn,EnteredKey) { if(EnteredKey==32) return true; var UpperCase; //17,778,364,R5 //17,76,369,L5 //16,706,313,R5 //16,74,317,L5 DivShiftRight.style.visibility='hidden' DivShiftLeft.style.visibility='hidden' T=findTegn(EnteredKey) switch (IsLCase) { case 0: break; case 1: if(!isNaN(Tegn2Index[EnteredKey])) { TheFing=TasterPosition[Tegn2Index[EnteredKey]].Finger if(TheFing.charAt(0)=='L') { ShowFinger(16) DivShiftRight.style.visibility='visible' //User right hand if hand is left DivShiftRight.style.top=270*factor//+285-KeybTop DivShiftRight.style.left=706*factor//+325-KeybLeft } else { ShowFinger(316) //left shift key DivShiftLeft.style.visibility='visible' DivShiftLeft.style.top=275*factor DivShiftLeft.style.left=77*factor DivShiftLeft.style.width=38*factor } } break; case 2: ShowFinger(18) break; }//switch return true; } function UdgangStilling() { RightHandDiv.style.left=425* factor +"px"; RightHandDiv.style.top =230 * factor +"px"; LeftHand.src="LClosed.gif"; RightHand.src="RClosed.gif"; LeftHandDiv.style.left=180*factor + "px"; LeftHandDiv.style.top =230*factor + "px"; } function skriv(tegn) { var ThisLetter1=0; if(RecordInactiveCodes) { InactiveCodes[InactiveCodes.length]=new RecordInactive return false; } for(i=0;i<InactiveCodes.length;i++) { if(tegn==InactiveCodes[i]) {IsLCase=3; return false; } } if(SkriveLag.innerText.length>MaxSkriveLength) { SkriveLag.innerText=''; } if(recording) { WriteLetters.style.visibility='visible' WriteLetters.style.top ='235px' LastChar=tegn } else { if(tegn!="") { var txt var template; var TEMPLATE; txt=SkriveLag.innerText; TheText=String.fromCharCode(tegn) TheLen=SkriveLag.innerText.length if(TheLen<SkrivEfterLag.innerText.length) { ThisCharCode=SkrivEfterLag.innerText.charCodeAt(TheLen) if(!FoersteGang) { NextCharCode=SkrivEfterLag.innerText.charCodeAt(TheLen+1) } else { NextCharCode=ThisCharCode } ThisLetter=findTegn(tegn) if(SpecialKeyPushSeq==0) //Special tegn er en sekvens af 3 anslag { NextLetter=findTegn(NextCharCode) NextWriteLetter=WriteLetter ThisCharCode=findTegn(ThisCharCode) ThisKeyLetter=KeyboardLetter ThisWriteLetter=WriteLetter SwitchBackFinger() } if(SpecialKeyPushSeq==1) { SpecialKeyPushSeq=2 NextLetter=SpecialChars[SpecialKeyPushed].TypeLetterCode ThisLetter1=SpecialChars[SpecialKeyPushed].TypeFirstCode ThisCharCode=findTastPos(ThisLetter1) ThisKeyLetter=SpecialChars[SpecialKeyPushed].TypeLetterCode ThisWriteLetter=SpecialChars[SpecialKeyPushed].TypeLetterCode NextWriteLetter=SpecialChars[SpecialKeyPushed].TheCharCode tastkode=tegn SwitchBackFinger() ShowFinger(NextLetter); LayBogs.innerText=String.fromCharCode(NextLetter) return; } if(SpecialKeyPushSeq==2) { tastkode=tegn SpecialKeyPushSeq=0 SpecialChars[SpecialKeyPushed].TypeLetterCode ThisKeyLetter=SpecialChars[SpecialKeyPushed].TypeLetterCode ThisCharCode=findTastPos(SpecialChars[SpecialKeyPushed].TypeLetterCode) NextLetter=findTegn(NextCharCode) NextWriteLetter=WriteLetter ThisWriteLetter=SpecialChars[SpecialKeyPushed].TheCharCode } //Check om man har tastet rigtigt if((ThisCharCode==tastkode||FoersteGang)) { if(FoersteGang) { StartCounter() } else { if(SpecialKeyPushSeq==0 ) { SkriveLag.innerText+=String.fromCharCode(ThisWriteLetter) } } TheLen=SkriveLag.innerText.length FoersteGang=false; if(isNaN(NextCharCode)) { //end of line ShowFinger(13) LayBogs.innerText='<'+String.fromCharCode(172) LayBogs.style.backgroundColor="#32cd32" return false; } TheCheck=CheckIfUpper(tegn,NextCharCode) if(isNaN(Tegn2Index[NextLetter])) { for(i=0;i<SpecialChars.length;i++) { if(SpecialChars[i].TheCharCode==NextLetter) { NextLetter=SpecialChars[i].TypeFirstCode SpecialKeyPushed=i SpecialKeyPushSeq=1 } } } ShowFinger(NextLetter); LayBogs.style.backgroundColor=FingerTips[Fingre2Index[TheFinger]].BgColor PositionPointer(NextCharCode,TheLen); if(NextCharCode==32) { LaySkrEftPointer.style.backgroundColor='#DFDFFF' //LaySkrEftPointer.innerText ='' KeyboardLetter=32 } else { LaySkrEftPointer.style.backgroundColor='#F0F0FF' } if(SpecialKeyPushSeq==0) { LayBogs.innerText=String.fromCharCode(KeyboardLetter) } if(SpecialKeyPushSeq==1) { LayBogs.innerText=String.fromCharCode(NextLetter) } if(SpecialKeyPushSeq==2) { LayBogs.innerText=String.fromCharCode(ThisKeyLetter) } RightHitStatistics[RightHitStatistics.length] = new UpdateStatistics('true',tegnet); MakeStats(); } else {//wrong key //Tastet forkert WrongKey(); } } else//Thelen { ShiftToNewLine(); } } } } function PositionPointer(NextCharCode,PointAt) { LaySkrEftPointer.style.top =0 LaySkrEftPointer.style.left =48+(PointAt)*SkrEftMellemRum*1; EtTegn=String.fromCharCode(NextCharCode); LaySkrEftPointer.innerText=EtTegn; } function WrongKey() { SpecialKeyPushSeq=0; FoersteGang=false; TheCharCode=findTast(tastkode); ShowFinger(tastkode); SwitchBackFinger(); LayBogs.innerText= String.fromCharCode(TheCharCode); WrongHitStatistics[WrongHitStatistics.length]= new UpdateStatistics(false,String.fromCharCode(TheCharCode)) LayBogs.style.backgroundColor='#FF0000' lyd.src='forkert.wav' MakeStats(); } function ShowFinger(TheLetter) { var OfsLeft=0; var OfsTop=0; var TheLeftSide; if(TheLetter==0) return false; if(isNaN(TheLetter)) return false; TheFinger=TasterPosition[Tegn2Index[TheLetter]].Finger TheFingersCount++; LayBogs.style.left=TasterPosition[Tegn2Index[TheLetter]].Xpos*1+KeybLeft*1 LayBogs.style.top =TasterPosition[Tegn2Index[TheLetter]].Ypos*1+KeybTop*1 LayBogs.style.zIndex = 102 if(TheFinger.charAt(0)=='L') { OfsLeft= 105*factor - FingerTips[Fingre2Index[TheFinger]].Xpos+KeybLeft*1; OfsTop= 295*factor-FingerTips[Fingre2Index[TheFinger]].Ypos+KeybTop*1; if(Grafik) { LeftHand.src=TheFinger+'.gif' LeftHandDiv.style.left =TasterPosition[Tegn2Index[TheLetter]].Xpos*factor+OfsLeft*factor; LeftHandDiv.style.top =TasterPosition[Tegn2Index[TheLetter]].Ypos*factor+OfsTop*factor; } } if(TheFinger.charAt(0)=='R') { OfsLeft=315*factor-FingerTips[Fingre2Index[TheFinger]].Xpos*factor+KeybLeft; OfsTop=280*factor-FingerTips[Fingre2Index[TheFinger]].Ypos*factor+KeybTop; if(Grafik) { RightHand.src=TheFinger+'.gif'; RightHandDiv.style.left =TasterPosition[Tegn2Index[TheLetter]].Xpos*factor+OfsLeft; RightHandDiv.style.top =TasterPosition[Tegn2Index[TheLetter]].Ypos*factor+OfsTop; if(OfsLeft>-120) { LeftHandDiv.style.left=100*factor; } } } if(TheLetter==32) { RightHandDiv.style.left =TasterPosition[Tegn2Index[TheLetter]].Xpos*factor+TasterPosition[Tegn2Index[TheLetter]].Width*factor/2 LayBogs.style.width=250*factor; LayBogs.style.left=295*factor; LayBogs.innerText ='SPACE' } else { LayBogs.style.width=TasterPosition[Tegn2Index[TheLetter]].Width; } //switchBack=setTimeout('SwitchBackFinger('+TheLetter+');',TimeOn); } function UpdateStatistics(RightHit,Letter) { var SinceLast=0; Nu = new Date() if(LastRightHit!=0) { RightHit?SinceLast=Nu-LastRightHit:SinceLast=Nu-LastWrongHit; } else { SinceLast=0; } this.Letter=Letter; this.HitTime=SinceLast; if(RightHit) { LastRightHit=new Date() } else { LastWrongHit=new Date() } return true; } function ResetStats() { if(RecordInactiveCodes) { fso = new ActiveXObject("Scripting.FileSystemObject"); txt=fso.CreateTextFile("c:/Inactive.txt") for(i=0;i<InactiveCodes.length;i++) { txt.write(InactiveCodes[i].KeyCode+',') } } var Sum=0; var VarIance=0; var Aver=0; var TheAverage=0; var AnslagPrMinut=0; var Sigma=0; LastRightHit=new Date(); LastRightHit=new Date(); RightHitStatistics = new Array; WrongHitStatistics= new Array; MakeStats(); } function MakeSpecialChars(TheCharCombination) //Makes an object containing specialchars { var TheChars TheChars = TheCharCombination.split(",") this.TheCharCode=TheChars[0].charCodeAt(0) this.TypeFirstCode=TheChars[1].charCodeAt(0) this.TypeLetterCode=TheChars[2].charCodeAt(0) this.TheChar=TheChars[0].charAt(0) } function MakeTaster(TastPos,LetterType,i) {//makes an object array containing tasts //0 KeyCode, 1 XPos, 2 YPos, 3 Finger, 4 TheLetter, IndHold=TastPos.split(',') this.Xpos=IndHold[1]*factor; this.Ypos=IndHold[2]*factor; this.Width=IndHold[3]*factor; this.Finger=IndHold[4]; this.TheLetter=IndHold[5]; this.BgColor = IndHold[6];//used only for Fingre but in order to keep continuity if (IndHold.length>6) { this.TheKeyCodeTxtLCase=IndHold[7] this.TheKeyCodeTxtUCase=IndHold[8] this.TheKeyCodeTxtAltGr=IndHold[10] } //this.Bogstav =IndHold[1]; this.KeyCode=IndHold[0]; this.OldKeyCode=IndHold[0]; //der laves opslagsværk til tabellen denne funktion bruges af både taster og fingre switch(LetterType) { case 'Taster': Index2Tegn[i]=IndHold[0] Tegn2Index[IndHold[0]]=i if (IndHold.length>5) { Index2Tegn[i]=IndHold[7] Tegn2Index[IndHold[7]]=i Index2Tegn[i]=IndHold[8] Tegn2Index[IndHold[8]]=i Index2Tegn[i]=IndHold[10] Tegn2Index[IndHold[10]]=i } if(IndHold[0]>64 && IndHold[0]<96) Tegn2Index[IndHold[0]*1+32*1]=i; break; case 'Fingre': Fingre2Index[IndHold[4]]=i this.BgColor=IndHold[6] break; } } function MakeStats() { var Sum=0; var VarIance=0; var Aver=0; var TheAverage=0; var AnslagPrMinut=0; var FejlStreng='' var Sigma=0; for(i=0;i<RightHitStatistics.length;i++) { Aver+=RightHitStatistics[i].HitTime } if(RightHitStatistics.length>1) { TheAverage=Aver/(RightHitStatistics.length-1); } for(i=1;i<RightHitStatistics.length;i++) { Sum=(RightHitStatistics[i].HitTime-TheAverage); VarIance+=Math.pow(Sum,2); } for(i=0;i<WrongHitStatistics.length;i++) { FejlStreng+=WrongHitStatistics[i].Letter } if(RightHitStatistics.length>1) { VarIance/=RightHitStatistics.length-1 Sigma=Math.sqrt(VarIance) Sigma=Math.round(Sigma) Sigma/=1000 if(TheAverage!=0) AnslagPrMinut=Math.round(60000/TheAverage); } else { VarIance=0; AnslagPrMinut=0; } AntalFejl=WrongHitStatistics.length resultat=DefaultKeyBoard.match(/Dansk/) if(resultat) { DivStatistics.innerText='Anslag per Minut: '+AnslagPrMinut+'\nAntal fejl:'+WrongHitStatistics.length+'\nStandard afvigelse :\n'+Sigma+' sekunder\nfejl:\n'+FejlStreng; } else { DivStatistics.innerText='Hits per Minute: '+AnslagPrMinut+'\n# errors:'+WrongHitStatistics.length+'\nStandard deviation :\n'+Sigma+' seconds\nError sequence:\n'+FejlStreng; } } function StartCounter() { //alert(StartTime.getMinutes()+'.'+StartTime.getSeconds()+'.'+StartTime.getMilliseconds()) } function SwitchBackFinger() { LeftHandDiv.style.top =DivLayTop; LeftHandDiv.style.left =LeftHandDivLeft; RightHandDiv.style.left =RightHandDivLeft; RightHandDiv.style.top =DivLayTop; LeftHand.src="LClosed.gif"; RightHand.src="RClosed.gif"; //if(TheFingersCount<NumberOfCounts) switchBack=setTimeout('ShowFinger('+TheLetter+');',TimeOff); } function resetKey() { if(event.keyCode==16) storeBogstaver=!storeBogstaver; SwitchBackFinger(); tastOp=true; return false; } function TastTilTegn() { if (window.event.shiftKey ) { storeBogstaver=!storeBogstaver; return false; } if (event.keyCode==255) return false; //Windows key if ((tastOp && event.keyCode!=16) || (event.keyCode!=tastkode)) tastOp=false; else return false; if (event.keyCode!=113 && event.keyCode!=118 && event.keyCode!=119) { clearTimeout(PAUSE); clearTimeout(START); clearTimeout(MATCH); clearTimeout(ANIMER); clearTimeout(LYD); lyd.src="silent.wav"; c=65; if (initRuns) { skriv(""); initRuns=false; } } tegnet='' tastkode=event.keyCode; tastkode=event.keyCode LayBogs.style.visibility = 'visible' window.clearTimeout TheFingersCount=0 window.clearTimeout(switchBack); skriv(tastkode) } function recordMouse() { //alert } var tempX=0; var tempY=0; function getMouseXY(e) { // grab the x-y pos.s if browser is IE tempX = event.clientX + document.body.scrollLeft tempY = event.clientY + document.body.scrollTop VarArray[VarArray.length] = new storeVars } function CheckTegn(BogstavetNo) { switch(BogstavetNo) { case '222': LayBogs.innerText=String.fromCharCode(216); tastkode=216 break; case '192': LayBogs.innerText=String.fromCharCode(198); tastkode=198 break; case '221': LayBogs.innerText=String.fromCharCode(197); tastkode=197 break; case '220': LayBogs.innerText=String.fromCharCode(189); tastkode=189 if(event.shiftKey) tegnet='§'; break; case '219': if(event.shiftKey) tegnet='`'; else tegnet='´'; break; break; case '187': if (event.shiftKey) { tegnet='?' } else { tegnet='\+' } break; case '9': LayBogs.innerText='->|' tastkode=32 break; case '20': LayBogs.innerText='Caps' storeBogstaver=!storeBogstaver tastkode=0 break; case '16': LayBogs.innerText='Shift' tastkode=0 return false; break; case '17': LayBogs.innerText='Ctrl' tastkode=0 break; case '18': LayBogs.innerText='Alt' tastkode=0 break; case '8': //Delete LayBogs.innerText='<=' SkriveLag.innerText= SkriveLag.innerText.substring(0,SkriveLag.innerText.length-1) tastkode=0 break; case '219': LayBogs.innerText='\'' break; case '191': if (event.shiftKey) { tegnet='*' } else { tegnet='\'' } break; case '186': tegnet='\¨' break; case '189': tegnet='-' break; case '190': tegnet='.' break; case '188': tegnet=',' break; case '226': if(event.shiftKey) tegnet='\>' else tegnet ='\<'; break; case '32': //SPACE LayBogs.innerText=' ' break; default: tegnet=String.fromCharCode(BogstavetNo) break; } return tastkode; } function toggleCase() { storeBogstaver=!storeBogstaver; if (storeBogstaver) { } } function storeKeys() { } function ClickHand() { tastkode=LaySkrEftPointer.innerText.charCodeAt(0) skriv(tastkode) LeftHandDiv.style.visibility='hidden' RightHandDiv.style.visibility='hidden' } function ClickTheLetter(TheI) { var OldCode OldCode=TasterPosition[TheI].KeyCode; //when clicking on a letter if(recording) { TheText=Skrive.txtBogs.value if(TheText.length==3) { TasterPosition[TheI].KeyCode=TheUpTegn TasterPosition[TheI].TheKeyCodeTxtAltGr=TheText.charCodeAt(0) TasterPosition[TheI].TheKeyCodeTxtUCase=TheText.charCodeAt(1) TasterPosition[TheI].TheKeyCodeTxtLCase=TheText.charCodeAt(2) } if(TheText.length==2) { TasterPosition[TheI].KeyCode=TheUpTegn TasterPosition[TheI].TheKeyCodeTxtUCase=TheText.charCodeAt(0) TasterPosition[TheI].TheKeyCodeTxtLCase=TheText.charCodeAt(1) TasterPosition[TheI].TheKeyCodeTxtAltGr='' //alert(tastkode+' | '+TheText.charCodeAt(0) + ' ' + TheText.charCodeAt(1)) } if(TheText.length==1) { TasterPosition[TheI].TheLetter=String.fromCharCode(TheUpTegn); TasterPosition[TheI].KeyCode=TheUpTegn TasterPosition[TheI].TheKeyCodeTxtUCase='' TasterPosition[TheI].TheKeyCodeTxtLCase=TheText.charCodeAt(0) TasterPosition[TheI].TheKeyCodeTxtAltGr='' //alert(tastkode+' | '+TheText.charCodeAt(0) + ' ' + TheText.charCodeAt(1)) } LayKeybName.innerText='Old ' + OldCode + ' New: ' +TheUpTegn //Update the keyboard WriteKeyBoard(); Skrive.txtBogs.value='' Skrive.txtBogs.focus(); } else //!recording { if(Debugging) { alert('x:'+ TasterPosition[TheI].Xpos+' y:'+TasterPosition[TheI].Ypos+'\n'+ TheI+' Code('+TasterPosition[TheI].KeyCode +') '+String.fromCharCode(TasterPosition[TheI].TheKeyCodeTxtUCase) +' ('+ TasterPosition[TheI].TheKeyCodeTxtUCase+') '+String.fromCharCode(TasterPosition[TheI].TheKeyCodeTxtLCase)+' ('+TasterPosition[TheI].TheKeyCodeTxtLCase+') '+String.fromCharCode(TasterPosition[TheI].TheKeyCodeTxtAltGr)+'('+ TasterPosition[TheI].TheKeyCodeTxtAltGr+')' ) RightHandDiv.style.visibility='hidden' LeftHandDiv.style.visibility='hidden' } else { tastkode=TasterPosition[TheI].KeyCode if(tastkode==13) { ShiftToNewLine(); } skriv(tastkode) } } } function storeVars() { this.MouseX=tempX; this.MouseY=tempY; this.KeyCode=tastkode; this.Bogstav=LastChar; } function WriteAllLetters() { fso = new ActiveXObject("Scripting.FileSystemObject"); TheFile='c:\\'+Skrive.KeybName.value+'KeyBoard.txt' txt=fso.CreateTextFile(TheFile) for(i=0;i<TasterPosition.length-1;i++) { if (TasterPosition[i].TheKeyCodeTxtAltGr) { TheAltCode=TasterPosition[i].TheKeyCodeTxtAltGr } else { TheAltCode='' } txt.write(TasterPosition[i].KeyCode+','+TasterPosition[i].Xpos+','+TasterPosition[i].Ypos+','+TasterPosition[i].Width+','+TasterPosition[i].Finger+','+TasterPosition[i].TheLetter+','+TasterPosition[i].BgColor+','+TasterPosition[i].TheKeyCodeTxtLCase+','+TasterPosition[i].TheKeyCodeTxtUCase+','+TasterPosition[i].TheKeyCodeTxtLCase+','+TheAltCode+'|') } alert('Please copy the file '+TheFile+' to default directory \n you should also create a file called '+Skrive.KeybName.value+'Text.txt in default directory\nThis file should contain the exeresises') txt='' TheFile='c:\\KeyBoards.txt' txt=fso.CreateTextFile(TheFile) txt.writeline(Skrive.KeybName.value) for(i=0;i<Select1.length;i++) { txt.writeline(Select1.options[i].value) } txt='' } function ShowPopMenu() { if(PopMenu.style.visibility=='hidden') { PopMenu.style.visibility='visible' } else { PopMenu.style.visibility='hidden' } } function RecordTextOnOff() { if(LayWriteText.style.visibility=='hidden') { LayerInfo.style.visibility='hidden' LayWriteText.style.visibility='visible' switch (DefaultKeyBoard) { case "Dansk": LetterLearnSequence="FJKASDKLÆFUJFJRERTKJIODSDFENKVMLERTUBVNIOWMNBVCXZPQWÅØ,." break; case "French": LetterLearnSequence="FJKLSEADQMURVNCNWABGHIEOZX'èàçé" break; case "Russian": LetterLearnSequence="#("!,&)'%/.-&%*" break; case "German": LetterLearnSequence="FJKDASKLÖQWERTUZIOPÜÄXYCVNBM" break; case "Svenska": LetterLearnSequence="FJKDSLÖAURNVBGHIEWOXZÖQÄWOPÅ" default: LetterLearnSequence="FJKASDKLFUJFJRERTKJIODSDFENKVMLERTUBVNIOWMNBVCXZPQW" break; } txtLearnSeq.value =LetterLearnSequence RawTxtPosition.value = DefaultKeyBoard + 'Raw.txt' } else { LayWriteText.style.visibility='hidden' LayerInfo.style.visibility='visible' } } function RecordingOnOff() { if(txtBogs.style.visibility=='hidden') { recording=true; txtBogs.style.visibility='visible'; WriteLetters.style.visibility='visible' } else { txtBogs.style.visibility='hidden'; WriteLetters.style.visibility='hidden' recording=false; } } function DebugOnOff() { if(Debugging) { //debugHref.Text='Off' Debugging=false; } else { Debugging=true; } } function ShowModifyKeyboard() { if(SelectKeyBoards.style.visibility=='hidden') { SelectKeyBoards.style.visibility='visible' SelectKeyBoards.style.top ='378px' } else { SelectKeyBoards.style.visibility='hidden' } } function WriteTheTextFile() { LetterLearnSequence=txtLearnSeq.value.toLowerCase(); IframeRawTxtDiv.innerHTML='<iframe id=IfrRawTxt onload=ReadInTextFile(); src='+RawTxtPosition.value+' ></iframe>' } function ReadInTextFile() { var count=0; var BigCount=1; OutLine='' TheTxt=IfrRawTxt.document.body.innerText; SpecialLettersAll=TheText.split('\n') SpecialLettersRexExp=SpecialLettersAll[0] TheTxt=OrderText(TheTxt) //TheTxtArray=TheTxt.split(' ') TheTxtArray=TheTxt.split('\n') for(i=0;i<LetterLearnSequence.length/2;i++) { count++ ThePos=i*2 NewLetters=LetterLearnSequence.slice(ThePos,ThePos+2*1) OldLetters=LetterLearnSequence.slice(0,ThePos) TheMatching=CheckIfIn(NewLetters,OldLetters,TheTxtArray) OutLine +='['+BigCount+'.'+count+' '+NewLetters+']'+'\r\n' if(TheMatching.length>3) { OutLine +=OnlyNewLetters(NewLetters)+'\r\n' OutLine +=MakeWordLine(TheMatching)+'\r\n'; OutLine +=MakeWordLine(TheMatching)+'\r\n'; OutLine +=MakeWordLine(TheMatching)+'\r\n'; } else { OutLine +=OnlyNewLetters(NewLetters)+'\r\n' OutLine +=NewLettersLines(NewLetters,OldLetters)+'\r\n' OutLine +=NewLettersLines(NewLetters,OldLetters)+'\r\n' } if(count>4) { count=0 BigCount++ } } WriteTextFile() } function MakeWordLine(MachedArray) { //Makes a line with preselected words from the MachedArray of words var counter=0; var TheLine=''; TempMaxSkriveLenght=MaxSkriveLength; while(TheLine.length<TempMaxSkriveLenght) { TempMaxSkriveLenght=MaxSkriveLength; TheIndex=Math.floor(Math.random()*MachedArray.length) TheWord=MachedArray[TheIndex] if(TheLine.length*1+TheWord.length*1>MaxSkriveLength) { TempMaxSkriveLenght=MaxSkriveLength-TheWord.Length-1 //in order to exit while } else { if(TheLine.length>0) { TheLine+=' '+TheWord } else { TheLine=TheWord } } } return TheLine; } function CheckIfIn(NewLetters,OldLetters,TheTxtArray) { //Makes a list of words var MatchedArray MatchedArray= new Array; var TheMatch=true; for(l=0;l<TheTxtArray.length;l++) { TheMatch=true; ToCheck=OldLetters+NewLetters for(m=0;m<TheTxtArray[l].length;m++) {//Must be within known letters TheLet=TheTxtArray[l].charAt(m) re=new RegExp(TheLet) if(!ToCheck.match(re)) { TheMatch=false; } } TheLet1=NewLetters.charAt(0) TheLet2=NewLetters.charAt(1) TheLet3=NewLetters.charAt(1) Test = TheLet1+'|'+TheLet2+'|'+TheLet3 re=new RegExp(Test); if(!TheTxtArray[l].match(re)) { //Either one or the other new letter should be in TheMatch=false; } if(TheTxtArray[l].length<2) { //Either one or the other new letter should be in TheMatch=false; } for(p=0;p<MatchedArray.length;p++) {//Dont include copies if(MatchedArray[p]==TheTxtArray[l]) { TheMatch=false } } if(TheMatch) { MatchedArray[MatchedArray.length]=TheTxtArray[l] } } //alert('# word found for the letters: '+NewLetters+' '+MatchedArray.length) return MatchedArray; } function OnlyNewLetters(NewLetters) { counter1=0 var TheLine='' while(TheLine.length<MaxSkriveLength) { counter1++ ThePos=Math.floor(NewLetters.length*Math.random()) if(TheLine.length>0) { //Avoid double letters LenMinus1=TheLine.length-1 if(NewLetters.charAt(ThePos)!=TheLine.charAt(LenMinus1)) { TheLine+=NewLetters.charAt(ThePos) } } else { TheLine+=NewLetters.charAt(ThePos) } TheCountLimit=Math.floor(3*Math.random())+2*1 if(counter1>TheCountLimit) { counter1=0 if(TheLine.length<MaxSkriveLength-1) { TheLine+=' '; } } } return TheLine; } function NoGrafik() { Grafik=!Grafik; UdgangStilling(); if(Grafik) { LeftHandDiv.style.visibility ="visible" RightHandDiv.style.visibility ="visible" Both.style.visibility='hidden'; } else { LeftHandDiv.style.visibility ="hidden" RightHandDiv.style.visibility ="hidden" Both.style.visibility='visible'; } } function NewLettersLines(NewLetters,OldLetters) { counter=0 var TheLine='' while(TheLine.length<MaxSkriveLength) { counter++ Valg=Math.random() if(Valg>0.5) { ThePos=Math.floor(NewLetters.length*Math.random()) TheLine+=NewLetters.charAt(ThePos) } else { ThePos=Math.ceil(OldLetters.length*Math.random()) TheLine+=OldLetters.charAt(ThePos) } TheCountLimit=Math.floor(3*Math.random())+2*1 if(counter>TheCountLimit) { counter=0 if(TheLine.length<MaxSkriveLength-1) { TheLine+=' '; } } } return TheLine; } function WriteTextFile() { var txtFile txtFile='C:\\'+ DefaultKeyBoard + 'Text.txt' fso = new ActiveXObject("Scripting.FileSystemObject"); txt=fso.createtextfile(txtFile,true,true) txt.write(OutLine) txt='' alert('The created file ' +txtFile+ ' should be copied to default directory') } function OrderText(TheTxt) { //alert(TheTxt) regex= /\r\n/ TheTxt=TheTxt.replace(regex,'') regex= /\r/ TheTxt=TheTxt.replace(regex,'') regex= /\n/ TheTxt=TheTxt.replace(regex,'') TheTxt=TheTxt.replace(/[.]/g,' ') //regex=new RegExp(/[^a-zA-Z0-9åæøÆÅØäöüÜÄÖáçÉèéù ]/g) switch(DefaultKeyBoard) { case 'russian': TheTxt=TheTxt.replace(/[^9FC:5=3HI7EJDK20?@>;46MOGA<8BL1NQ&#()%*$+ -/'!",. ]/g,'') break; case 'dansk': TheTxt=TheTxt.replace(/[^a-zA-Z0-9åæøÆÅØäöüÜÄÖáçÉèéùê ]/g,'') break; case 'french': TheTxt=TheTxt.replace(/[^a-zA-Z0-9åæøÆÅØäöüÜÄÖáçÉèéùê ']/g,'') LetterLearnSequence="FJKLSEADQMURVNCNWABGHIEOZX'èàçé" break; default: TheTxt=TheTxt.replace(/[^a-zA-Z0-9åæøÆÅØäöüÜÄÖáçÉèéùê ']/g,'') break; } TheTxt=TheTxt.replace(/ /g,' ') alert(TheTxt) //regex=/[.]/ //TheTxt=TheTxt.replace(/[.()]/g,'') //TheTxt=TheTxt.replace(/[(]/g,'') //TheTxt=TheTxt.replace(/[)]/g,'') //regex= /\?/g //TheTxt=TheTxt.replace(regex,'') return TheTxt; } document.onkeydown = TheKeyDown; document.onkeyup = TheKeyUp; document.onmousedown = getMouseXY; </script> <style type="text/css"> .Letter { font-family: Arial, Helvetica, sans-serif; font-size: 12pt; color: #3333FF; font-weight: bold} .cour { font-family: "Courier New", Courier, mono; font-size: 18pt; font-style: normal; font-weight: 700; color: #0000FF; font-variant: normal; text-transform: none; line-height: normal; letter-spacing: 3px} .courRed { font-family: "Courier New", Courier, mono; font-size: 18pt; font-style: normal; font-weight: 700; color: #FF6699; font-variant: normal; text-transform: none; line-height: normal; letter-spacing: 3px } </style> <LINK href="FH.css" rel="stylesheet"> <script id="clientEventHandlersJS" language="javascript"> <!-- function NyBruger_onclick() { var strUsers Expires=SetCookieTime(); strUsers=BrugerInfo.txtNyeBruger.value; for(i=0;i<BrugerInfo.UserName.options.length;i++) { strUsers+='|'+BrugerInfo.UserName.options[i].value; alert(strUsers) Players=strUsers.split('|'); } SetCookie('Players',strUsers,10); //addOption(BrugerInfo.UserName,BrugerInfo.txtNyeBruger.value,BrugerInfo.txtNyeBruger.value); } //initall();init1();init();initKeyBoard(); //--> </script> </head> <body onload="BodyOnLoad()" bgColor="#ffffff"> <div id="LayWriteText" style="Z-INDEX: 124; LEFT: 740px; VISIBILITY: hidden; WIDTH: 200px; POSITION: absolute; TOP: 334px; HEIGHT: 1px"> <p>Letter Learning Sequence</p> <p> <input name="txtLearnSeq" > </p> <p>Text file for words<br> (Fill this file with as many words as possible)</p> <p> <input name="RawTxtPosition" > </p> <p> <input type="button" name="button" onclick="WriteTheTextFile();" value="Write Text file"> </p> </div> <div id="Help" style="Z-INDEX: 2; LEFT: 3px; VISIBILITY: hidden; WIDTH: 620px; POSITION: absolute; TOP: 0px; HEIGHT: 264px"> <A onmouseup=hideBogs(); href="#">luk</A> <A onmouseup=shiftLan() href="#">english</A> <IMG src="udgangstilling.jpg" > </div> <div id="HelpEng" style="Z-INDEX: 2; LEFT: 3px; VISIBILITY: hidden; WIDTH: 620px; POSITION: absolute; TOP: 0px; HEIGHT: 264px"> <A onmouseup=shiftLan();hideBogs() href="#">close help</A> <A onmouseup=shiftLan() href="#">dansk</A> <IMG src="udgangstilling.jpg" > </div> <div id="HelpText1" style="Z-INDEX: 1; LEFT: 620px; VISIBILITY: hidden; WIDTH: 370px; POSITION: absolute; TOP: 0px; HEIGHT: 10px "> Skrivemaskinen er til for at lære at skrive 10 fingers "blindskrift" dvs. du lærer at skrive uden at kigge på tasterne. Når du skriver skal dine 10 fingre ligge på tasterne "A S D F" og "J K L Æ" med ventre pegefinger på F og højre pegefinger på J læg mærke til at der på de fleste keyboard er en lille forhøjelse sådan at du kan føle at J og K er hjemme i udgangspostionen. <P></P> For at gøre det mere tydeligt hvilken finger du skal bruge, peger dette program med fingerne på den tast som du skal bruge. I virkeligheden bør du lade fingrene ligge tilbage så tæt på udgangspunktet som mulig, sådan at du kan skrive så hurtigt som muligt. Prøv at skrive så jævnt som muligt. Når du er færdig med en øvelse så vælg en ny på listen længst nede til højre på skærmen. Programmet gemmer hvor langt du er kommet, sådan at du kan komme videre fra det niveau du er kommet til. (for at gemme skal du vælge det nieveau du er kommet til, i listen en ekstra gang. <A title="du kan skrive til mig ved at klikke her" href="mailto:oleq@post8.tele.dk" >Jeg er meget interesseret i at høre hvordan det går</A>forslag til forbedringer er jeg faktiskt ikke så interesseret i. Jeg har selv et antal på hylden, men jeg har ikke tid til at få dem lavet. Derimod vil jeg gerne høre om når du har lært og kommet videre med kurset. Og hvis du gider at sende mig en forbedret text. (Download programmet og send mig en opdateret DanskText.txt fil.) Hvis du selv retter i koden, er jeg selvfølgelig også interesseret i at få resultatet. <a href=SkriveKursus.zip>Du kan downloade kurset her</a> Når du kører lokalt kommer du til at godkende sikkerhedsanmodningen hver gang du kører. </div> <div id="HelpTextEng" style="Z-INDEX: 1; LEFT: 630px; VISIBILITY: hidden; WIDTH: 380px; POSITION: absolute; TOP: 0px; HEIGHT: 10px"> <h2>Learn typewriting</h2> With this litle program you can increase your typewriting speed by beeing able to type without having to look at the keyboard.<br>This self teaching machine typing program has the possibillity of shifting between several keyboards. Click on the menu and select. Keyboard You can also make your own keyboard. <P></P>For using the program select the correct level in the drop down. If you do not have enough exersizes in your language. Get a friend to make a file called LanguageText.txt with some words in your language. <P></P> Look at the screen while you are typing. The fingers are pointing on the letters in order to make it clear which finger you should use. In reality you should hold your hand like on the picture here to the left, and try to avoid "pointing" while writing. Follow the sequence of exercises. Practice every day 10-15 minutes, and you will master type writing in a period of 1-3 month. </div> <div id="SelectKeyBoards" style="Z-INDEX: 120; LEFT: 3px; VISIBILITY: hidden; WIDTH: 171px; POSITION: absolute; TOP: 0px; HEIGHT: 264px"> <p>Select Keyboard<br> <select onClick="ChangeKeyBoard(this.value);" size="2" id="Select1" name="Select1"> </select> <br> <A onclick=RecordingOnOff(); href="#">Record new keyboard</A><br> <A id=debugHref title="turning debug on means that you can click on the keyboard and get information about the key codes" onclick =DebugOnOff(); href="#" > Debug On</A><br> <A onclick=RecordTextOnOff(); href="#">Record new text file</A> </p> <div id="txtBogs" style="LEFT: 0px; VISIBILITY: hidden; TOP: 0px"> <form id="Skrive" name="Skrive"> Keboard Name <input id="KeybName" name="KeybName" value="New" size="5" > <br> <font size="1">Enter 2 or 3 charrecters here, then click on the key</font> <input id="Text1" title="Type in altGr (If relevant) then UpperCase LowerCase and click on letter" size="5" name="txtBogs" > </form> </div> <div onmousedown=WriteAllLetters(); id="WriteLetters" style="BORDER-RIGHT: #000000 1px; BORDER-TOP: #000000 1px; Z-INDEX: 119; LEFT: 11px; VISIBILITY: hidden; BORDER-LEFT: #000000 1px; WIDTH: 153px; BORDER-BOTTOM: #000000 1px; POSITION: absolute; TOP: 0px; HEIGHT: 24px; BACKGROUND-COLOR: #ff6666; layer-background-color: #FF0000">write all Letters in a file</div> <p>&nbsp;</p> </div> <div id="LayKeybName" class="Letter" style="Z-INDEX: 123; LEFT: 837px; WIDTH: 166px; POSITION: absolute; TOP: 91px; HEIGHT: 18px"> Keyboard </div> <p>&nbsp;</p> <div id="DivShiftLeft" style="Z-INDEX: 101; LEFT: -60px; VISIBILITY: visible; WIDTH: 64px; POSITION: absolute; TOP: 431px; HEIGHT: 30px; BACKGROUND-COLOR: #cccccc">Shift</div> <div id="DivShiftRight" style="Z-INDEX: 102; LEFT: -107px; VISIBILITY: visible; WIDTH: 111px; POSITION: absolute; TOP: 379px; HEIGHT: 30px; BACKGROUND-COLOR: #cccccc">Shift</div> <div class="Norml" id="DivStatistics" style="Z-INDEX: 116; LEFT: 839px; WIDTH: 165px; POSITION: absolute; TOP: 120px; HEIGHT: 234px"></div> <A onmousedown="delCookie('Players');" href="#"></A> <div id="LayerInfo" style="Z-INDEX: 109; LEFT: 754px; WIDTH: 141px; POSITION: absolute; TOP: 380px; HEIGHT: 30px"> <form id="BrugerInfo" name="BrugerInfo"> <div id="UserLogin" style="Z-INDEX: 123; LEFT: 27px; VISIBILITY: hidden; WIDTH: 134px; POSITION: absolute; TOP: 23px; HEIGHT: 115px"> <p> <input id="NyBruger" type="button" value="Ny Bruger" name="NyBruger" onClick="return NyBruger_onclick()"> <br> <input id="txtNyeBruger" name="txtNyeBruger" > </p> <p>Vælg bruger:<br> <select id="UserName" size="3" name="UserName"> </select> </p> </div> Level<br> <select id="TheLevel" onChange="SelectOption();" name="TheLevel"> <option selected>asdf jkl</option> </select> </form> <p></p> </div> <div id="KeyboardLayer" style="Z-INDEX: 1; LEFT: 59px; VISIBILITY: hidden; WIDTH: 200px; POSITION: absolute; TOP: 100px; HEIGHT: 115px"><IMG height="272" src="" width="780"></div> <div class="cour" id="Layer61" style="Z-INDEX: 108; LEFT: 101px; VISIBILITY: hidden; WIDTH: 53px; POSITION: absolute; TOP: 390px; HEIGHT: 57px">a</div> <div class="cour" id="SkrivEfterLag" style="Z-INDEX: 104; LEFT: 48px; WIDTH: 1265px; POSITION: absolute; TOP: 0px; HEIGHT: 1px"></div> <bgsound id="lyd" volume="0"> <bgsound balance="0" src="../stavning/siger.wav" volume="-10000"> <div id="MenuLayer" style="Z-INDEX: 110; LEFT: 1px; WIDTH: 48px; POSITION: absolute; TOP: 107px; HEIGHT: 34px"><A href="TypeWritingCourse.htm">Explain</A><br><A href="../mikkelssider.htm">Children prog</A><br> <A onclick="IsOpera=true;init();" href="#" title="Klik her hvis du har Opera. Dette p.t. virker kun på dansk">Opera</A><br> <A onmouseup=hideBogs(); href="#" >Help</A><br> <A onmousedown=ShowPopMenu(); href="#">Menu </A><br> <a href=index.htm>Intro</a> </div> <div id="PopMenu" style="Z-INDEX: 111; LEFT: 4px; VISIBILITY: hidden; WIDTH: 54px; POSITION: absolute; TOP: 182px; HEIGHT: 229px"> <a onmousedown=UdgangStilling() href=#>Start position</a> <a onmousedown=NoGrafik(); href="#">Finger</a> <A onmousedown=ResetStats(); href="#">Reset statistik</A> <p><A onmousedown=ShowModifyKeyboard(); href="#"> Keyboard</A></p> <p>&nbsp;</p> </div> <div class="cour" id="SkriveLag" style="Z-INDEX: 105; LEFT: 50px; WIDTH: 944px; POSITION: absolute; TOP: 56px; HEIGHT: 1px"> </div> <div class="Letter" id="LayBogs" style="BORDER-RIGHT: #000000 1px; BORDER-TOP: #000000 1px; Z-INDEX: 103; LEFT: 50px; VISIBILITY: hidden; BORDER-LEFT: #000000 1px; WIDTH: 53px; BORDER-BOTTOM: #000000 1px; POSITION: absolute; TOP: 574px; HEIGHT: 38px; BACKGROUND-COLOR: #ccccff; layer-background-color: #CCCCFF"></div> <div class="courRed" id="LaySkrEftPointer" style="BORDER-RIGHT: #000000 1px; BORDER-TOP: #000000 1px; Z-INDEX: 122; LEFT: 50px; VISIBILITY: hidden; BORDER-LEFT: #000000 1px; WIDTH: 1px; BORDER-BOTTOM: #000000 1px; POSITION: absolute; TOP: 152px; HEIGHT: 1px; BACKGROUND-COLOR: #ffffff; layer-background-color: #FFFFFF">a</div> <script language="javascript"> for (t=97; t<=122; t++) { document.write('<bgsound id=Lyd SRC="../stavning/"'+String.fromCharCode(t)+'.wav" loop=1 Volume=-10000>'); } // if(recording) // { // txtBogs.style.visibility='visible' // WriteLetters.style.visibility='visible' // } for(i=0;i<62;i++) { //document.write('<div id=bogs'+i+' onmousedown=ClickTheLetter('+i+'); style="position:absolute; Z-INDEX: 10; width:38px; height:36px; left: '+TasterPosition[i].Xpos+'px; top:'+ (TasterPosition[i].Ypos-42)+'px; background-color: #CCCCFF; layer-background-color: #0000FF; border: 1px none #000000" class="Letter" >'+ String.fromCharCode(TasterPosition[i].TheKeyCodeTxtUCase) + '</div>'); document.write('<div id=bogs'+i+' onmousedown=ClickTheLetter('+i+'); style="position:absolute; visibility:visible; Z-INDEX: 10; TOP: 20px; width:38px; height:36px;background-color: #CCCCFF; layer-background-color: #0000FF; border: 1px none #000000" class="Letter" >'+i+'</div>'); } </script> <div id="BothHand" style="Z-INDEX: 106; LEFT: 300px; VISIBILITY: hidden; WIDTH: 232px; POSITION: absolute; TOP: 376px; HEIGHT: 90px"><IMG src="Both.gif" name=Both> </div> <div onmousedown=ClickHand(); id="LeftHandDiv" style="Z-INDEX: 106; LEFT: 178px; VISIBILITY: visible; WIDTH: 158px; POSITION: absolute; TOP: 376px; HEIGHT: 157px"><IMG src="LClosed.gif" name=LeftHand> </div> <div onmousedown=ClickHand(); id="RightHandDiv" style="Z-INDEX: 107; LEFT: 453px; WIDTH: 277px; POSITION: absolute; TOP: 376px; HEIGHT: 90px"><IMG src="RClosed.gif" name=RightHand> </div> <div id="IframTxtDiv" style="Z-INDEX: 112; LEFT: 770px; VISIBILITY: hidden; WIDTH: 106px; POSITION: absolute; TOP: 0px; HEIGHT: 172px"> <iframe id="txtinput" name="txtinpt" src="DefaultText.txt"></iframe> </div> <div id="IframeKeyBoardsCharsDiv" style="Z-INDEX: 112; LEFT: 770px; VISIBILITY: hidden; WIDTH: 106px; POSITION: absolute; TOP: 100px; HEIGHT: 172px left: 0px"> <iframe name="txtKeyBoard" src="DefaultKeyBoard.txt"></iframe> </div> <div id="IframeRawTxtDiv" style="Z-INDEX: 125; VISIBILITY: hidden; WIDTH: 200px; POSITION: absolute; HEIGHT: 115px"></div><!-- The script is started from init(); !-> <div id="IframeKeybDiv" style="VISIBILITY: hidden; TOP: 100px"> <iframe name="KeyBoards" onload="init();" src="Keyboards.txt"></iframe> </div> </body> </html>