// Gate image overlays

div3000 = new Image(275, 200);	div3000.src = "images/div3000.gif"
div3010 = new Image(275, 200);	div3010.src = "images/div3010.gif"
div3011 = new Image(275, 200);	div3011.src = "images/div3011.gif"
div3100 = new Image(275, 200);	div3100.src = "images/div3100.gif"
div3110 = new Image(275, 200);	div3110.src = "images/div3110.gif"
div3111 = new Image(275, 200);	div3111.src = "images/div3111.gif"

div50000 = new Image(400, 200);	div50000.src = "images/div50000.gif"
div50100 = new Image(400, 200);	div50100.src = "images/div50100.gif"
div50010 = new Image(400, 200);	div50010.src = "images/div50010.gif"
div50110 = new Image(400, 200);	div50110.src = "images/div50110.gif"
div50001 = new Image(400, 200);	div50001.src = "images/div50001.gif"
div51000 = new Image(400, 200);	div51000.src = "images/div51000.gif"
div51100 = new Image(400, 200);	div51100.src = "images/div51100.gif"
div51010 = new Image(400, 200);	div51010.src = "images/div51010.gif"
div51110 = new Image(400, 200);	div51110.src = "images/div51110.gif"
div51001 = new Image(400, 200);	div51001.src = "images/div51001.gif"

div5n0000 = new Image(400, 200);	div5n0000.src = "images/div5n0000.gif"
div5n0100 = new Image(400, 200);	div5n0100.src = "images/div5n0100.gif"
div5n0010 = new Image(400, 200);	div5n0010.src = "images/div5n0010.gif"
div5n0101 = new Image(400, 200);	div5n0101.src = "images/div5n0101.gif"
div5n0011 = new Image(400, 200);	div5n0011.src = "images/div5n0011.gif"
div5n1000 = new Image(400, 200);	div5n1000.src = "images/div5n1000.gif"
div5n1100 = new Image(400, 200);	div5n1100.src = "images/div5n1100.gif"
div5n1010 = new Image(400, 200);	div5n1010.src = "images/div5n1010.gif"
div5n1101 = new Image(400, 200);	div5n1101.src = "images/div5n1101.gif"
div5n1011 = new Image(400, 200);	div5n1011.src = "images/div5n1011.gif"


// gate input and output values

var gatesIn = new Array(2);
gatesIn[0] = new Array(0);	// 2-bit base-3 counter
gatesIn[0][0] = "0";

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

gatesIn[2] = new Array(0);	// 3-bit gateless div-by-5 counter
gatesIn[2][0] = "0";


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

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

gatesOut[2] = new Array(2);	// 3-bit gateless div-by-5 counter
gatesOut[2][0] = "0";
gatesOut[2][1] = "0";
gatesOut[2][2] = "0";


// gate names

var gateNames = new Array(2);
gateNames[0] = "div3";
gateNames[1] = "div5";
gateNames[2] = "div5n";


// Input and output counts

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

var gateOutputs = new Array(2);
gateOutputs[0] = 2;
gateOutputs[1] = 3;
gateOutputs[2] = 3;


// Pulse state information -- initialize

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

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


// Determine next output state

var states = new Array(2);
states[0] = new Array(3);
states[0][0] = "10";
states[0][1] = "11";
states[0][2] = "01";	// Will never enter this state
states[0][3] = "00";

states[1] = new Array(4);
states[1][0] = "100";
states[1][1] = "010";
states[1][2] = "110";
states[1][3] = "001";
states[1][4] = "000";

states[2] = new Array(6);
states[2][0] = "100";
states[2][1] = "010";
states[2][2] = "101";
states[2][3] = "000";
states[2][4] = "000";
states[2][5] = "011";
states[2][6] = "000";


function findOutput(gateID, inputID) {
        myGate = gateID;
        myInput = inputID;
	// Determine output state for current inputs
	if (gatesIn[myGate][myInput] == "0") {
		myPlace = 1;
		myState = 0;
		for ( i = 0; i < gateOutputs[myGate]; i++ ) {
			myState += parseInt(gatesOut[myGate][i]) * myPlace;
			myPlace *= 2;
		}
		newState = states[myGate][myState];
		for ( i = 0; i < gateOutputs[myGate]; i++ ) {
			newOutput = newState.substring(i, i+1);
			gatesOut[myGate][i] = newOutput;
		}
	}
}

