<HTML>
<HEAD>
<TITLE>Patterns</TITLE>
<STYLE>
BODY {
	background:		darkgreen;	
}
A {
	text-decoration:	none; 
	color: 			darkgreen;
	
	font-size: 		24px; 
	text-align: 		center;
}
.points {
	position: 		absolute;
	z-index:		2;
	visibility: 		hidden;
        width: 			25%;
        height: 		25%;
        color: 			white;
	background: 		darkgreen;
	font-weight:		bold;
	font-family:		arial;
        font-size:		24px;
	text-align: 		center;
} 
.info {
	position: 		absolute;
	z-index: 		1;
        color: 			darkgreen;
	background: 		white;
	border-width: 		1px;
	border-color: 		black;
	border-style: 		solid;
        font-size:		24px;
        font-weight: 		bold;
        font-family:		arial;
        text-align: 		center;
}
.arena {
	position: 		absolute;
	z-index: 		1;
	top: 			17%;
        left: 			25%;
        width: 			50%;
        height: 		66%;
        color: 			darkgreen;
	background: 		white;
	
	border-width: 		1px;
	border-color: 		black;
	border-style: 		solid;
        font-size:		14px;
	font-weight:		bold;
        font-family:		arial;
        text-align: 		left;
}

.major {
	position: 		absolute;
	z-index: 		1;
        color: 			darkgreen;
        font-size:		32px;
	font-weight:		bold;
        font-family:		arial;
        text-align: 		center;
}
</STYLE>
<SCRIPT LANGUAGE = "JavaScript">
// Sound for match, miss, and next
var match;
var miss;
var next;
// Do we have sound card?
var haveSound;
// Array for pattern points
var points;
// Current level of play
var level = 1;
// Max level
var maxLevel;
// Patterns in play
var patterns;
// Current pattern
var currentPattern;
// Your turn?
var playerTurn = false;
// Total score
var realScore = 0;
// Total possible
var possibleScore = 0;
        
