//<![CDATA[

<!--

function Client(){

//if not a DOM browser, hopeless
        this.min = false; if (document.getElementById){this.min = true;};

        this.ua = navigator.userAgent;
        this.name = navigator.appName;
        this.ver = navigator.appVersion;

//Get data about the browser
        this.mac = (this.ver.indexOf('Mac') != -1);
        this.win = (this.ver.indexOf('Windows') != -1);

//Look for Gecko
        this.gecko = (this.ua.indexOf('Gecko') > 1);
        if (this.gecko){
                this.geckoVer = parseInt(this.ua.substring(this.ua.indexOf('Gecko')+6, this.ua.length));
                if (this.geckoVer < 20020000){this.min = false;}
        }

//Look for Firebird
        this.firebird = (this.ua.indexOf('Firebird') > 1);

//Look for Safari
        this.safari = (this.ua.indexOf('Safari') > 1);
        if (this.safari){
                this.gecko = false;
        }

//Look for IE
        this.ie = (this.ua.indexOf('MSIE') > 0);
        if (this.ie){
                this.ieVer = parseFloat(this.ua.substring(this.ua.indexOf('MSIE')+5, this.ua.length));
                if (this.ieVer < 5.5){this.min = false;}
        }

//Look for Opera
        this.opera = (this.ua.indexOf('Opera') > 0);
        if (this.opera){
                this.operaVer = parseFloat(this.ua.substring(this.ua.indexOf('Opera')+6, this.ua.length));
                if (this.operaVer < 7.04){this.min = false;}
        }
        if (this.min == false){
                alert('Your browser may not be able to handle this page.');
        }

//Special case for the ie5mac
        this.ie5mac = (this.ie&&this.mac&&(this.ieVer<6));
}

var C = new Client();

//for (prop in C){
//        alert(prop + ': ' + C[prop]);
//}

//CODE FOR HANDLING NAV BUTTONS AND FUNCTION BUTTONS

//[strNavBarJS]
function NavBtnOver(Btn){
        if (Btn.className != 'NavButtonDown'){Btn.className = 'NavButtonUp';}
}

function NavBtnOut(Btn){
        Btn.className = 'NavButton';
}

function NavBtnDown(Btn){
        Btn.className = 'NavButtonDown';
}
//[/strNavBarJS]

function FuncBtnOver(Btn){
        if (Btn.className != 'FuncButtonDown'){Btn.className = 'FuncButtonUp';}
}

function FuncBtnOut(Btn){
        Btn.className = 'FuncButton';
}

function FuncBtnDown(Btn){
        Btn.className = 'FuncButtonDown';
}

function FocusAButton(){
        if (document.getElementById('CheckButton1') != null){
                document.getElementById('CheckButton1').focus();
        }
        else{
                if (document.getElementById('CheckButton2') != null){
                        document.getElementById('CheckButton2').focus();
                }
                else{
                        document.getElementsByTagName('button')[0].focus();
                }
        }
}

//CODE FOR POPUP FEEDBACK BOX

var topZ = 1000;

function ShowMessage(Feedback){
        var Output = Feedback + '<br /><br />';
        document.getElementById('FeedbackContent').innerHTML = Output;
        var FDiv = document.getElementById('FeedbackDiv');
        topZ++;
        FDiv.style.zIndex = topZ;
        FDiv.style.top = TopSettingWithScrollOffset(30) + 'px';


//IE can't focus a hidden div; Moz needs to focus before display to avoid jumping
        if (C.gecko){
                document.getElementById('FeedbackOKButton').focus();
        }
        FDiv.style.display = 'block';

        ShowElements(false, 'input');
        ShowElements(false, 'select');
        ShowElements(false, 'object');
        if (C.ie){
                document.getElementById('FeedbackOKButton').focus();
        }

//

}

function ShowElements(Show, TagName){
//Special for IE bug -- hide all the form elements that will show through the popup
        if (C.ie){
                var Els = document.getElementsByTagName(TagName);
                for (var i=0; i<Els.length; i++){
                        if (Show == true){
                                Els[i].style.display = 'inline';
                        }
                        else{
                                Els[i].style.display = 'none';
                        }
                }
        }
}

function HideFeedback(){
        document.getElementById('FeedbackDiv').style.display = 'none';
        ShowElements(true, 'input');
        ShowElements(true, 'select');
        ShowElements(true, 'object');
        if (Finished == true){
                Finish();
        }
}

//GENERAL UTILITY FUNCTIONS AND VARIABLES

