root/trunk/max-javahotpot-tutorial/tutorial/tutorial.htm @ 35

Revision 35, 60.3 KB (checked in by max, 23 months ago)

mario.izquierdo
max-javahotpot-tutorial (3.1.max1)

  • New release
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "xhtml11.dtd">
2       <html xmlns="http://www.w3.org/1999/xhtml"
3             xml:lang="en"><head><meta name="author" content="Created with Quandary by Half-Baked Software, registered to Martin Holmes."></meta><meta name="keywords" content="Quandary, Hot Potatoes, Half-Baked Software, Windows, University of Victoria"></meta>
4
5<!-- This is the core XHTML code which is used to build the exercise page. -->
6
7<link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" />
8<meta name="DC:Creator" content="Martin Holmes" />
9<meta name="DC:Title" content="Hot Potatoes 6 Tutorial" />
10
11
12<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
13
14<title>
15Hot Potatoes 6 Tutorial
16</title>
17
18<!-- Made with executable version 2.0 Release 8 Build 0 -->
19
20<style type="text/css">
21
22
23/* This is the CSS stylesheet used in the exercise. */
24/* Elements in square brackets are replaced by data based on configuration settings when the exercise is built. */
25
26
27body{
28        font-family: Arial,sans-serif;
29        background-color: #d9d9d9;
30        color: #000000;
31 
32        margin-right: 5%;
33        margin-left: 5%;
34        font-size: small;
35
36}
37
38p{
39        text-align: left;
40        margin: 0px;
41        font-size: small;
42}
43
44div, span, td{
45        font-size: small;
46        color: #000000;
47}
48
49div.Titles{
50        padding: 10px;
51        text-align: center;
52        color: #000000;
53}
54
55button{
56        display: inline;
57}
58
59.ExerciseTitle{
60        font-size: large;
61        color: #000000;
62}
63
64div#Timer{
65        padding: 6px;
66        margin-left: auto;
67        margin-right: auto;
68        text-align: center;
69}
70
71span#TimerText{
72        padding: 6px;
73        border-width: 1px;
74        border-style: solid;
75        font-weight: bold;
76        display: none;
77}
78
79div.ControlButtons{
80        text-align: center;
81}
82
83.Instructions{
84        margin-top: 1em;
85}
86
87.DecisionPointTitle{
88        font-size: medium;
89}
90
91.DecisionPointText{
92        text-align: left;
93        margin: auto;
94}
95
96div.Assets{
97        margin: 20px;
98}
99
100table.AssetTable{
101        border-width: 3px;
102        border-style: double;
103        border-color: #000000;
104        padding: 5px;
105}
106
107table.AssetTable th{
108        background-color: #000000;
109        color: #ffffff;
110        padding: 5px;
111}
112
113div.LinkList{
114        margin-top: 10px;
115}
116
117table.LinkTable{
118        margin-left: auto;
119        margin-right: auto;
120        text-align: left;
121}
122
123.FeedbackText{
124        color: #000000;
125}
126
127table.DPTable{
128        margin-left: auto;
129        margin-right: auto;
130        border-width: 0px;
131        padding: 10px;
132        vertical-align: top;
133}
134
135div.Feedback {
136        background-color: #d9d9d9;
137        left: 33%;
138        width: 34%;
139        top: 33%;
140        z-index: 1;
141        border-style: solid;
142        border-width: 1px;
143        padding: 5px;
144        text-align: center;
145        color: #000000;
146        position: absolute;
147        display: none;
148        font-size: small;
149}
150
151div.DecisionPoint{
152        background-color: #ffffff;
153        text-align: center;
154        font-size: small;
155        color: #000000;
156        padding: 8px;
157        border-style: solid;
158        border-width: 1px 1px 1px 1px;
159        border-color: #000000;
160        margin: 1px;
161}
162
163.FuncButton {
164       
165        text-align: center;
166        border-style: solid;
167
168        color: #ffffff;
169        border-color: #ffffff;
170        background-color: #000000;
171
172        border-width: 2px;
173        padding: 3px 6px 3px 6px;
174        cursor: pointer;
175}
176
177.FuncButtonUp {
178        color: #ffffff;
179        text-align: center;
180        border-style: solid;
181
182        border-left-color: #ffffff;
183        border-top-color: #ffffff;
184        border-right-color: #7f7f7f;
185        border-bottom-color: #7f7f7f;
186        background-color: #000000;
187
188        border-width: 2px;
189        padding: 2px 7px 4px 5px;
190        cursor: pointer;
191}
192
193.FuncButtonDown {
194        color: #ffffff;
195        text-align: center;
196        border-style: solid;
197
198        border-left-color: #7f7f7f;
199        border-top-color: #7f7f7f;
200        border-right-color: #ffffff;
201        border-bottom-color: #ffffff;
202        background-color: #000000;
203
204        border-width: 2px;
205        padding: 4px 5px 2px 7px;
206        cursor: pointer;
207}
208
209div.NavButtonBar{
210        background-color: #0060A4;
211        text-align: center;
212        margin: 2px 0px 2px 0px;
213        clear: both;
214        font-size: small;
215}
216
217.NavButton {
218        border-style: solid;
219        border-color: #0060A4;
220        background-color: #0060A4;
221        border-width: 2px;
222        padding: 2px 2px 2px 2px;
223        color: #ffffff;
224        cursor: pointer;       
225}
226
227.NavButtonUp {
228        border-style: solid;
229
230        border-left-color: #7fafd1;
231        border-top-color: #7fafd1;
232        border-right-color: #003052;
233        border-bottom-color: #003052;
234        background-color: #0060A4;
235
236        border-width: 2px;
237        padding: 1px 3px 3px 1px;
238        color: #ffffff;
239        cursor: pointer;       
240}
241
242.NavButtonDown {
243        border-style: solid;
244
245        border-left-color: #003052;
246        border-top-color: #003052;
247        border-right-color: #7fafd1;
248        border-bottom-color: #7fafd1;
249        background-color: #0060A4;
250
251        background-color: #0060A4;
252        border-width: 2px;
253        padding: 3px 1px 1px 3px;
254        color: #ffffff;
255        cursor: pointer;       
256}
257
258a{
259        color: #0060A4;
260}
261
262a:visited{
263        color: #0000ff;
264}
265
266a:hover{
267        color: #0060A4;
268}
269
270
271       </style>
272
273<!-- The following insertion allows you to add your own code directly to this head tag from the configuration screen -->
274
275<style type="text/css">
276strong{background-color: #ffff00;color:inherited;}
277       </style>
278
279<script type="text/javascript">
280
281//<![CDATA[
282
283<!--
284
285
286//This is the JavaScript code needed to make the exercise function
287
288//Simple browser check comes first -- you may want to make this more sophisticated
289//if you have many users with old or obscure browsers
290
291if (document.getElementById == false){
292        alert('Your browser is not able to show this page properly. A modern browser that supports W3C standards is required.');
293}
294
295//USING USER-DEFINED STRINGS:
296//If you are using the user-defined strings on the Other tab of the Config screen,
297//make sure the strings are correctly escaped for use in JavaScript.
298
299//CODE FOR ASSETS AND ASSET BASKETS
300
301//ASSETS SECTION
302function Asset(ID, Name, InitVal, DecPlace, ShowDuring, ShowEnd, CurrVal, Parent){
303        this.ID = ID;
304        this.Name=Name;
305        this.InitVal=InitVal;
306        this.DecPlace=DecPlace;
307        this.ShowDuring=ShowDuring;
308        this.ShowEnd=ShowEnd;
309        this.CurrVal=CurrVal;
310        this.Parent = Parent;
311}
312
313function AssetGetCurrValString(){
314        var Num = this.CurrVal;
315        if (this.DecPlace > 0){
316                for (var i=0; i<this.DecPlace; i++){Num /= 10;}
317        }
318        var Result = Num.toString();
319        if (this.DecPlace > 0){
320                var DecLoc = Result.indexOf('.');
321                if (DecLoc < 0){Result += '.';}
322//Add leading zeros if required
323                while (((Result.length-1) - Result.indexOf('.'))<this.DecPlace){Result += '0';}
324//Truncate trailing places if required
325                while (((Result.length-1) - Result.indexOf('.'))>this.DecPlace){Result = Result.substring(0, Result.length-1);}
326        }
327        return Result;
328}
329Asset.prototype.GetCurrValString=AssetGetCurrValString;
330
331function AssetGetCurrValFloat(){
332        var Num = this.CurrVal;
333        if (this.DecPlace > 0){
334                for (var i=0; i<this.DecPlace; i++){Num /= 10;}
335        }
336                return Num;
337}
338Asset.prototype.GetCurrValFloat=AssetGetCurrValFloat;
339
340function AssetSetCurrValFromFloat(Num){
341        if (this.DecPlace > 0){
342                for (var i=0; i<this.DecPlace; i++){Num *= 10;}
343        }
344        this.CurrVal = Num;
345}
346Asset.prototype.SetCurrValFromFloat=AssetSetCurrValFromFloat;
347
348function AssetReportCurrState(){
349        return this.Name + ': ' + this.GetCurrValString();
350}
351Asset.prototype.ReportCurrState=AssetReportCurrState;
352
353function AssetMeetsRequirement(ReqType, Req){
354        var Result = true;
355        switch(ReqType){
356                case 0: break;
357                case 1: Result = (this.CurrVal > Req); break;
358                case 2: Result = (this.CurrVal < Req); break;
359                case 3: Result = (this.CurrVal == Req); break;
360        }
361        return Result;
362}
363Asset.prototype.MeetsRequirement=AssetMeetsRequirement;
364
365function AssetPerformTransaction(OperatorType, Operand){
366        if ((this.Name == '_Timer_Seconds')&&(this.Parent.Active == true)){
367                this.CurrVal = Seconds;
368        }
369        switch(OperatorType){
370//Operands coming into this function should already be massaged to be at the same decimal place level as
371//the asset being manipulated; therefore +, -, and = operators can use the values directly, but *, /, %
372//and ^ transactions will have to reduce the operand to its true value by dividing it.
373                case 1: this.CurrVal += Operand; break; //add
374                case 2: this.CurrVal -= Operand; break; //subtract
375                case 3: for (var x=0; x<this.DecPlace; x++){Operand /= 10;}this.CurrVal *= Operand; break; //multiply
376                case 4: for (var x=0; x<this.DecPlace; x++){Operand /= 10;}this.CurrVal /= Operand; break; //divide
377                case 5: this.CurrVal = Operand; break; //set equal to
378                case 6: for (var x=0; x<this.DecPlace; x++){Operand /= 10;}this.CurrVal *= (Operand/100); break; //percentage
379//Difficult case (power of); need to change the operand and the value to core values, do the calculation, then
380//change the value back
381                case 7:
382//Change the operand to core value
383                        for (var x=0; x<this.DecPlace; x++){Operand /= 10;}
384//Change the asset value to core value
385                        var y = this.CurrVal; for (var x=0; x<this.DecPlace; x++){y /= 10;}
386//Do the math
387                        x = y; for (var j=1; j<Operand; j++){y *= x;}
388//Raise the val again
389                        for (var x=0; x<this.DecPlace; x++){y *= 10;}
390//Set the value
391                        this.CurrVal = y;
392                        break;
393        }
394        this.CurrVal = Math.round(this.CurrVal);
395        if ((this.Name == '_Timer_Seconds')&&(this.Parent.Active == true)){
396                Seconds = this.CurrVal;
397        }
398}
399Asset.prototype.PerformTransaction=AssetPerformTransaction;
400
401function AssetCanBeShown(){
402        var Result = true;
403        if (IsEndPoint == true){
404                switch (this.ShowEnd){
405                        case 0: Result = true; break;
406                        case 1: Result = false; break;
407                        case 2: Result = (this.CurrVal != 0); break;
408                }
409        }
410        else{
411                switch (this.ShowDuring){
412                        case 0: Result = true; break;
413                        case 1: Result = false; break;
414                        case 2: Result = (this.CurrVal != 0); break;
415                }
416        }
417        return Result;
418}
419Asset.prototype.CanBeShown=AssetCanBeShown;
420
421function Basket(AList, Active){
422        this.Active = Active;
423        this.Assets = new Array();
424        if (AList.length > 0){
425                for (var i=0; i<AList.length; i++){
426                        this.Assets[i] = new Asset(i, AList[i][0], AList[i][1], AList[i][2], AList[i][3], AList[i][4], A[i][5], this);
427                }
428        }
429}
430
431function BasketGetEffectiveOperand(Trans){
432//The "effective operand" is the operand converted to the right decimal place level (so an operand of
433//5, which is to act on an asset with 2dps, should be converted to 500). This is especially difficult
434//when the operand is the value of another asset, since that may have its own dp setting, and the two
435//settings must be harmonized
436        var Operand = 0;
437        switch(Trans[2]){
438//First, a fixed value (this should already be specified at the right dp level)
439                case 0: Operand = Trans[3]; break;
440//Second, a random value; again, this should be specified at the right dp level already)
441                case 1: Operand = GetRand(Trans[3], Trans[4]); break;
442//Finally, the problem case: the value of another asset. In this case, we need to find out the dp
443//settings of both the source and target asset
444//First get the real value of the source asset (so 500 for an asset with 2dp would be 5)
445                case 2: Operand = this.Assets[Trans[5]].GetCurrValFloat();
446//Now multiply this up according to the dp setting of the target asset (so 5 operating on a target asset
447//with dp2 would become 500)
448                        for (var i=0; i<this.Assets[Trans[0]].DecPlace; i++){Operand *= 10;}
449                        break;
450        }
451        return Operand;
452}
453Basket.prototype.GetEffectiveOperand=BasketGetEffectiveOperand;
454
455function BasketReportCurrState(){
456        if (this.Assets.length < 1){return '';}
457        var Result = '';
458        for (var i=0; i<this.Assets.length; i++){
459                if (this.Assets[i].CanBeShown()==true){
460                        Result += '<tr><td style="text-align: right;">' + this.Assets[i].Name + ': </td>';
461                        Result += '<td style="text-align: left;">' + this.Assets[i].GetCurrValString() + '</td></tr>';
462                }
463        }
464        if (Result.length > 0){
465                Result = '<table class="AssetTable"><tr><th colspan="2">' + strYouHave + '</th></tr>' + Result + '</table>';
466        }
467        return Result;
468}
469Basket.prototype.ReportCurrState=BasketReportCurrState;
470
471function BasketCloneSelf(Copy, Active){
472        Copy = new Basket(A, false);
473        Copy.Active = Active;
474        for (var i=0; i<this.Assets.length; i++){
475                Copy.Assets[i].CurrVal = this.Assets[i].CurrVal;
476        }
477        return Copy;
478}
479Basket.prototype.CloneSelf=BasketCloneSelf;
480
481function BAssetMeetsRequirement(ANum, ReqType, Req){
482        return this.Assets[ANum].MeetsRequirement(ReqType, Req);
483}
484Basket.prototype.AssetMeetsRequirement=BAssetMeetsRequirement;
485
486function BAssetPerformTransaction(ANum, OpType, Operand){
487        this.Assets[ANum].PerformTransaction(OpType, Operand);
488}
489Basket.prototype.PerformTransaction=BAssetPerformTransaction;
490
491function BGetAssetValByName(AssetName){
492        var Result = 0;
493        for (var i=0; i<this.Assets.length; i++){
494                if (this.Assets[i].Name == AssetName){
495                        Result = this.Assets[i].CurrVal;
496                }
497        }
498        return Result;
499}
500Basket.prototype.GetAssetValByName=BGetAssetValByName;
501
502//VARIABLES AND INTERFACE STRINGS
503
504var CurrBasket;
505var TempBasket;
506var CurrNode=0;
507var strYouHave='You have: ';
508var strLinkCaption='Entrar';
509var strFinishCaption='Entrar';
510var strDefaultRefusalMessage='¡Lo siento! No puede hacer eso.';
511var strTimesUp = 'Su tiempo ha terminado';
512var strBookmarkExplanation = 'Su posición actual y configuración ha sido codificada en <br />la URL de la página. Ahora deberá definir un marcador en su<br />navegador, así podrá volver aquí.<br />';
513var strExerciseComplete = 'Ha llegado al final del ejercicio.';
514var ShowImpossibleLinks=true;
515var Interval;
516var StartTime = (new Date()).toLocaleString();
517var HPNStartTime = (new Date()).getTime();
518var SubmissionTimeout = 30000;
519var FollowingTrack = false;
520var CurrTime;
521var Started=false;
522
523var IsEndPoint = false;
524
525function TransactionList(NNum, LNum){
526        this.List = new Array();
527        var i;
528        for (i=0; i<N[NNum][4].length; i++){this.List[this.List.length] = N[NNum][4][i];}
529        for (i=0; i<N[NNum][3][LNum][2].length; i++){this.List[this.List.length] = N[NNum][3][LNum][2][i];}
530        for (i=0; i<N[N[NNum][3][LNum][0]][2].length; i++){this.List[this.List.length] = N[N[NNum][3][LNum][0]][2][i];}
531}
532
533function TestTransactions(NNum, LNum){
534        var T = new TransactionList(NNum, LNum);
535        var Result = '';
536//Create a clone of the current asset basket to operate on
537        var B = CurrBasket.CloneSelf(B, false);
538
539//For each transaction
540        for (var i=0; i<T.List.length; i++){
541//Test the requirement
542                if (B.AssetMeetsRequirement(T.List[i][0], T.List[i][7], T.List[i][6]) == true){
543//If it succeeds, do the transaction
544                        B.PerformTransaction(T.List[i][0], T.List[i][1], B.GetEffectiveOperand(T.List[i]));
545                }
546                else{
547//If it fails, check the refusal message
548                        if (T.List[i][8].length > 0){
549                                return T.List[i][8];
550                        }
551//If no refusal message, return a string with spaces, otherwise return refusal message
552                        else{
553                                return strDefaultRefusalMessage;
554                        }
555                }
556        }
557//If all have passed, return an empty string
558        return '';
559}
560
561function StartExercise(){
562        CurrBasket = new Basket(A, true);
563        ParseSearch();
564        CurrTime = new Date();
565        ShowCurrNode();
566
567        Started = true;
568}
569
570function StartUp(){
571        if (document.location.search.indexOf('___') > -1){
572                StartExercise();
573        }
574}
575
576function Restart(){
577        var d = document.location;
578        d.search = '';
579        document.location = d;
580}
581
582//CODE FOR HANDLING UNDO FUNCTIONALITY AND TRACKING NODE SEQUENCE
583function HNode(NNum, LNum, Bask){
584        this.NNum = NNum; //Number of the node
585        this.LNum = LNum; //Number of the link selected to leave the node
586        this.Basket = Bask.CloneSelf(A, false); //Copy of current basket of assets
587//      this.EntryTime = CurrTime.getTime() - HPNStartTime; //Stores time of entry to this node, offset by start time, in milliseconds
588        this.EntryTime = CurrTime.getTime(); //Stores absolute time of entry to this node
589        this.EntryTimeString = CurrTime.toLocaleString();
590        var D = new Date();
591//      this.ExitTime = D.getTime() - HPNStartTime; //Stores the time of exit from this node
592        this.ExitTime = D.getTime(); //Stores the absolute time of exit from this node
593
594        this.ExitTimeString = D.toLocaleString(); //Stores the time in human-readable format
595}
596
597function HNodeReportSelf(AddTime){
598        var S = this.NNum + ':' + this.LNum;
599        if (AddTime == true){
600                S += ':' + this.EntryTime;
601        }
602        return S;
603}
604HNode.prototype.ReportSelf=HNodeReportSelf;
605
606//Object containing the list of tracking node objects
607function HNodeList(){
608        this.Nodes = new Array();
609        var D = new Date();
610        this.StartTime = D.getTime(); // Stores the entry time of the exercise; =entry time to node 0
611        this.StartTimeString = D.toLocaleString();
612}
613
614function HNodeListReportAsSearch(IncludeTime){
615        var S = '___t;';
616        if (this.Nodes.length > 0){
617                S += this.Nodes[0].ReportSelf(IncludeTime);
618                for (var i=1; i<this.Nodes.length; i++){
619                        S += ',' + this.Nodes[i].ReportSelf(IncludeTime);
620                }
621        }
622        return S;
623}
624HNodeList.prototype.ReportAsSearch=HNodeListReportAsSearch;
625
626var H = new HNodeList(); //array of HNode elements
627
628function Undo(){
629        if (H.Nodes.length < 1){
630                return;
631        }
632        var LastNode = H.Nodes.pop();
633        CurrNode = LastNode.NNum;
634        CurrBasket = LastNode.Basket.CloneSelf(A, true);
635        ShowCurrNode();
636}
637
638//CODE FOR HANDLING URL ENCODING OF STATE
639function ParseSearch(){
640        if (document.location.search.length < 1){return;}
641//First, get the part of the search string we're interested in
642        var Temp = document.location.search.substring(document.location.search.lastIndexOf('___'), document.location.search.length);
643        if (Temp.length < 1){return;}
644
645        var S = Temp.split(';');
646//S[0] tells us this is a bookmark, or a track
647        if (S.length > 0){
648                if (S[0] == '___b'){
649//It's a bookmark
650                        ShowMessage(strBookmarkExplanation);
651                }
652                if (S[0] == '___t'){
653//It's tracking data
654                        ParseTrack(S[1]);
655                        return;
656                }
657        }
658//S[1] is the current node
659        if (S.length > 1){
660                if (S[1].length > 0){
661                        var CN=parseInt(S[1]);
662                        if ((CN>-1)&&(CN<N.length)){
663                                CurrNode = CN;
664                        }
665                }
666        }
667        if (S.length > 2){
668                if (S[2].length > 0){
669                        var AA=S[2].split(',');
670                        if (AA.length > 0){
671                                for (var i=0; i<AA.length; i++){
672                                        var Val = parseInt(AA[i]);
673                                        if ((i<A.length)&&(Val != NaN)){
674                                                CurrBasket.Assets[i].CurrVal = Val;
675                                        }
676                                }
677                        }
678                }
679        }
680
681}
682
683var Footprints = new Array();
684
685function ParseTrack(Track){
686        if (Track.length < 3){
687                return;
688        }
689
690        var Steps = Track.split(',');
691        if (Steps.length < 2){
692                return;
693        }
694//We have valid track data, so the exercise can be displayed accordingly
695        FollowingTrack = true;
696        var NNum = 0;
697        var LNum = 0;
698        var T = 0;
699        for (var i=0; i<Steps.length; i++){
700                var Step = Steps[i].split(':');
701                NNum = parseInt(Step[0]);
702                if (NNum > -1){
703                        LNum = parseInt(Step[1]);
704                        if (LNum > -1){
705                                if (Step.length > 2){
706                                        T = parseInt(Step[2]);
707                                }
708                                Footprints.push(new Array(NNum, LNum, T));
709                        }
710                }
711        }
712}
713
714function CreateBookmark(){
715        var S = '___b;' + CurrNode + ';';
716        if (CurrBasket.Assets.length > 0){
717                S += CurrBasket.Assets[0].CurrVal;
718                for (var i=1; i<CurrBasket.Assets.length; i++){
719                        S += ',' + CurrBasket.Assets[i].CurrVal;
720                }
721        }
722
723        return S;
724}
725
726function SetBookmark(){
727        if (Started == false){return;}
728        var Temp = document.location.search;
729        if (Temp.length < 1){
730                Temp = '?';
731        }
732        else{
733                Temp += '&';
734        }
735        document.location.search = Temp + CreateBookmark();
736}
737
738//CODE FOR HANDLING NAV BUTTONS AND FUNCTION BUTTONS
739
740function NavBtnOver(Btn){
741        if (Btn.className != 'NavButtonDown'){Btn.className = 'NavButtonUp';}
742}
743
744function NavBtnOut(Btn){
745        Btn.className = 'NavButton';
746}
747
748function NavBtnDown(Btn){
749        Btn.className = 'NavButtonDown';
750}
751
752function FuncBtnOver(Btn){
753        if (Btn.className != 'FuncButtonDown'){Btn.className = 'FuncButtonUp';}
754}
755
756function FuncBtnOut(Btn){
757        Btn.className = 'FuncButton';
758}
759
760function FuncBtnDown(Btn){
761        Btn.className = 'FuncButtonDown';
762}
763
764
765//CODE FOR HANDLING DISPLAY OF POPUP FEEDBACK BOX
766
767var topZ = 1000;
768
769function ShowMessage(Feedback){
770        var Output = Feedback + '<br /><br />';
771        document.getElementById('FeedbackContent').innerHTML = Output;
772        var FDiv = document.getElementById('FeedbackDiv');
773        topZ++;
774        FDiv.style.zIndex = topZ;
775        FDiv.style.display = 'block';
776        document.getElementById('FeedbackOKButton').focus();
777
778//[inclPreloadImages]
779//      RefreshImages();
780//[/inclPreloadImages]
781}
782
783function HideFeedback(){
784        document.getElementById('FeedbackDiv').style.display = 'none';
785        if (IsEndPoint == true){
786                Finish();
787        }
788}
789
790function MillisecondsToTimeReadout(MS){
791        var DT = new Date(MS);
792        return DT.getHours() + ':' + DT.getMinutes() + ':' + DT.getSeconds() + ':' + DT.getMilliseconds();
793}
794
795function ShowCurrNode(){
796        var DPT = N[CurrNode][0];
797        if ((FollowingTrack==true)&&(Footprints.length > 0)){
798                if (Footprints[0][2] > 0){
799                        DPT += ' (' + MillisecondsToTimeReadout(Footprints[0][2]) + ')';
800                }
801        }
802        document.getElementById('DPTitle').innerHTML = DPT;
803        document.getElementById('DPContentsDiv').innerHTML = N[CurrNode][1];
804        var Links = '';
805        var Refusal = '';
806        var ValidLinks = 0;
807        for (var LNum=0; LNum<N[CurrNode][3].length; LNum++){
808                if ((FollowingTrack==true)&&(Footprints.length > 0)){
809//We're following a track, so we only want to make a working link for the correct item
810                        if (LNum == Footprints[0][1]){
811                                Links += MakeLink(CurrNode, LNum);
812                                ValidLinks++;
813                        }
814                        else{
815                                Links += MakeDummyLink(CurrNode, LNum);
816                        }
817
818                }
819                else{
820                        Refusal = TestTransactions(CurrNode, LNum);
821                        if (Refusal.length > 0){
822                                if (N[CurrNode][3][LNum][4] < 1){
823                                        N[CurrNode][3][LNum][3] = Refusal;
824                                        Links += MakeRefusalLink(CurrNode, LNum);
825                                }
826                        }
827                        else{
828                                Links += MakeLink(CurrNode, LNum);
829                                ValidLinks++;
830                        }
831                }
832        }
833        if (Links.length > 0){
834                Links = '<table class="LinkTable">' + Links + '</table>';
835        }
836
837        if (ValidLinks < 1){
838                IsEndPoint = true;
839                if (document.getElementById('store') != null){
840                        Links = '<table class="LinkTable">' + MakeEndLink() + '</table>';
841                }
842                else{
843                        if (document.getElementById('UndoButton') == null){
844                                Links = '<table class="LinkTable"><tr><td>' + strExerciseComplete + '</td></tr></table>';
845                        }
846                }
847        }
848        document.getElementById('LinkListDiv').innerHTML = Links;
849
850//Show assets now -- endpoint issue may affect which are shown
851        document.getElementById('AssetsDiv').innerHTML = CurrBasket.ReportCurrState();
852
853//Remove the last footprint from the track
854        if (Footprints.length > 0){Footprints.shift();}
855
856        if ((IsEndPoint==true)&&(document.getElementById('UndoButton') == null)){
857//Record current state in the history array
858                H.Nodes.push(new HNode(CurrNode, LNum, CurrBasket));
859
860//Reset the current time
861                CurrTime = new Date();
862                setTimeout('Finish()', SubmissionTimeout);
863        }
864}
865
866function MakeRefusalLink(NNum, LNum){
867        var Result = '<tr><td><button class="FuncButton" onfocus="FuncBtnOver(this)" onblur="FuncBtnOut(this)"  onmouseover="FuncBtnOver(this)" onmouseout="FuncBtnOut(this)" onmousedown="FuncBtnDown(this)" onmouseup="FuncBtnOver(this)" onclick="ShowMessage(N[' + NNum + '][3][' + LNum + '][3])">' + strLinkCaption + '</button></td>';
868        Result += '<td>' + N[NNum][3][LNum][1] + '</td></tr>';
869        return Result;
870}
871
872function MakeLink(NNum, LNum){
873        var Result = '<tr><td><button class="FuncButton" onfocus="FuncBtnOver(this)" onblur="FuncBtnOut(this)"  onmouseover="FuncBtnOver(this)" onmouseout="FuncBtnOut(this)" onmousedown="FuncBtnDown(this)" onmouseup="FuncBtnOver(this)" onclick="FollowLink(' + LNum + ')">' + strLinkCaption + '</button></td>';
874        Result += '<td>' + N[NNum][3][LNum][1] + '</td></tr>';
875        return Result;
876}
877
878function MakeDummyLink(NNum, LNum){
879        var Result = '<tr><td style="text-align: right;">&nbsp;&#x25cf;&nbsp;</td>';
880        Result += '<td>' + N[NNum][3][LNum][1] + '</td></tr>';
881        return Result;
882}
883
884function MakeEndLink(){
885        var Result = '<tr><td><button class="FuncButton" onfocus="FuncBtnOver(this)" onblur="FuncBtnOut(this)"  onmouseover="FuncBtnOver(this)" onmouseout="FuncBtnOut(this)" onmousedown="FuncBtnDown(this)" onmouseup="FuncBtnOver(this)" onclick="Finish()">' + strFinishCaption + '</button></td>';
886        Result += '<td>' + strExerciseComplete + '</td></tr>';
887        return Result;
888}
889
890function FollowLink(LNum){
891
892//Record current state in the history array
893        H.Nodes.push(new HNode(CurrNode, LNum, CurrBasket));
894
895//Reset the current time
896        CurrTime = new Date();
897
898        var T = new TransactionList(CurrNode, LNum);
899//For each transaction
900        for (var i=0; i<T.List.length; i++){
901//Do the transaction
902                CurrBasket.PerformTransaction(T.List[i][0], T.List[i][1], CurrBasket.GetEffectiveOperand(T.List[i]));
903        }
904//Now change the node
905        CurrNode = N[CurrNode][3][LNum][0];
906        ShowCurrNode();
907}
908
909//CODE FOR HANDLING TIMER
910
911
912//HOTPOTNET FUNCTIONS
913function Finish(){
914//If there's a form, fill it out and submit it
915        try{
916                var F = document.getElementById('store');
917                if (F != null){
918                        F.starttime.value = HPNStartTime;
919                        F.endtime.value = (new Date()).getTime();
920                        F.mark.value = CurrBasket.GetAssetValByName('Score'); //if an asset called "Score" exists, this value will be submitted as the mark
921                        var Temp = '<?xml version="1.0"?><hpnetresult><fields>';
922                        Temp += '<field><fieldname>endbookmark</fieldname><fieldtype>url-search</fieldtype><fieldlabel>Click here to see the final position in the maze</fieldlabel><fieldlabelid>QuandaryViewFinalPosition</fieldlabelid><fielddata>' + CreateBookmark() + '</fielddata></field>';
923                        Temp += '<field><fieldname>track</fieldname><fieldtype>url-search</fieldtype><fieldlabel>Click here to track the student through the maze.</fieldlabel><fieldlabelid>QuandaryViewTrack</fieldlabelid><fielddata>' + H.ReportAsSearch(false) + '</fielddata></field>';
924                        Temp += '<field><fieldname>timedtrack</fieldname><fieldtype>url-search</fieldtype><fieldlabelid>QuandaryViewTimedTrack</fieldlabelid><fieldlabel>Click here to track the student through the maze with timing data.</fieldlabel><fielddata>' + H.ReportAsSearch(true) + '</fielddata></field>';
925                        Temp += '</fields></hpnetresult>';
926                        F.detail.value = Temp;
927                        F.submit();
928
929                }
930        }
931        catch(er){
932                return;
933        }
934}
935
936//UTILITY FUNCTIONS
937function GetRand(Lower, Upper){
938        var Rng = Upper-Lower;
939        return (Math.round(Math.random()*Rng)) + Lower;
940}
941
942var A = new Array();
943
944
945var N = new Array();
946N[0] = new Array();
947N[0][0] = 'Bienvenid@ a Hot Potatoes!';
948N[0][1] = 'Esta presentación le describirá los principales tipos de ejercicios que se pueden realizar con los programas, y le llevará a través de los pasos básicos necesarios para elaborar un ejercicio interactivo. Elija una de las opciones que se muestran a continuación.';
949N[0][2] = new Array();
950
951N[0][3] = new Array();
952N[0][3][0] = new Array();
953N[0][3][0][0] = 1;
954N[0][3][0][1] = '¿Qué es Hot Potatoes?';
955N[0][3][0][2] = new Array();
956
957N[0][3][0][3] = '';
958N[0][3][0][4] = 0;
959
960N[0][3][1] = new Array();
961N[0][3][1][0] = 2;
962N[0][3][1][1] = 'Novedades de la versión 6';
963N[0][3][1][2] = new Array();
964
965N[0][3][1][3] = '';
966N[0][3][1][4] = 0;
967
968N[0][3][2] = new Array();
969N[0][3][2][0] = 3;
970N[0][3][2][1] = 'Para empezar';
971N[0][3][2][2] = new Array();
972
973N[0][3][2][3] = '';
974N[0][3][2][4] = 0;
975
976N[0][3][3] = new Array();
977N[0][3][3][0] = 4;
978N[0][3][3][1] = 'Las patatas, una a una';
979N[0][3][3][2] = new Array();
980
981N[0][3][3][3] = '';
982N[0][3][3][4] = 0;
983
984N[0][3][4] = new Array();
985N[0][3][4][0] = 17;
986N[0][3][4][1] = 'El servidor de <strong>hotpotatoes.net</strong>';
987N[0][3][4][2] = new Array();
988
989N[0][3][4][3] = '';
990N[0][3][4][4] = 0;
991
992
993N[0][4] = new Array();
994
995
996N[1] = new Array();
997N[1][0] = '¿Qué es Hot Potatoes?';
998N[1][1] = '<strong>Hot Potatoes</strong> es un conjunto de seis herramientas para elaborar contenidos digitales. La aplicación ha sido desarrollada por el equipo de Investigación y Desarrollo del <a href="http://web.uvic.ca/hrd/hcmc/">Humanities Computing and Media Centre</a> de la Universidad de Victoria. Estas utilidades le permitirán elaborar ejercicios interactivos de tipo página Web y de diferentes modalidades. Los ejercicios generados son páginas Web estándar que utilizan código XHTML 1.1 para la visualización, y JavaScript (ECMAScript) para la interactividad. Estos estándares W3C son soportados por todos los navegadores modernos, incluyendo Mozilla 1.2+, Internet Explorer 6+, Phoenix, Safari, y muchos otros. Estas herramientas funcionan también con Unicode. Así, se pueden crear ejercicios en cualquier idioma, o en una mezcla de idiomas.<br /><br />Usted no necesita saber nada sobre XHTML o JavaScript para utilizar los programas. Todo lo que necesita hacer es introducir sus datos -- textos, preguntas, respuestas, etc. -- y los programas crearán automáticamente las páginas Web. Posteriormente podrá publcair dichas páginas en su servidor Web. Además, los programas están diseñados para que se puedan personalizar casi todas las características de las páginas. Por tanto, si usted sabe algo de código HTML o de JavaScript, podrá hacer cualquier cambio que desee en la forma de trabajar de los ejercicios o en el formato de las páginas Web.<br /><br />Si usted trabaja en una institución educativa sin ánimo de lucro, y está dispuest@ a compartir sus ejercicios colocándolos en un servidor Web de acceso público, entonces podrá utilizar la suite Hot Potatoes sin cargo alguno. Si usted trabaja para una compañía comercial, o si usted protege mediante contraseña sus ejercicios o los distribuye exclusivamente en una intranet, necesitará adquirir una licencia (contacte con <a href="http://www.halfbakedsoftware.com/">Half-Baked Software</a> para más información). No obstante, tanto si usted es de una empresa comercial como si no, le pedimos que registre el programa; lo único que tiene que hacer es <a href="http://web.uvic.ca/hrd/hotpot/register.htm">rellenar un formulario en nuestra página Web</a>. Esto nos permite mantenernos en contacto con nuestros usaurios y hacernos una idea de quién está utilizando nuestros programas. Puede consultar el archivo de ayuda para obtener más información sobre el proceso de registro de la aplicación.<br /><br />Ahora, continúe para ver algunos ejemplos del tipo de ejercicios que puede elaborar utilizando <strong>Hot Potatoes</strong>. (Tenga en cuenta que los archivos de datos de todos estos ejercicios se encuentran disponibles en la carpeta tutorial y podrá verlos con las diferentes patatas, si así lo desea más tarde.)<br />';
999N[1][2] = new Array();
1000
1001N[1][3] = new Array();
1002N[1][3][0] = new Array();
1003N[1][3][0][0] = 11;
1004N[1][3][0][1] = 'Ejemplos de ejercicios';
1005N[1][3][0][2] = new Array();
1006
1007N[1][3][0][3] = '';
1008N[1][3][0][4] = 0;
1009
1010
1011N[1][4] = new Array();
1012
1013
1014N[2] = new Array();
1015N[2][0] = 'Novedades de la versión 6';
1016N[2][1] = 'El archivo de ayuda contiene una lista más detallada de las nuevas características y de los cambios, y a continuación se enumeran las diferencias básicas entre las versiones 5.5 y 6.0:<ul><li><strong>Soporte Unicode</strong>, así podrá crear ejercicios en casí cualquier idioma o en una mezcla de idiomas. El soporte Unicode solamente está disponible en Windows 2000 o XP; las versiones anteriores de Windows no lo soportan.</li><li><strong>Tipos de preguntas mezcladas en un test.</strong> La antigua aplicación JBC (respuestas múltiples) ha sido combinada con JQuiz, y la nueva aplicación le permite crear un test o prueba con una mezcla de preguntas de tipo respuestas múltiples, respuestas cortas y de selección múltiple, junto con un nuevo tipo de pregunta ("híbrida").</li><li><strong>Sistema de puntuación más sofisticado en JQuiz.</strong> Ahora se puede predeerminar el valor de cada pregunta en el conjunto del test, y se puede definir un "porcentaje de acierto" a las espuestas individuales.</li><li><strong>Formato de salida más simple.</strong> En vez del antiguo sistema basado en marcos, en el que el contenido de las páginas de los ejercicios estaba escrito en JavaScript, las nuevas páginas basadas en XHTML son más sencillas, esto permite una edición más facil de las páginas resultantes en editores de tipo WYSIWYG como DreamWeaver.</li><li>Ahora se puede incluir un <strong>contador de tiempo</strong> en los ejercicios, en vez de hacerlo en las lecturas de texto asociadas de las versiones anteriores.</li><li>Los ejercicios y todos los archivos de medios asociados pueden ser publicados automáticamente en una cuenta de la red <a href="http://www.hotpotatotes.net">www.hotpotatotes.net</a>, y así sus alumn@s podrán entra en dicha red y ver los resultados obtenidos en los ejercicios.</li></ul>';
1017N[2][2] = new Array();
1018
1019N[2][3] = new Array();
1020N[2][3][0] = new Array();
1021N[2][3][0][0] = 0;
1022N[2][3][0][1] = 'Volver al Índice';
1023N[2][3][0][2] = new Array();
1024
1025N[2][3][0][3] = '';
1026N[2][3][0][4] = 0;
1027
1028N[2][3][1] = new Array();
1029N[2][3][1][0] = 3;
1030N[2][3][1][1] = 'Para empezar';
1031N[2][3][1][2] = new Array();
1032
1033N[2][3][1][3] = '';
1034N[2][3][1][4] = 0;
1035
1036
1037N[2][4] = new Array();
1038
1039
1040N[3] = new Array();
1041N[3][0] = 'Para empezar';
1042N[3][1] = 'La mejor forma de comenzar con Hot Potatoes es trabajar con los ejemplos de ejercicios; estos ejercicios le mostrarán los diferentes tipos que se pueden elaborar, y, a la vez, le enseñarán algunos de los conceptos básicos. Después podrá realizar su primer ejercicio.';
1043N[3][2] = new Array();
1044
1045N[3][3] = new Array();
1046N[3][3][0] = new Array();
1047N[3][3][0][0] = 11;
1048N[3][3][0][1] = 'Ejemplos de Ejercicios';
1049N[3][3][0][2] = new Array();
1050
1051N[3][3][0][3] = '';
1052N[3][3][0][4] = 0;
1053
1054N[3][3][1] = new Array();
1055N[3][3][1][0] = 12;
1056N[3][3][1][1] = 'El desafío en 2-minutos: elabore su primer ejercicio';
1057N[3][3][1][2] = new Array();
1058
1059N[3][3][1][3] = '';
1060N[3][3][1][4] = 0;
1061
1062N[3][3][2] = new Array();
1063N[3][3][2][0] = 13;
1064N[3][3][2][1] = 'Tres pasos para elaborar un ejercicio';
1065N[3][3][2][2] = new Array();
1066
1067N[3][3][2][3] = '';
1068N[3][3][2][4] = 0;
1069
1070
1071N[3][4] = new Array();
1072
1073
1074N[4] = new Array();
1075N[4][0] = 'Las Patatas, una a una';
1076N[4][1] = 'En la versión 6 de Hot Potatoes existen seis Patatas. Elija la patata sobre la que quiere saber algo más:';
1077N[4][2] = new Array();
1078
1079N[4][3] = new Array();
1080N[4][3][0] = new Array();
1081N[4][3][0][0] = 5;
1082N[4][3][0][1] = 'JQuiz (ejercicios basados en preguntas)';
1083N[4][3][0][2] = new Array();
1084
1085N[4][3][0][3] = '';
1086N[4][3][0][4] = 0;
1087
1088N[4][3][1] = new Array();
1089N[4][3][1][0] = 6;
1090N[4][3][1][1] = 'JCloze (ejercicios de rellenar huecos)';
1091N[4][3][1][2] = new Array();
1092
1093N[4][3][1][3] = '';
1094N[4][3][1][4] = 0;
1095
1096N[4][3][2] = new Array();
1097N[4][3][2][0] = 7;
1098N[4][3][2][1] = 'JMatch (ejercicios de emparejamiemtos)';
1099N[4][3][2][2] = new Array();
1100
1101N[4][3][2][3] = '';
1102N[4][3][2][4] = 0;
1103
1104N[4][3][3] = new Array();
1105N[4][3][3][0] = 8;
1106N[4][3][3][1] = 'JMix (ejercicios para desordenar palabras o frases)';
1107N[4][3][3][2] = new Array();
1108
1109N[4][3][3][3] = '';
1110N[4][3][3][4] = 0;
1111
1112N[4][3][4] = new Array();
1113N[4][3][4][0] = 9;
1114N[4][3][4][1] = 'JCross (crucigramas)';
1115N[4][3][4][2] = new Array();
1116
1117N[4][3][4][3] = '';
1118N[4][3][4][4] = 0;
1119
1120N[4][3][5] = new Array();
1121N[4][3][5][0] = 10;
1122N[4][3][5][1] = 'The Masher (para crear unidades enlazadas a partir de diferentes ejercicios)';
1123N[4][3][5][2] = new Array();
1124
1125N[4][3][5][3] = '';
1126N[4][3][5][4] = 0;
1127
1128
1129N[4][4] = new Array();
1130
1131
1132N[5] = new Array();
1133N[5][0] = ' Introducción a JQuiz (ejercicios basados en preguntas)';
1134N[5][1] = 'JQuiz es una herramienta que permite elaborar ejercicios basados en preguntas. Cada test puede estar formado por un número ilimitado de preguntas. Se puden formular cuatro tipos de preguntas:<br /><br />En las <strong>preguntas de respuestas múltiples</strong>, los alumnos han de elegir una respuesta pulsando en un botón. Si la respuesta es correcta, el botón se convertirá en una carita sonriente :-), y si es errónea, cambiará a una X (estas opciones puden cambiarse en la ventana de configuración). En cualquier caso, el alumno verá algua indicación específica para dicha respuesta, explicándole porque está bien o mal (¡siempre suponiendo que usted ha escrito dichas indicaciones al realizar el ejercicio!). Si la respuesta es incorrecta, el alumno podrá seguir seleccioanndo opciones hasta dar con la respuesta correcta. La puntuación de cada pregunta dependerá del número de intentos hasta acertar la pregunta. Una vez que se ha elegido una respuesta correcta, la puntuación queda "congelada", pero el alumno podría seguir pulsando en los botones para ver las indicaciones de las demás respuestas sin que por ello se le penalice.<br /><br />En las <strong>preguntas de respuestas cortas</strong>, los alumnos deberán escribir una respuesta en una casilla de texto en la página, y pulsar en el botón <strong>Comprobar</strong> para ver si es correcta. La página intentará comprobar que la respuesta del alumno es una de las contenidas en la lista de respuestas correctas o incorrectas que usted haya definido. Si la respuesta está en la lista, se mostrarán las indicaciones para dicha respuesta. Si no es así, la página intentará encontrar la la respuesta más parecida entre las posibles respuestas correctas, e indicará al alumno la parte de su respuesta que se acerque a la correcta y qué partes son incorrectas. La puntuación obtenida depende del número de intentos realizados por el alumno antes de dar la respuesta correcta. También podría incluirse un botón <strong>Pista</strong>, para proporcionar al alumno una letra de la respuesta correcta; la utilización del botón Pista conllevará una penalización en la puntuación.<br /><br />Una <strong>pregunta híbrida</strong> es una combinación de una pregunta de respuestas múltiples y una pregunta de respuesta corta. En este tipo de preguntas, al alumno se le presenta una casilla de texto para que escriba la respuesta. Si el alumno no responde correctamente después de un especificado número de intentos (que usted puede definir en la pantalla de configuración), la pregunta cambia a otra de respuestas múltiples para que sea más fácil para el alumno.<br /><br />Por último, una pregunta de <strong>multi-selección</strong> consiste en que el alumno ha de seleccionar varias respuestas de la lista definida previamente. La idea aquí es que el alumno seleccione todas las posibles respuestas correctas, y no las respuestas inocrrectas. Este tipo de preguntas deberían formularse como "¿Cuál de los siguientes términos son nombres?", seguido de una lista de palabras. El alumno deberá marcar todas las palabras que sean nombres, y dejar sin marcar las palabras que no lo sean, y después pulsar en el botón <strong>Comprobar</strong>. Si la respuesta no es totalmente correcta, el alumno verá indicaciones del número de opciones correctas, e indiaciones para completar la pregunta; las indicaciones pueden hace referencia tanto a los elementos que <strong>han sido seleccionados cuando no lo deberían haber sido </strong>, como a los elementos <strong>no seleccionados cuando deberían haberlo sido</strong>.<br /><br />Para hacer pruebas con todos estos tipos de preguntas, véase este <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'jquiz2.htm\'); return false;">ejemplo de test</a>.<br /><br />Para ver un ejemplo sobre como elaborar Tests con JQuiz, pulse en el enlace "Tres pasos". Para más información sobre la forma de trabajar de JQuiz, revise los <strong>Archivos de Ayuda</strong> -- arranque JQuiz y pulse en la tecla <strong>F1</strong>.';
1135N[5][2] = new Array();
1136
1137N[5][3] = new Array();
1138N[5][3][0] = new Array();
1139N[5][3][0][0] = 13;
1140N[5][3][0][1] = 'Tres pasos para elaborar un ejercicio';
1141N[5][3][0][2] = new Array();
1142
1143N[5][3][0][3] = '';
1144N[5][3][0][4] = 0;
1145
1146N[5][3][1] = new Array();
1147N[5][3][1][0] = 0;
1148N[5][3][1][1] = 'Índice';
1149N[5][3][1][2] = new Array();
1150
1151N[5][3][1][3] = '';
1152N[5][3][1][4] = 0;
1153
1154
1155N[5][4] = new Array();
1156
1157
1158N[6] = new Array();
1159N[6][0] = 'Introducción a JCloze (ejercicios de rellenar huecos)';
1160N[6][1] = 'JCloze se utiliza para elaborar ejercicos de completar huecos. La idea de este tipo de ejercicios es que el alumno complete todas las respuestas antes de comprobar el resultado; en otras palabras, es un ejercicio holístico. Cuando se han completado todos los huecos, el alumno pulsará sobre el botón <strong>Comprobar</strong> para ver las respuestas. Las respuestas correctas serán introducidas en el texto; las respuesats incorrectas se dejarán en las casillas de texto, para que puedan corregirse. Cuando el alumno comprueba una respuesta que no es totalmente correcta, se incurre en una penalización. Por tanto, la puntuación final dependerá del número de veces que se ha comprobado la respuesta antes de dar con la correcta. <br /><br />En los ejercicios JCloze, se pude incluir un botón <strong>Pista</strong> que proporcionará al alumno una letra de la respuesta correcta (en función de la posición del cursor). También puede incluir una pista específica para cada hueco. <br /><br />La creación de los huecos es muy sencilla -- veáse la figura siguiente:<br /><br /><img src="jcloze1.png" alt="Elaborando un ejercicio con JCloze." title="Elaborando un ejercico con JCLoze." width="608" height="484"></img><br /><br />También puede echarle un vistazo a este <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'jcloze1.htm\'); return false;">ejemplo de ejercicio con JCloze</a>. Para más información sobre la forma de trabajar de JCloze, consulte el <strong>Archivo de Ayuda</strong> -- simplemente arranque JCloze y pulse la tecla <strong>F1</strong>.';
1161N[6][2] = new Array();
1162
1163N[6][3] = new Array();
1164N[6][3][0] = new Array();
1165N[6][3][0][0] = 0;
1166N[6][3][0][1] = 'Índice';
1167N[6][3][0][2] = new Array();
1168
1169N[6][3][0][3] = '';
1170N[6][3][0][4] = 0;
1171
1172
1173N[6][4] = new Array();
1174
1175
1176N[7] = new Array();
1177N[7][0] = ' Introducción a JMatch (ejercicios de emparejamiento)';
1178N[7][1] = 'JMatch se utiliza para crear ejercicios de emparejamiento. Básicamente esto quiere decir que se disponen una serie de elementos a un lado y cada uno de ellos ha de emparejarse con los elementos dispuestos en el lado opuesto.<br /><br />Los ejercicios generados con JMatch pueden ser de dos tipos: <strong>modelo estándar</strong> y <strong>modelo arrastrar y soltar</strong>. El modelo estándar (véase un <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'jmatch1.htm\'); return false;">ejemplo</a>) utiliza una lista desplegable de elementos a la derecha. Este es el formato a utilizar cuando usted tenga más de siete u ocho elementos, y cuando los elementos de la derecha son solo de tipo texto; si solamente tiene unos pocos elementos, y especialmente cuando los elementos son gráficos, ustede deberá utilziar el modelo arrastrar y soltar (véase este <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'jmatch2.htm\'); return false;">ejemplo</a>). No utilice el modelo arrastrar y soltar si tiene más de ocho elementos, ya que tendrá que utilizar la barra de desplazamiento vertical y esto dificultará el arrastre de los elementos.<br /><br />Para elaborar un ejercicio con JMatch, introduzca cada uno de los pares de elementos en la misma línea, tal como se muestra en la figura siguiente. Cuando exporte para crear la página Web, el progrqama se encargará de ordenar los elementos a la derecha.<br /><br /><img src="jmatch1.png" alt="Elaborando un ejercicio con JMatch" title="Elaborando un ejercicio con JMatch" width="750" height="465"></img><br /><br />Para más información sobre la forma de trabajar de JMatch, consulte los <strong>Archivos de Ayuda</strong> -- simplemente arranque JMatch y pulse la tecla <strong>F1</strong>.';
1179N[7][2] = new Array();
1180
1181N[7][3] = new Array();
1182N[7][3][0] = new Array();
1183N[7][3][0][0] = 0;
1184N[7][3][0][1] = 'Índice';
1185N[7][3][0][2] = new Array();
1186
1187N[7][3][0][3] = '';
1188N[7][3][0][4] = 0;
1189
1190
1191N[7][4] = new Array();
1192
1193
1194N[8] = new Array();
1195N[8][0] = ' Introducción a JMix (ejercicos para ordenar las letras de una palabra o las palabras de una frase)';
1196N[8][1] = 'JMix se utiliza para elaborar ejercicos de ordenar palabras o frases. Puede ordenar las palabras de una frase, o las letras de una palabra. Como JMatch, JMix puede presentarse en dos modalidades: <strong>modelo estándar</strong>, y <strong>modelo arrastrar y soltar</strong>. Para ver ejemplos, pulse aquí <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'jmix1.htm\'); return false;">Ejercicios modelo estándar</a> o aquí <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'jmix2.htm\'); return false;">Ejercicios modelo arrastrar y soltar</a>.<br /><br />Para obtener instrucciones detalladas sobre como hacer un ejercicio sencillo con JMix, acceda al enlace del Desafío en 2 minutos que se muestra a continuación.<br /><br />Para más información sobre la forma de trabajar de JMix, consulte los <strong><STRONG>Archivos de Ayuda</STRONG> </strong> -- simplemente arranque JMix y pulse la tecla <strong>F1</strong>.';
1197N[8][2] = new Array();
1198
1199N[8][3] = new Array();
1200N[8][3][0] = new Array();
1201N[8][3][0][0] = 12;
1202N[8][3][0][1] = 'El Desafío en 2 minutos: Elabore su primer ejercicio';
1203N[8][3][0][2] = new Array();
1204
1205N[8][3][0][3] = '';
1206N[8][3][0][4] = 0;
1207
1208N[8][3][1] = new Array();
1209N[8][3][1][0] = 0;
1210N[8][3][1][1] = 'Índice';
1211N[8][3][1][2] = new Array();
1212
1213N[8][3][1][3] = '';
1214N[8][3][1][4] = 0;
1215
1216
1217N[8][4] = new Array();
1218
1219
1220N[9] = new Array();
1221N[9][0] = ' Introducción a JCross (crucigramas)';
1222N[9][1] = 'JCross se utiliza para realizar crucigramas. Hay dos fases en la elaboración de un ejercico de crucigrama; primero deberá introducir las letras en la cuadrícula, segundo: añadir las definiciones. Para introducir las letras en la cuadrícula, pulse en una de las casillas y escriba la letra. Pruebe a realizar el ejemplo de la figura siguiente:<br /><br /><img src="jcross1.png" alt="Elaboración de la cuadrícula de un crucigrama." title="Elaboración de la cuadrícula de un crucigrama ." width="575" height="518"></img><br /><br />Cuando haya terminado la cuadrícula, pulse en el botón <strong>Añadir pistas</strong>. Después, para añadir cada una de las definiciones de las palabras de la cuadrícula, pulse en la palabra, escriba la definición o pista y pulse el botón OK:<br /><br /><img src="jcross2.png" alt="Adding clues." title="Adding clues." width="600" height="428"></img><br /><br />A continuación se muestra un <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'jcross1.htm\'); return false;">Ejemplo de crucigrama con JCross</a>. Para más información sobre la forma de trabajar de JCross, consulte los <strong>Archivos de Ayuda</strong> -- simplemente arranque JCross y pulse la tecla <strong>F1</strong>.<br /><br />';
1223N[9][2] = new Array();
1224
1225N[9][3] = new Array();
1226
1227N[9][4] = new Array();
1228
1229
1230N[10] = new Array();
1231N[10][0] = 'The Masher (para crear unidades enlazadas a partir de diferentes ejercicios)';
1232N[10][1] = 'The Masher es un tipo de aplicación diferente de las otras patatas de Hot Potatoes. Sirve para ayudarle a elaborar unidades mas complejas con sus materiales, para enlazar sus ejercicios. Para utilizar The Masher necesita una clave de registro independiente, que solamente puede conseguir si adquiere la versión comercial de Hot Potatoes. Sin dicha clave de registro, solamente podrá elaborar pequeñas unidades de ejercicios. The Masher se utiliza también para publicar archivos que no son ejercicios de Hot Potatoes en la red <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'http://www.hotpotatoes.net\'); return false;">www.hotpotatoes.net</a>.<br /><br />The Masher tiene su propio tutorial (pulse sobre <strong>Ayuda / Tutorial</strong> en el programa The Masher, o <a href="mashertutorial.htm">pulse ahora aquí</a>), también incluye un dettalado Archivo de Ayuda. Para ver el Archivo de Ayuda, arranque el programa The Masher y pulse la tecla <strong>F1</strong>.';
1233N[10][2] = new Array();
1234
1235N[10][3] = new Array();
1236
1237N[10][4] = new Array();
1238
1239
1240N[11] = new Array();
1241N[11][0] = 'Ejemplos de ejercicios';
1242N[11][1] = 'Pulsando en los enlacces podrá acceder a los ejercicios en una nueva ventana (así no perderá el rumbo en este tutorial). Una vez que haya accedido a un ejercicio en su navegador, podrá moverse por todos ellos pulsando en el botón Siguiente en la parte superior del ejercicio. Al terminar de ver los ejercicios, cierre esa ventana del navegador y volverá a ver esta ventana. Posteriormente podrá empezar a realizar su primer ejercicio. <ul><li><a href="" style="cursor: pointer;" onclick="window.open(\'jquiz1.htm\'); return false;">Ejercicio sobre JQuiz</a></li><li><a href="" style="cursor: pointer;" onclick="window.open(\'jcloze1.htm\'); return false;">Ejercicio 1 sobre JCloze</a></li><li><a href="" style="cursor: pointer;" onclick="window.open(\'jcloze2.htm\'); return false;">Ejercicio 2 sobre JCloze</a></li><li><a href="" style="cursor: pointer;" onclick="window.open(\'jcross1.htm\'); return false;">Ejercicio sobre JCross</a></li><li><a href="" style="cursor: pointer;" onclick="window.open(\'jmix1.htm\'); return false;">Ejercicio 1 sobre JMix</a></li><li><a href="" style="cursor: pointer;" onclick="window.open(\'jmix2.htm\'); return false;">Ejercicio 2 sobre JMix (arrastrar y soltar)</a></li><li><a href="" style="cursor: pointer;" onclick="window.open(\'jmatch1.htm\'); return false;">Ejercicio 1 sobre JMatch</a></li><li><a href="" style="cursor: pointer;" onclick="window.open(\'jmatch2.htm\'); return false;">Ejercicio 2 sobre JMatch (arrastrar y soltar)</a></li></ul>';
1243N[11][2] = new Array();
1244
1245N[11][3] = new Array();
1246N[11][3][0] = new Array();
1247N[11][3][0][0] = 12;
1248N[11][3][0][1] = 'El Desafío en 2 minutos: elabore su primer ejercicio';
1249N[11][3][0][2] = new Array();
1250
1251N[11][3][0][3] = '';
1252N[11][3][0][4] = 0;
1253
1254
1255N[11][4] = new Array();
1256
1257
1258N[12] = new Array();
1259N[12][0] = 'El Desafío en 2 minutos: elabore su primer ejercicio';
1260N[12][1] = 'Ahora que ya ha visto el aspecto de todas las modalidades de ejercicios, es el momento de intentar eleborar sus propios ejercicios. Estamos deseando demostrarle que puede hacerlo en dos minutos exactos, utilizando <strong>JMix</strong>. Esto es lo que tiene que hacer:<br /><br />Arranque el programa <strong>JMix</strong>, después<br /><ol><br /> <li>Introduzca un <strong>título</strong>.</li> <li>Introduzca una <strong>frase</strong>. Parta su frase en segmentos, colocando cada segmento en una línea separada.</li> <li>Pulse sobre uno de los dos botones Web, o seleccione "Crear página web" en el menú Archivo. Existen dos formatos de salida, estádar y arrastrar y soltar. Para este ejercicio, no importa cuál se elija.</li> <li>Elija un nombre para su página Web.</li> <li>En el cuadro de dialogo que aparece, puse sobre "Ver el ejercicio en mi navegador".</li></ol><br />Cuando haya terminado, vuelva aquí para continuar con la presentación. Puede que prefiera utilizar el botón <strong>Marcador</strong> de la parte superior de esta página para crear un marcador o favorito en su navegador, así no tendrá que estar navegando para llegar a esta sección de nuevo.<br /><br /><img src="jmix1.png" alt="Cómo crear un ejercicio en JMix" width="649" height="471" title="Cómo crear un ejercicio en JMix"></img>';
1261N[12][2] = new Array();
1262
1263N[12][3] = new Array();
1264N[12][3][0] = new Array();
1265N[12][3][0][0] = 13;
1266N[12][3][0][1] = 'Tres pasos para elaborar un ejercicio';
1267N[12][3][0][2] = new Array();
1268
1269N[12][3][0][3] = '';
1270N[12][3][0][4] = 0;
1271
1272
1273N[12][4] = new Array();
1274
1275
1276N[13] = new Array();
1277N[13][0] = 'Tres pasos para elaborar un ejercicio';
1278N[13][1] = 'Aunque probablemente piense que con el desafío en dos minutos ya puede empezar a trabajar, necesitará saber algo más sobre la forma de trabajar de estas aplicaciones para poder sacarles el máximo partido. Esta última sección del tutorial le conducirá paso a paso a través del proceso de elaboración de un ejercicio mediante <strong>JQuiz</strong>, para presentarle algunos de los conceptos básicos con los que debe familiarizarse.<br /><br />Para elaborar un ejercicio podemos distinguir tres fases o pasos:<br /><br /><ol><li><strong>Introducción de los datos</strong> (preguntas, respuestas y todo lo demás)</li><li><strong>Configuración del formato de salida</strong> (preparación de las leyendas de los botones, instrucciones, y otras características de su página Web)</li><li><strong>Creación de las páginas Web</strong> (compilar sus ejercicios en páginas HTML).</li></ol>';
1279N[13][2] = new Array();
1280
1281N[13][3] = new Array();
1282N[13][3][0] = new Array();
1283N[13][3][0][0] = 14;
1284N[13][3][0][1] = 'Primera fase: Introducción de los datos';
1285N[13][3][0][2] = new Array();
1286
1287N[13][3][0][3] = '';
1288N[13][3][0][4] = 0;
1289
1290
1291N[13][4] = new Array();
1292
1293
1294N[14] = new Array();
1295N[14][0] = 'Primera fase: Introducción de los datos';
1296N[14][1] = 'En esta parte del tutorial vamos a elaborar un ejercicio de respuestas múltiples utilizando <strong>JQuiz</strong>. La primera fase consiste en introducir las preguntas y las respuestas de su ejercicio. Primero, arranque el programa <strong>JQuiz</strong>. Deberá ver un interfaz como el que se muestra en la figura siguiente. Si su interfaz aparece más complejo que este, está probablemente en la <strong>Modalidad Avanzada</strong>; en ese caso, basta con pulsar en <strong>Opciones  / Modalidad / Modalidad Principiantes</strong>.<br /><br />Observe la figura siguiente, y escriba la siguiente información:<br /><br /><ol><li>Escriba el título en la casilla de título.</li><li>Escriba la pregunta en la casilla de preguntas.</li><li>Compruebe que está seleccionado "Respuestas múltiples" en el menú desplegable a la derecha de la pregunta. Esto define el tipo de pregunta que desee realizar.</li><li>Escriba las posibles respuestas en las casillas de la izquierda, y las indicaciones en las de la derecha. Tenga en cuenta que cada una de las respuestas, correcta o incorrecta, tiene sus propias indicaciones.</li><li>Marque la casilla "Correcto" que está junto a la respuesta B.</li></ol><br /><br /><img src="jquiz1.png" alt="Interfaz de JQuiz que muestra una pregunta de respuestas múltiples." width="871" height="638" title="Interfaz de JQuiz que muestra una pregunta de respuestas múltiples."></img>';
1297N[14][2] = new Array();
1298
1299N[14][3] = new Array();
1300N[14][3][0] = new Array();
1301N[14][3][0][0] = 15;
1302N[14][3][0][1] = 'Segunda fase: Configuración del formato de salida';
1303N[14][3][0][2] = new Array();
1304
1305N[14][3][0][3] = '';
1306N[14][3][0][4] = 0;
1307
1308
1309N[14][4] = new Array();
1310
1311
1312N[15] = new Array();
1313N[15][0] = 'Segunda fase: Configuración del formato de salida';
1314N[15][1] = 'Cuando los programas de Hot Potatoes crean las páginas Web pages, lo hacen combinando 3 tipos de recursos:<ul><li>Los <strong>datos</strong> introducidos</li><li>La información de <strong>configuración</strong></li><li>Un conjunto de "<strong>archivos fuente</strong>", o plantillas, que contienen la estructura de la página. </li></ul>Ya hemos visto como se trabaja con los datos; el siguiente paso es la Configuración. La información de configuración esta formada por un conjunto de fragmentos de texto, incluyendo las instrucciones para realizar el ejercicio, las leyendas de los botones, los enlaces a las URLs, que no suelen variar mucho de un ejercicio a otro. Por ejemplo, algunos de los ejercicios de muestra que usted ha visto anteriormente incluyen un botón etiquetado como "Comprobar", para que el alumno pueda comprobar sus respuestas. La leyenda "Comprobar" puede que no cambie de un ejercicIo a otro, por ello no es necesario almacenarlo con los datos; sin embargo, puede que usted necesite cambiarlo (por ejemplo, si usted está creando ejercicios en otro idioma).<br /><br />En el ejemplo de ejercicio de respuestas múltiples, deberá recordar que los ejercicios tienen un título, un subtítulo, y algunas instrucciones en la parte superior de la página. El título de cada ejercicio deberá ser único, por eso forma parte de los <strong>datos</strong>. Sin embargo, el subtítulo (e.g. "Ejercicio de Respuestas Multiples") y las instrucciones ("Elija la respuesta correcta para cada pregunta") probablemente sean las mismas en los ejercicios similares, por ello son parte de la <strong>configuración</strong>. En esta segunda fase vamos a cambiar la configruación.<br /><br />Primero, pulse en <strong>Opciones / Configurar el formato del archivo originado</strong> para acceder a la ventana de configuración. La primera de las fichas, etiquetada como <strong>Títulos / Instrucciones</strong>, contiene el subtítulo del ejercicio y las instrucciones. Escriba algún texto, como en el ejemplo de la figura, después pulse sobre el botón OK.<br /><br /><img src="jquiz_config.png" alt="Ventana de configuración de JQuiz" title="Ventana de configuración de JQuiz" width="628" height="550"></img>';
1315N[15][2] = new Array();
1316
1317N[15][3] = new Array();
1318N[15][3][0] = new Array();
1319N[15][3][0][0] = 16;
1320N[15][3][0][1] = 'Tercera fase: Creación de las páginas Web';
1321N[15][3][0][2] = new Array();
1322
1323N[15][3][0][3] = '';
1324N[15][3][0][4] = 0;
1325
1326
1327N[15][4] = new Array();
1328
1329
1330N[16] = new Array();
1331N[16][0] = 'Tercera fase: Creación de las páginas Web';
1332N[16][1] = 'El último paso consiste en crear las páginas Web a partir de sus datos. Todo lo que necesita hacer es pulsar en <strong>Crear página web / Página web para navegadores v6</strong> en el menú Archivo, y ponerle un nombre a la página. Ponga como nombre de archivo "<strong>test.htm</strong>":<br /><br /><img src="jquiz_output.png" alt="Creando una página Web con JQuiz" title="Creando una página Web con JQuiz" width="424" height="413"></img><br /><br />El programa le informará de que ha generado un archivo, y le permitirá verlo en su navegador. Esto es todo<br />';
1333N[16][2] = new Array();
1334
1335N[16][3] = new Array();
1336N[16][3][0] = new Array();
1337N[16][3][0][0] = 0;
1338N[16][3][0][1] = 'Índice';
1339N[16][3][0][2] = new Array();
1340
1341N[16][3][0][3] = '';
1342N[16][3][0][4] = 0;
1343
1344N[16][3][1] = new Array();
1345N[16][3][1][0] = 4;
1346N[16][3][1][1] = 'Las Patatas, una a una';
1347N[16][3][1][2] = new Array();
1348
1349N[16][3][1][3] = '';
1350N[16][3][1][4] = 0;
1351
1352
1353N[16][4] = new Array();
1354
1355
1356N[17] = new Array();
1357N[17][0] = 'El servidor de hotpotatoes.net';
1358N[17][1] = 'Siempre que elabore un ejercicio con Hot Potatoes, verá el siguiente cuadro de dialogo:<br /><br /><img src="hotpotnet1.png" alt="Ver o publicar el ejercicio." title="Ver o publicar el ejercicio." width="455" height="264"></img><br /><br />Generalmente, usted deseará ver el ejercicio en su navegador para comprobar que funciona tal como usted espera. Sin embargo, la segunda opción le permite utilizar el servicio de publicación de páginas web de <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'http://www.hotpotatoes.net\'); return false;">www.hotpotatoes.net</a>. Se trata de un servidor de páginas Web que puede publicar sus ejercicios de Hot Potatoes, y que le permite proteger mediante contraseña sus ejercicios; sus alumnos podrán conectarse al servidor y realizar los ejerciicos, posteriormente usted podrá revisarlos y comprobar los resultados obtenidos. Este servicio no es gratuito, pero es bastante barato, y puede probarlo creando una cuenta de demostración y publicando unos cuantos ejercicios. Para crear una cuenta demo, simplemente pulse sobre "<strong>Publicar el ejercicio en hotpotatoes.net Website</strong>", después seleccione la opción "<strong>Crear una cuenta demo para mi en hotpotatoes.net</strong>". <br /><br />Para más información sobre el servicio hotpotatoes.net, vea <a style="cursor: pointer; text-decoration: underline;" onclick="window.open(\'http://www.hotpotatoes.info\'); return false;">www.hotpotatoes.info</a>.';
1359N[17][2] = new Array();
1360
1361N[17][3] = new Array();
1362N[17][3][0] = new Array();
1363N[17][3][0][0] = 0;
1364N[17][3][0][1] = 'Índice';
1365N[17][3][0][2] = new Array();
1366
1367N[17][3][0][3] = '';
1368N[17][3][0][4] = 0;
1369
1370
1371N[17][4] = new Array();
1372
1373
1374
1375
1376
1377
1378//-->
1379
1380//]]>
1381
1382       </script>
1383</head>
1384<body onload="StartUp()">
1385<!-- BeginTopNavButtons -->
1386
1387
1388<div class="NavButtonBar">
1389
1390
1391
1392
1393<button class="NavButton" onfocus="NavBtnOver(this)" onblur="NavBtnOut(this)"  onmouseover="NavBtnOver(this)" onmouseout="NavBtnOut(this)" onmousedown="NavBtnDown(this)" onmouseup="NavBtnOver(this)" onclick="location='tutorial.htm?___q;0;'; return false;"> 
1394Índice </button>
1395
1396
1397
1398
1399</div>
1400
1401
1402<!-- EndTopNavButtons -->
1403
1404<div class="Titles">
1405        <h2 class="ExerciseTitle">Tutorial en castellano de Hot Potatoes 6</h2>
1406
1407
1408
1409</div>
1410
1411<div class="DecisionPoint">
1412
1413
1414<div class="ControlButtons">
1415
1416<button class="FuncButton" onfocus="FuncBtnOver(this)" onblur="FuncBtnOut(this)"  onmouseover="FuncBtnOver(this)" onmouseout="FuncBtnOut(this)" onmousedown="FuncBtnDown(this)" onmouseup="FuncBtnOver(this)" onclick="SetBookmark()">
1417Marcador</button>
1418
1419<button class="FuncButton" onfocus="FuncBtnOver(this)" onblur="FuncBtnOut(this)"  onmouseover="FuncBtnOver(this)" onmouseout="FuncBtnOut(this)" onmousedown="FuncBtnDown(this)" onmouseup="FuncBtnOver(this)" onclick="Restart()">
1420Volver a empezar</button>
1421
1422<button id="UndoButton" class="FuncButton" onfocus="FuncBtnOver(this)" onblur="FuncBtnOut(this)"  onmouseover="FuncBtnOver(this)" onmouseout="FuncBtnOut(this)" onmousedown="FuncBtnDown(this)" onmouseup="FuncBtnOver(this)" onclick="Undo()">
1423Atrás</button>
1424
1425</div>
1426
1427        <h2 id="DPTitle" class="DecisionPointTitle"></h2>
1428
1429<table class="DPTable"><tr>
1430<td style="font-size: small; color: #000000">
1431
1432        <div id="DPContentsDiv" class="DecisionPointText">
1433
1434                <div class="Instructions">
1435                Bienvenido al tutorial sobre Hot Potatoes. Este tutorial se ejecuta en su navegador Web. Pulse en el botón Comenzar para entrar en el tutorial.<BR>.<br />
1436                </div>
1437
1438                <div class="Instructions">
1439               
1440                </div>
1441
1442        </div>
1443
1444        <div id="LinkListDiv" class="LinkList">
1445
1446                <div style="text-align: center; font-size:small; color:#000000">
1447<button class="FuncButton" onfocus="FuncBtnOver(this)" onblur="FuncBtnOut(this)"  onmouseover="FuncBtnOver(this)" onmouseout="FuncBtnOut(this)" onmousedown="FuncBtnDown(this)" onmouseup="FuncBtnOver(this)" onclick="StartExercise()">
1448Comenzar</button>
1449                </div>
1450        </div>
1451
1452</td>
1453<td style="font-size: small; color: #000000">
1454        <div id="AssetsDiv" class="Assets">
1455
1456        </div>
1457</td></tr></table>
1458</div>
1459
1460
1461<div class="Feedback" id="FeedbackDiv">
1462<div class="FeedbackText" id="FeedbackContent"></div>
1463<p>
1464<button id="FeedbackOKButton" class="FuncButton" onfocus="FuncBtnOver(this)" onblur="FuncBtnOut(this)" onmouseover="FuncBtnOver(this)" onmouseout="FuncBtnOut(this)" onmousedown="FuncBtnDown(this)" onmouseup="FuncBtnOver(this)" onclick="HideFeedback(); return false;">&nbsp;OK&nbsp;</button>
1465</div>
1466
1467<!-- BeginBottomNavButtons -->
1468
1469
1470<!-- <div class="NavButtonBar" id="BottomNavBar">
1471
1472
1473
1474
1475<button class="NavButton" onfocus="NavBtnOver(this)" onblur="NavBtnOut(this)"  onmouseover="NavBtnOver(this)" onmouseout="NavBtnOut(this)" onmousedown="NavBtnDown(this)" onmouseup="NavBtnOver(this)" onclick="location='tutorial.htm?___q;0;'; return false;"> Index </button>
1476
1477
1478
1479
1480</div> -->
1481
1482
1483<!-- EndBottomNavButtons -->
1484
1485<!-- BeginSubmissionForm -->
1486
1487<!-- EndSubmissionForm -->
1488
1489
1490</body>
1491</html>
Note: See TracBrowser for help on using the browser.