// Gate image overlays

djc0000000 = new Image(550, 300);
	djc0000000.src = "images/djc0000000.gif"
djc0010000 = new Image(550, 300);
	djc0010000.src = "images/djc0010000.gif"
djc0011000 = new Image(550, 300);
	djc0011000.src = "images/djc0011000.gif"
djc0011100 = new Image(550, 300);
	djc0011100.src = "images/djc0011100.gif"
djc0011110 = new Image(550, 300);
	djc0011110.src = "images/djc0011110.gif"
djc0011111 = new Image(550, 300);
	djc0011111.src = "images/djc0011111.gif"
djc0001111 = new Image(550, 300);
	djc0001111.src = "images/djc0001111.gif"
djc0000111 = new Image(550, 300);
	djc0000111.src = "images/djc0000111.gif"
djc0000011 = new Image(550, 300);
	djc0000011.src = "images/djc0000011.gif"
djc0000001 = new Image(550, 300);
	djc0000001.src = "images/djc0000001.gif"


djc1000000 = new Image(550, 300);
	djc1000000.src = "images/djc1000000.gif"
djc1010000 = new Image(550, 300);
	djc1010000.src = "images/djc1010000.gif"
djc1011000 = new Image(550, 300);
	djc1011000.src = "images/djc1011000.gif"
djc1011100 = new Image(550, 300);
	djc1011100.src = "images/djc1011100.gif"
djc1011110 = new Image(550, 300);
	djc1011110.src = "images/djc1011110.gif"
djc1011111 = new Image(550, 300);
	djc1011111.src = "images/djc1011111.gif"
djc1001111 = new Image(550, 300);
	djc1001111.src = "images/djc1001111.gif"
djc1000111 = new Image(550, 300);
	djc1000111.src = "images/djc1000111.gif"
djc1000011 = new Image(550, 300);
	djc1000011.src = "images/djc1000011.gif"
djc1000001 = new Image(550, 300);
	djc1000001.src = "images/djc1000001.gif"


djc0100000 = new Image(550, 300);
	djc0100000.src = "images/djc0100000.gif"
djc1100000 = new Image(550, 300);
	djc1100000.src = "images/djc1100000.gif"



// gate input and output values

var gatesIn = new Array(0);
gatesIn[0] = new Array(1);	// 5-bit Johnson counter
gatesIn[0][0] = "0";
gatesIn[0][1] = "0";

var gatesOut = new Array(0);
gatesOut[0] = new Array(4);	// 5-bit Johnson counter
gatesOut[0][0] = "0";
gatesOut[0][1] = "0";
gatesOut[0][2] = "0";
gatesOut[0][3] = "0";
gatesOut[0][4] = "0";


// gate names

var gateNames = new Array(0);
gateNames[0] = "djc";


// Input and output counts

var gateInputs = new Array(0);
gateInputs[0] = 2;

var gateOutputs = new Array(0);
gateOutputs[0] = 5;


// Pulse state information -- initialize

var pulseRestingState = new Array(0);
pulseRestingState[0] = 0;

var pulseState = new Array(0);
pulseState[0] = pulseRestingState[0];


// Determine next output state

var states = new Array(0);
states[0] = new Array(9);
states[0][0] = "10000";
states[0][1] = "11000";
states[0][2] = "11100";
states[0][3] = "11110";
states[0][4] = "11111";
states[0][5] = "01111";
states[0][6] = "00111";
states[0][7] = "00011";
states[0][8] = "00001";
states[0][9] = "00000";


// Added array only for Johnson counter sequencing

var newInputs = new Array(4)
newInputs[0] = "0";
newInputs[1] = "0";
newInputs[2] = "0";
newInputs[3] = "0";
newInputs[4] = "0";


function findOutput(gateID, inputID) {
        myGate = gateID;
        myInput = inputID;
	// Determine output state for current inputs
	if (gatesIn[myGate][1] == "1") {
		for ( i = 0; i < gateOutputs[myGate]; i++ ) {
			gatesOut[myGate][i] = 0;
		}
	} else {
		if (myInput == "0" &&  gatesIn[myGate][myInput] == "1") {
			gatesOutLast = gateOutputs[myGate] - 1;
			lastOut = gatesOut[myGate][gatesOutLast];
			newInputs[0] = (lastOut == "1") ? "0" : "1";
			for ( i = gatesOutLast; i > 0; i-=1 ) {
				if (i != 2) {
					newInputs[i] = gatesOut[myGate][i-1];
				} else {
	andGateOut = (gatesOut[myGate][0] == "0" && 
			gatesOut[myGate][2] == "0") ? "1" : "0";
	norGateOut = (gatesOut[myGate][1] == "1" &&
			andGateOut == "0") ? "1" : "0";
	newInputs[i] = norGateOut;
				}
			}
			for ( i = 0; i < gateOutputs[myGate]; i++ ) {
				gatesOut[myGate][i] = newInputs[i];
			}
		}
	}
}


// functions and variables to handle illegal states if requested by 
// client.

illegalsLoaded = false;

// Add images for illegal states only if requested by the user