//PAGE DIMENSION FUNCTIONS

function PageDim(){
//Get the page width and height
        this.W = 600;
        this.H = 400;
        this.W = document.getElementsByTagName('body')[0].clientWidth;
        this.H = document.getElementsByTagName('body')[0].clientHeight;
}

var pg = null;

function GetPageXY(El) {
        var XY = {x: 0, y: 0};
        while(El){
                XY.x += El.offsetLeft;
                XY.y += El.offsetTop;
                El = El.offsetParent;
        }
        return XY;
}

function GetScrollTop(){
        if (document.documentElement && document.documentElement.scrollTop){
                return document.documentElement.scrollTop;
        }
        else{
                if (document.body){
                         return document.body.scrollTop;
                }
                else{
                        return window.pageYOffset;
                }
        }
}

function GetViewportHeight(){
        if (window.innerHeight){
                return window.innerHeight;
        }
        else{
                return document.getElementsByTagName('body')[0].clientHeight;
        }
}

function TopSettingWithScrollOffset(TopPercent){
        var T = Math.floor(GetViewportHeight() * (TopPercent/100));
        return GetScrollTop() + T;
}

//UNICODE CHARACTER FUNCTIONS

function IsCombiningDiacritic(CharNum){
        var Result = (((CharNum >= 0x0300)&&(CharNum <= 0x370))||((CharNum >= 0x20d0)&&(CharNum <= 0x20ff)));
        Result = Result || (((CharNum >= 0x3099)&&(CharNum <= 0x309a))||((CharNum >= 0xfe20)&&(CharNum <= 0xfe23)));
        return Result;
}

function IsCJK(CharNum){
        return ((CharNum >= 0x3000)&&(CharNum < 0xd800));
}

//CROSSWORD CORE JAVASCRIPT CODE

var InGap = false;
var CurrentBox = null;
var Feedback = '';
var AcrossCaption = '';
var DownCaption = '';
var Correct = 'Correct! Well done.';
var Incorrect = 'If any of your answers are incorrect the squares will be blanked out.';
var GiveHint = 'A correct letter has been added.';
var YourScoreIs = 'Your score is ';
var BuiltGrid = '';
var BuiltExercise = '';
var Penalties = 0;
var Score = 0;
var InTextBox = false;
var Locked = false;
var TimeOver = false;

var InputStuff = '<form method="post" action="" onsubmit="return false;"><span class="ClueNum">[strClueNum].&nbsp;&nbsp;';
InputStuff += '[strClue] <input onfocus="CurrentBox=this;InTextBox=true;" onblur="InTextBox=false;" id="[strBoxId]" type="edit" size="[strEditSize]" maxlength="[strMaxLength]">&nbsp&nbsp';
InputStuff += '<button class="FuncButton" onfocus="FuncBtnOver(this)" onblur="FuncBtnOut(this)" onmouseover="FuncBtnOver(this)" onmouseout="FuncBtnOut(this)" onmousedown="FuncBtnDown(this)" onmouseup="FuncBtnOut(this)" onclick="EnterGuess([strParams])">Enter<\/button>&nbsp&nbsp';
InputStuff += '<button class="FuncButton" onfocus="FuncBtnOver(this)" onblur="FuncBtnOut(this)" onmouseover="FuncBtnOver(this)" onmouseout="FuncBtnOut(this)" onmousedown="FuncBtnDown(this)" onmouseup="FuncBtnOut(this)" onclick="ShowHint([strParams])">Hint<\/button><br>';
InputStuff += '';

var CurrBoxElement = null;
var Finished = false;

function StartUp(){
        RemoveBottomNavBarForIE();
        AcrossCaption = document.getElementById('CluesAcrossLabel').innerHTML;
        DownCaption = document.getElementById('CluesDownLabel').innerHTML;

}

function GetAnswerLength(Across,x,y){
        Result = 0;
        if (Across == false){
                while ((x<L.length)&&(L[x][y].length > 0)){
                        Result += L[x][y].length;
                        x++;
                }
                return Result;
        }
        else{
                while ((y<L[x].length)&&(L[x][y].length > 0)){
                        Result += L[x][y].length;
                        y++;
                }
                return Result;
        }
}

function GetEditSize(Across,x,y){
        var Len = GetAnswerLength(Across,x,y);
        if (IsCJK(L[x][y].charCodeAt(0))){
                Len *= 2;
        }
        return Len;
}

