void mo() throws ScriptException {
		int modelIndex = viewer.getDisplayModelIndex();
		if (modelIndex < 0)
			evalError(GT._("MO isosurfaces require that only one model be displayed"));
		viewer.loadShape(JmolConstants.SHAPE_MO);
		viewer.setShapeProperty(JmolConstants.SHAPE_MO, "init", new Integer(modelIndex));
		Integer index = null;
		String title = null;
		try {
			index = (Integer) viewer.getShapeProperty(JmolConstants.SHAPE_MO, "moNumber");
		}
		catch (Exception e) {
			// could just be the string "no current mesh"
		}
		int moNumber = (index == null ? Integer.MAX_VALUE : index.intValue());
		if (moNumber == Integer.MAX_VALUE)
			lastMoNumber = 0;
		String str;
		if (statementLength == 1)
			endOfStatementUnexpected();
		Token token = statement[1];
		int tok = token.tok;
		String propertyName = null;
		Object propertyValue = null;
		switch (tok) {
		case Token.integer:
			moNumber = intParameter(1);
			break;
		case Token.next:
			moNumber = lastMoNumber + 1;
			break;
		case Token.prev:
			moNumber = lastMoNumber - 1;
			break;
		case Token.color:
			// mo color color1 color2
			if (2 < statementLength && statement[2].tok == Token.colorRGB) {
				viewer.setShapeProperty(JmolConstants.SHAPE_MO, "colorRGB", new Integer(getArgbParam(2)));
				if (3 < statementLength && statement[3].tok == Token.colorRGB)
					viewer.setShapeProperty(JmolConstants.SHAPE_MO, "colorRGB", new Integer(getArgbParam(3)));
				break;
			}
			invalidArgument();
		case Token.identifier:
			str = (String) token.value;
			if (str.equalsIgnoreCase("CUTOFF")) {
				if (2 < statementLength && statement[2].tok == Token.plus) {
					propertyName = "cutoffPositive";
					propertyValue = new Float(floatParameter(3));
				}
				else {
					propertyName = "cutoff";
					propertyValue = new Float(floatParameter(2));
				}
				break;
			}
			if (str.equalsIgnoreCase("RESOLUTION")) {
				propertyName = "resolution";
				propertyValue = new Float(floatParameter(2));
				break;
			}
			if (str.equalsIgnoreCase("SCALE")) {
				propertyName = "scale";
				propertyValue = new Float(floatParameter(2));
				break;
			}
			if (str.equalsIgnoreCase("TITLEFORMAT")) {
				if (2 < statementLength && statement[2].tok == Token.string) {
					propertyName = "titleFormat";
					propertyValue = stringParameter(2);
				}
				break;
			}
			if (str.equalsIgnoreCase("DEBUG")) {
				propertyName = "debug";
				break;
			}
			if (str.equalsIgnoreCase("plane")) {
				// plane {X, Y, Z, W}
				propertyName = "plane";
				propertyValue = planeParameter(2);
				break;
			}
			if (str.equalsIgnoreCase("noplane")) {
				propertyName = "plane";
				break;
			}
			invalidArgument(1, str);
		default:
			if (!setMeshDisplayProperty(JmolConstants.SHAPE_MO, tok))
				invalidArgument(1, statement[1] + " not recognized");
			// if (tok == Token.delete || tok == Token.off)
			return;
		}
		if (propertyName != null)
			viewer.setShapeProperty(JmolConstants.SHAPE_MO, propertyName, propertyValue);
		if (moNumber != Integer.MAX_VALUE) {
			if (2 < statementLength && statement[2].tok == Token.string)
				title = stringParameter(2);
			setMoData(JmolConstants.SHAPE_MO, moNumber, title);
		}
	}