function addIllegals() {
	djc0000010 = new Image(550, 300);
		djc0000010.src = "images/djc0000010.gif"
	djc0000100 = new Image(550, 300);
		djc0000100.src = "images/djc0000100.gif"
	djc0000101 = new Image(550, 300);
		djc0000101.src = "images/djc0000101.gif"
	djc0000110 = new Image(550, 300);
		djc0000110.src = "images/djc0000110.gif"
	djc0001000 = new Image(550, 300);
		djc0001000.src = "images/djc0001000.gif"
	djc0001001 = new Image(550, 300);
		djc0001001.src = "images/djc0001001.gif"
	djc0001010 = new Image(550, 300);
		djc0001010.src = "images/djc0001010.gif"
	djc0001011 = new Image(550, 300);
		djc0001011.src = "images/djc0001011.gif"
	djc0001100 = new Image(550, 300);
		djc0001100.src = "images/djc0001100.gif"
	djc0001101 = new Image(550, 300);
		djc0001101.src = "images/djc0001101.gif"
	djc0001110 = new Image(550, 300);
		djc0001110.src = "images/djc0001110.gif"
	djc0010000 = new Image(550, 300);
		djc0010000.src = "images/djc0010000.gif"
	djc0010001 = new Image(550, 300);
		djc0010001.src = "images/djc0010001.gif"
	djc0010010 = new Image(550, 300);
		djc0010010.src = "images/djc0010010.gif"
	djc0010011 = new Image(550, 300);
		djc0010011.src = "images/djc0010011.gif"
	djc0010100 = new Image(550, 300);
		djc0010100.src = "images/djc0010100.gif"
	djc0010101 = new Image(550, 300);
		djc0010101.src = "images/djc0010101.gif"
	djc0010110 = new Image(550, 300);
		djc0010110.src = "images/djc0010110.gif"
	djc0010111 = new Image(550, 300);
		djc0010111.src = "images/djc0010111.gif"
	djc0011001 = new Image(550, 300);
		djc0011001.src = "images/djc0011001.gif"
	djc0011010 = new Image(550, 300);
		djc0011010.src = "images/djc0011010.gif"
	djc0011011 = new Image(550, 300);
		djc0011011.src = "images/djc0011011.gif"
	djc0011101 = new Image(550, 300);
		djc0011101.src = "images/djc0011101.gif"

	djc1000010 = new Image(550, 300);
		djc1000010.src = "images/djc1000010.gif"
	djc1000100 = new Image(550, 300);
		djc1000100.src = "images/djc1000100.gif"
	djc1000101 = new Image(550, 300);
		djc1000101.src = "images/djc1000101.gif"
	djc1000110 = new Image(550, 300);
		djc1000110.src = "images/djc1000110.gif"
	djc1001000 = new Image(550, 300);
		djc1001000.src = "images/djc1001000.gif"
	djc1001001 = new Image(550, 300);
		djc1001001.src = "images/djc1001001.gif"
	djc1001010 = new Image(550, 300);
		djc1001010.src = "images/djc1001010.gif"
	djc1001011 = new Image(550, 300);
		djc1001011.src = "images/djc1001011.gif"
	djc1001100 = new Image(550, 300);
		djc1001100.src = "images/djc1001100.gif"
	djc1001101 = new Image(550, 300);
		djc1001101.src = "images/djc1001101.gif"
	djc1001110 = new Image(550, 300);
		djc1001110.src = "images/djc1001110.gif"
	djc1010000 = new Image(550, 300);
		djc1010000.src = "images/djc1010000.gif"
	djc1010001 = new Image(550, 300);
		djc1010001.src = "images/djc1010001.gif"
	djc1010010 = new Image(550, 300);
		djc1010010.src = "images/djc1010010.gif"
	djc1010011 = new Image(550, 300);
		djc1010011.src = "images/djc1010011.gif"
	djc1010100 = new Image(550, 300);
		djc1010100.src = "images/djc1010100.gif"
	djc1010101 = new Image(550, 300);
		djc1010101.src = "images/djc1010101.gif"
	djc1010110 = new Image(550, 300);
		djc1010110.src = "images/djc1010110.gif"
	djc1010111 = new Image(550, 300);
		djc1010111.src = "images/djc1010111.gif"
	djc1011001 = new Image(550, 300);
		djc1011001.src = "images/djc1011001.gif"
	djc1011010 = new Image(550, 300);
		djc1011010.src = "images/djc1011010.gif"
	djc1011011 = new Image(550, 300);
		djc1011011.src = "images/djc1011011.gif"
	djc1011101 = new Image(550, 300);
		djc1011101.src = "images/djc1011101.gif"

	illegalsLoaded = true;
}


// Function to directly change one flip-flop by clicking on it

function changeDirect(gateID, outputID) {
	if (! illegalsLoaded) { addIllegals(); }
	myGate = gateID;
	myOutput = outputID;
	if (myGate == "0" && gatesIn[myGate][1] == "0") {
		gatesOut[myGate][myOutput] = 
			(gatesOut[myGate][myOutput] == "0") ? "1" : "0";
	}

	// Set up the input end of the new gate image
	var newGateImage = gateNames[myGate];
	for (i = 0; i < gateInputs[myGate]; i++) {
		newGateImage += gatesIn[myGate][i];
	}

	// Add the outputs
	for (i = 0; i < gateOutputs[myGate]; i++) {
		newGateImage += gatesOut[myGate][i];
	}

	// Now display the new main image
	overlay(gateNames[myGate] + "Gate", newGateImage);
}