function ShowClue(ClueNum,x,y){
        var Result = '';
        var Temp;
        var strParams;
        var Clue = document.getElementById('Clue_A_' + ClueNum);
        if (Clue != null){
                Temp = InputStuff.replace(/\[ClueNum\]/g, ClueNum);
                Temp = Temp.replace(/\[strClueNum\]/g, AcrossCaption + ' ' + ClueNum);
                strParams = 'true,' + ClueNum + ',' + x + ',' + y + ',\'[strBoxId]\'';
                Temp = Temp.replace(/\[strParams\]/g, strParams);
                Temp = Temp.replace(/\[strBoxId\]/g, 'GA_' + ClueNum + '_' + x + '_' + y);
                Temp = Temp.replace(/\[strEditSize\]/g, GetEditSize(true,x,y));
                Temp = Temp.replace(/\[strMaxLength\]/g, GetAnswerLength(true,x,y));
                Temp = Temp.replace(/\[strClue\]/g, Clue.innerHTML, Temp);
                Result += Temp;
        }
        Clue = document.getElementById('Clue_D_' + ClueNum);
        if (Clue != null){
                Temp = InputStuff.replace(/\[ClueNum\]/g, ClueNum);
                Temp = Temp.replace(/\[strClueNum\]/g, DownCaption + ' ' + ClueNum);
                strParams = 'false,' + ClueNum + ',' + x + ',' + y + ',\'[strBoxId]\'';
                Temp = Temp.replace(/\[strParams\]/g, strParams);
                Temp = Temp.replace(/\[strBoxId\]/g, 'GD_' + ClueNum + '_' + x + '_' + y);
                Temp = Temp.replace(/\[strEditSize\]/g, GetAnswerLength(false,x,y));
                Temp = Temp.replace(/\[strClue\]/g, Clue.innerHTML, Temp);
                Result += Temp;
        }
        document.getElementById('ClueEntry').innerHTML = Result;
}

function EnterGuess(Across,ClueNum,x,y,BoxId){
        if (document.getElementById(BoxId) != null){
                var Guess = document.getElementById(BoxId).value;
                var AnsLength = GetAnswerLength(Across,x,y);
                EnterAnswer(Guess,Across,AnsLength,x,y);
        }
}

function SplitStringToPerceivedChars(InString, PC){
        var Temp = InString.charAt(0);
        if (InString.length > 1){
                for (var i=1; i<InString.length; i++){
                        if (IsCombiningDiacritic(InString.charCodeAt(i)) == true){
                                Temp += InString.charAt(i);
                        }
                        else{
                                PC.push(Temp);
                                Temp = InString.charAt(i);
                        }
                }
        }
        PC.push(Temp);
}

function EnterAnswer(Guess,Across,AnsLength,x,y){
        Guess = Guess.toUpperCase();

        var PC = new Array();
        SplitStringToPerceivedChars(Guess, PC);

        var i=x;
        var j=y;
        var Letter = 0;
        while (Letter < AnsLength){
                if (Letter < PC.length){
                        G[i][j] = PC[Letter];
                        if (document.getElementById('L_' + i + '_' + j) != null){
                                document.getElementById('L_' + i + '_' + j).innerHTML = PC[Letter];
                        }
                }
                if (Across == true){
                        j++;
                }
                else{
                        i++;
                }
                Letter++;
        }
}

function SetGridSquareValue(x,y,Val){
        var GridId = 'L_' + x + '_' + y;
        if (document.getElementById(GridId) != null){
                document.getElementById(GridId).innerHTML = Val;
        }
}

function ShowHint(Across,ClueNum,x,y,BoxId){
        var i=x;
        var j=y;
        var OutString = '';
        if (Across==true){
                while (j<L[i].length){
                        if (L[i][j] != ''){
                                OutString += L[i][j];
                                if (G[i][j] != L[i][j]){
                                        G[i][j] = L[i][j];
                                        Penalties++;
                                        break;
                                }
                        }
                        else{
                                break;
                        }
                j++;
                }
        }
        else{
                while (i<L.length){
                        if (L[i][j] != ''){
                                OutString += L[i][j];
                                if (G[i][j] != L[i][j]){
                                        G[i][j] = L[i][j];
                                        Penalties++;
                                        break;
                                }
                        }
                        else{
                                break;
                        }
                i++;
                }
        }
        if (document.getElementById(BoxId) != null){
                document.getElementById(BoxId).value = OutString;
        }
}

L = new Array();

L[0] = new Array('','','','G','E','T',' ','O','N',' ','W','I','T','H','','','','L');