// get seed for random number
var now = new Date();
var seed = now.getTime() % 0xffffffff;
function rand(n) {
seed = (0x015a4e35 * seed) % 0x7fffffff;
return (seed >> 16) % n;
}
function makeGameSound(file, start, end) {
this.sound = Mixer.newSound("URLWav");
this.channel = Mixer.newChannel();
this.channel.input = this.sound;
this.sound.loadMedia(file, start, end);
this.play = playGameSound;
}
function playGameSound() {
this.channel.time = 0;
this.channel.play();
}
function showScore() {
var outPercent = Math.round(100 * (realScore/((possibleScore == 0) ? 1 : possibleScore)));
score.innerText = outPercent;
} 
function clearPoints() {
    for (var i = 0; i < points.length; i++) {
    points[i].style.visibility = 'hidden';
    score.innerText = '';
    }
}
function showPoint(point, value) {
points[point].style.visibility = 'visible';
points[point].innerText = value;
}
function showBegin() {
clearPoints();
setTimeout('document.all.gameSub.style.display = \'none\'; document.all.logo.style.visibility = \'hidden\'; document.all.finished.style.visibility = \'hidden\'', 500); 
setTimeout('next.play(); document.all.begin.style.visibility = \'visible\'', 1000); 
setTimeout('document.all.begin.style.visibility = \'hidden\'; initVars(); compilePatterns();', 2000); 
}
function showEnd() {
setTimeout('next.play(); clearPoints(); document.all.finished.style.visibility = \'visible\'; slide(0, 38);', 500);
}
function slide(currentPos, finalPos) {
    if (currentPos < finalPos) {
    currentPos += 4;
    document.all.finished.style.top = currentPos + '%';
    setTimeout('slide(' + currentPos + ',' + finalPos + ')', 25);
    }
}
function compilePatterns() {
playerTurn = false;
currentPattern = 0;
patterns = new Array();
var i = 0;
    while (i < level) {
    patterns[i] = rand(4);
        if (i > 0) {
            if (patterns[i] != patterns[i - 1]) i++;
        }
        else i++;
    }
showPatterns();
}
function showPatterns() {
clearPoints();
    if (currentPattern < patterns.length) {
    showPoint(patterns[currentPattern], currentPattern + 1);
    match.play();
    currentPattern++;
    setTimeout('showPatterns()', 500);
    }
    else { 
    currentPattern = 0;
    currentPatternPart = 0;
    playerTurn = true;
    }
showScore();
}
function reproducePatterns() {
    if (playerTurn) {
    var key = event.keyCode;
        if (currentPattern < patterns.length) {
        var point = patterns[currentPattern];
            if (key == 38 || key == 39 || key == 40 || key == 37) {
            clearPoints();
                if ((point == 0 && key == 38) || (point == 1 && key == 39) || (point == 2 && key == 40) || (point == 3 && key == 37)) {
                showPoint(point, currentPattern + 1);
                match.play();
                realScore++;
                } 
                else {
                showPoint(4, '0');
                miss.play();
                }
            possibleScore++;
            currentPattern++;
            showScore();
            }
        }
        if (currentPattern == patterns.length) { 
        level++;
        playerTurn = false; 
            if (level <= maxLevel) {
            setTimeout('next.play(); clearPoints()', 500);
            setTimeout('compilePatterns()', 1000);
            }
            else { 
            showEnd();
            }
        }
    }
}
function controlExpand() {
var parent = event.srcElement.id; // current name 
    if (parent != '') {
    var child = document.all[(event.srcElement.id + "Sub")] // name with "Sub"
        if (child != null) {
        child.style.display = (child.style.display == 'none') ? '' : 'none';
        }
    }
}
function initVars() {
window.focus();
level = 1;
realScore = 0;
possibleScore = 0;
match = new makeGameSound('match.wav', 1, 1000);
miss = new makeGameSound('miss.wav', 1, 1000);
next = new makeGameSound('next.wav', 1, 1000);
points = new Array(document.all.top, document.all.right, document.all.bot, document.all.left, document.all.mid);
}
</SCRIPT>
</HEAD>
<BODY BGCOLOR = "#FFFFFF" onLoad = "initVars()" onKeyDown = "reproducePatterns()">
<DIV CLASS = "arena" ID = "real">
    <DIV CLASS = "points" STYLE = "top: 0%; left: 38%;" ID = "top"></DIV>
    <DIV CLASS = "points" STYLE = "top: 75%; left: 38%;" ID = "bot"></DIV>
    <DIV CLASS = "points" STYLE = "top: 38%; left: 0%;" ID = "left"></DIV>
    <DIV CLASS = "points" STYLE = "top: 38%; left: 75%;" ID = "right"></DIV>
    <DIV CLASS = "points" STYLE = "top: 38%; left: 38%;" ID = "mid"></DIV>
    <DIV CLASS = "major" ID = "logo" STYLE = "top: 38%; z-index: 3;">Pattern
        <DIV STYLE = "font-size: 14; color: gray;">A Simple Game</DIV>
    </DIV>
    <DIV CLASS = "major" ID = "begin" STYLE = "top: 38%; visibility: hidden; z-index: 3">Begin
        <DIV STYLE = "font-size: 14; color: gray;">Get Ready...</DIV>
    </DIV>
    <DIV CLASS = "major" ID = "finished" STYLE = "top: 0%; visibility: hidden; z-index: 3">Finished
        <DIV STYLE = "font-size: 14; color: gray;">The game is over.</DIV>
    </DIV>
</DIV>
<DIV CLASS = "info" STYLE = "top: 17%; left: 6%; width: 17%; height: 66%; font-size: 12; margin-left: 5pt;" onClick = "controlExpand()">
<A HREF = "#" ID = "game" STYLE = "text-align: left;">Game</A>
    <DIV ID = "gameSub" STYLE = "display: none;">
        <A ID = "start" HREF = "#" STYLE = "text-align: left; font-size: 16;">Start</A>
            <FORM ID = "startSub" STYLE = "text-align: left; display: none;" onClick = "if (event.srcElement.tagName == 'INPUT') { showBegin(); }">
            Play Pattern at what skill level?<BR><BR>
            <INPUT NAME = "level" TYPE = "RADIO" onClick = "maxLevel = 7;"> Easy<BR> 
            <INPUT NAME = "level" TYPE = "RADIO" onClick = "maxLevel = 10;"> Medium<BR>
            <INPUT NAME = "level" TYPE = "RADIO" onClick = "maxLevel = 13;"> Hard<BR>
            </FORM>
        <A ID = "rules" HREF = "#" STYLE = "text-align: left; font-size: 16;">Rules</A>
            <DIV ID = "rulesSub" STYLE = "text-align: left; display: none;"><BR>
            The rules to Pattern are simple; use the arrow keys (up, down, left, and right) to reproduce the patterns that you see on the screen. You will be scored by percentage. 
            </DIV>
	</DIV>
</DIV>
<DIV CLASS = "info" STYLE = "top: 83%; left: 25%; width: 50%; height: 12%;"> 
Score: <SPAN ID = "score">0</SPAN>
</DIV>
<OBJECT ID = "Mixer" CLASSID="CLSID:9A7D63C1-5391-11D0-8BB6-0000F803A803"></OBJECT>
</BODY>
</HTML>