// Functions common to all digital pages


// Load the basic input button images

dn0 = new Image(30, 30);	dn0.src = "images/dn0.gif";
dn1 = new Image(30, 30);	dn1.src = "images/dn1.gif";
up0 = new Image(30, 30);	up0.src = "images/up0.gif";
up1 = new Image(30, 30);	up1.src = "images/up1.gif";

pulse00 = new Image(30, 30);	pulse00.src = "images/pulse0_0.gif";
pulse01 = new Image(30, 30);	pulse01.src = "images/pulse0_1.gif";
pulse10 = new Image(30, 30);	pulse10.src = "images/pulse1_0.gif";
pulse11 = new Image(30, 30);	pulse11.src = "images/pulse1_1.gif";

clock0 = new Image(2, 2);	clock0.src = "/images/blue.gif";
clock1 = new Image(2, 2);	clock1.src = "/images/red.gif";


// show button pressed when mouse button goes down

function clickButton(gateID, inputID) {
	var myGate = parseInt(gateID);
	var myInput = parseInt(inputID);
	var myImage = gateNames[myGate] + myInput;
	overlay(myImage, "dn" + gatesIn[myGate][myInput]);
}


// replace 'up' button if mouse is moved out of range before release

function unClickButton(gateID, inputID) {
	var myGate = parseInt(gateID);
	var myInput = parseInt(inputID);
	var myImage = gateNames[myGate] + myInput;
	overlay(myImage, "up" + gatesIn[myGate][myInput]);
}


// handle input pulse to counter circuit
function pulseClick(gateID, inputID) {
	var myGate = parseInt(gateID);
	var myInput = parseInt(inputID);
	var myImage = gateNames[myGate] + myInput;
	if (pulseState[myGate] == pulseRestingState[myGate]) {
		var pulseEnd = "endPulse(" + myGate + ", " + myInput + ")";
		pulseState[myGate] = 1 - pulseRestingState[myGate];
		var pulseImg = "pulse" + pulseRestingState[myGate] +
			pulseState[myGate];
		update("" + myGate, "" + myInput);
		overlay(myImage, pulseImg);
		myTimer = setTimeout(pulseEnd, 300);
	}
}


function endPulse(gateID, inputID) {
	var myGate = parseInt(gateID);
	var myInput = parseInt(inputID);
	var myImage = gateNames[myGate] + myInput;
	pulseState[myGate] = pulseRestingState[myGate];
	update("" + myGate, "" + myInput);
	overlay(myImage, "pulse" + pulseRestingState[myGate] +
		pulseState[myGate]);
}



// update the changed input, outputs if needed, and update the display
function update(gateID, inputID) {
	var myGate = parseInt(gateID);
	var myInput = parseInt(inputID);
	var myInImage = gateNames[myGate] + myInput;
	var oldInput = gatesIn[myGate][myInput];
	var newInput = (oldInput == "1") ? "0" : "1";
	gatesIn[myGate][myInput] = newInput;

	// 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];
	}

	// If outputs must be handled, do it.
	// This applies only to sequential circuits
	if (gateOutputs[myGate] > 0) {
		findOutput(myGate, myInput);
		for (i = 0; i < gateOutputs[myGate]; i++) {
			newGateImage += gatesOut[myGate][i];
		}
	}

	// Now display the new input button and the new gate image.
	overlay(myInImage, "up" + newInput);
	overlay(gateNames[myGate] + "Gate", newGateImage);
}