L[1] = new Array('','','','I','','','','','','','','','','','','','','O');

L[2] = new Array('','','','V','','','','','','','','','','','','','','O');

L[3] = new Array('T','A','K','E',' ','B','A','C','K','','','','','','','B','','K');

L[4] = new Array('','','',' ','','','','','','','','','','','','E','','I');

L[5] = new Array('','','','U','','','','','W','','','F','I','L','L',' ','I','N');

L[6] = new Array('B','','','P','A','Y',' ','B','A','C','K','','','O','','O','','G');

L[7] = new Array('R','','','','','','','','S','','','','','O','','V','',' ');

L[8] = new Array('O','','','','','','','','H','','','','','K','','E','','F');

L[9] = new Array('K','','','','','P','U','T',' ','O','F','F','','I','','R','','O');

L[10] = new Array('E','','','H','','','','','U','','','I','','N','','','','R');

L[11] = new Array('N','','G','O','N','E',' ','U','P','','','N','','G','','','','');

L[12] = new Array(' ','','','L','','','','','','','','D','',' ','','','','');

L[13] = new Array('U','','','D','','','','G','I','V','E',' ','B','A','C','K','','');

L[14] = new Array('P','U','T',' ','O','N','','','','','','O','','F','','','','');

L[15] = new Array('','','','O','','','','','','','','U','','T','','','','');

L[16] = new Array('','W','E','N','T',' ','B','A','C','K','','T','','E','','','','');

L[17] = new Array('','','','','','','','','','','','','','R','','','','');

G = new Array();

G[0] = new Array('','','','','','','','','','','','','','','','','','');

G[1] = new Array('','','','','','','','','','','','','','','','','','');

G[2] = new Array('','','','','','','','','','','','','','','','','','');

G[3] = new Array('','','','','','','','','','','','','','','','','','');

G[4] = new Array('','','','','','','','','','','','','','','','','','');

G[5] = new Array('','','','','','','','','','','','','','','','','','');

G[6] = new Array('','','','','','','','','','','','','','','','','','');

G[7] = new Array('','','','','','','','','','','','','','','','','','');

G[8] = new Array('','','','','','','','','','','','','','','','','','');

G[9] = new Array('','','','','','','','','','','','','','','','','','');

G[10] = new Array('','','','','','','','','','','','','','','','','','');

G[11] = new Array('','','','','','','','','','','','','','','','','','');

G[12] = new Array('','','','','','','','','','','','','','','','','','');

G[13] = new Array('','','','','','','','','','','','','','','','','','');

G[14] = new Array('','','','','','','','','','','','','','','','','','');

G[15] = new Array('','','','','','','','','','','','','','','','','','');

G[16] = new Array('','','','','','','','','','','','','','','','','','');

G[17] = new Array('','','','','','','','','','','','','','','','','','');

function CheckAnswers(){
        if (Locked == true){return;}

        var AllCorrect = true;
        var TotLetters = 0;
        var CorrectLetters = 0;

//Check each letter
        for (var i=0; i<L.length; i++){
                for (var j=0; j<L[i].length; j++){
                        if (L[i][j] != ''){
                                TotLetters++;
                                if (G[i][j] != L[i][j]){
                                        G[i][j] = '';
//Blank that square in the grid
                                        SetGridSquareValue(i,j,'');
                                        AllCorrect = false;
                                }
                                else{
                                        CorrectLetters++;
                                }
                        }
                }
        }

        Score = Math.floor(((CorrectLetters-Penalties) * 100)/TotLetters);
        if (Score < 0){Score = 0;}

//Compile the output
        var Output = '';

        if (AllCorrect == true){
                Output = Correct + '<br />';
        }

        Output += YourScoreIs + ' ' + Score + '%.<br />';
        if (AllCorrect == false){
                Output += Incorrect;
                Penalties++;
        }

        ShowMessage(Output);
        WriteToInstructions(Output);

        if ((AllCorrect == true)||(TimeOver == true)){


                TimeOver = true;
                Locked = true;
                Finished = true;
                setTimeout('Finish()', SubmissionTimeout);
        }
}

function Finish(){
//If there's a form, fill it out and submit it
        if (document.store != null){
                Frm = document.store;
                Frm.starttime.value = HPNStartTime;
                Frm.endtime.value = (new Date()).getTime();
                Frm.mark.value = Score;
                Frm.submit();
        }
}

function TypeChars(Chars){
        if (CurrentBox != null){
                CurrentBox.value += Chars;
        }
}

//-->

//]]>
