So, the easiest solution to the problem was one that is almost undocumented. It turns out that the .enabled
property can be used for (almost) any ScriptUI object. Thus, I could simply keep the OK button disabled until all of the fields passed verification. I needed a separate function for this, but it works flawlessly:
function ifFieldsFilled ()
{
if (orderNumText.text != "" && shipDateText.text != "" && initialsText.text != "" && dateValid)
{
return true;
}
else
{
return false;
}
}
var curDate = new Date();
var curDay = curDate.getDate();
var curMonth = curDate.getMonth() + 1;
var curYear = curDate.getYear() - 100;
var dateFormat = /^(0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.]\d\d$/;
var dateValid = false;
var outputData = new Window("dialog", windowTitle);
outputData.preferredSize = [337, 300];
outputData.orientation = "stack";
outputData.margins = 0;
var stackGroup = outputData.add("group");
stackGroup.margins = [0, 48, 0, 0];
stackGroup.alignment = ["", "top"];
stackGroup.alignChildren = ["", "top"];
var textPanel = stackGroup.add("panel");
textPanel.orientation = "row";
textPanel.alignChildren = ["", "bottom"];
var staticGroup = textPanel.add("group");
staticGroup.orientation = "column";
staticGroup.alignChildren = "right";
staticGroup.spacing = 16;
staticGroup.graphics.foregroundColor = staticGroup.graphics.newPen(outputData.graphics.PenType.SOLID_COLOR, [1, 1, 1], 1);
staticGroup.add("statictext", undefined, "&Order Number:");
staticGroup.add("statictext", undefined, "&Ship Date:");
staticGroup.add("statictext", undefined, "&Initials:");
staticGroup.add("statictext", undefined, "Ove&rruns?");
staticGroup.add("statictext", undefined, "Digital &Print?");
var editGroup = textPanel.add("group");
editGroup.orientation = "column";
editGroup.alignChildren = "left";
var orderNumText = editGroup.add("edittext");
orderNumText.characters = 8;
orderNumText.active = true;
orderNumText.onChange = function ()
{
if (!/\b\d{6}\b/.test(orderNumText.text) && orderNumText.text != "")
{
// If the entered text does not contain exactly 6 digits.
alert("The order number does not appear to conform to a standard order number.\n Please fix and try again.");
}
okButton.enabled = ifFieldsFilled();
}
var shipDateText = editGroup.add("edittext");
shipDateText.characters = 8;
shipDateText.onChange = function ()
{
if (dateFormat.test(shipDateText.text))
{
var enteredDate = shipDateText.text.match(/\b\d*\b/g);
var entMonth = parseInt(enteredDate[0]);
var entDay = parseInt(enteredDate[2]);
var entYear = parseInt(enteredDate[4]);
if (entYear < curYear || entYear > curYear + 1)
{
// If the entered year is older than the current year, or
// if the entered year is two or more years in the future.
alert("Invalid date entered. Please fix.");
dateValid = false;
}
else if ((entYear > curYear && curMonth < 12) || entMonth > curMonth + 1)
{
// If the entered month is more than one month ahead, just verify that it is correct.
alert("Please verify that the entered date is correct before proceeding.");
}
else if ((entMonth < curMonth && curMonth < 12) || (entMonth == curMonth && entDay < curDay))
{
// If the entered date is within the same month, but on an earlier day, alert the user.
alert("Invalid date entered. Please fix.");
dateValid = false;
}
else
{
// The date is completely valid.
dateValid = true;
}
}
else
{
alert("Date format not recognized. Please try again.\nDate must be in the form of MM/DD/YY.");
shipDateText.text = "";
}
okButton.enabled = ifFieldsFilled();
}
var initialsText = editGroup.add("edittext");
initialsText.characters = 3;
initialsText.onChanging = function ()
{
okButton.enabled = ifFieldsFilled();
}
var overRunsBox = editGroup.add("checkbox");
var digitalPrintBox = editGroup.add("checkbox");
var buttonGroup = stackGroup.add("group");
buttonGroup.orientation = "column";
var okButton = buttonGroup.add("button", undefined, "OK", {name: "ok"});
okButton.enabled = false;
var cancelButton = buttonGroup.add("button", undefined, "Cancel", {name: "cancel"});
// If the user clicked "OK", then the contents get put into variables and the work begins on the document(s).
if (outputData.show() == 1) {
var orderNum = orderNumText.text;
var shipDate = shipDateText.text;
var outputInitials = initialsText.text;
var overRuns = overRunsBox.value;
var digitalPrint = digitalPrintBox.value;
} else {
// If the user clicked "Cancel".
exit();
}
And the code continues on from there.
So, the okButton
starts off as being disabled, then it checks every time the user fills in a field or, in the case of the initialsText
field, while the user is typing something. Also, the extra condition && orderNumText.text != ""
that was added to the orderNumText
's .onChange()
function is only there to keep an annoying alert dialog from displaying if the user hits [ESC] or clicks the Cancel button before filling out that text box.
So, that sneaky little .enabled
property was the key that helped me solve this problem. Kind of an obvious answer, in retrospect. Regardless, I hope this is helpful to anyone else who was experiencing a problem similar to this one. Take care!