public synchronized void startElement(String uri, String localName, String qName, Attributes attrib)
				throws SAXException {

			buffer.setLength(0);

			readingText = qName == "text";

			// qName = qName.intern();

			if (qName == "bgsound") {
				if (attrib != null) {
					for (int i = 0, n = attrib.getLength(); i < n; i++) {
						attribName = attrib.getQName(i).intern();
						attribValue = attrib.getValue(i);
						if (attribName == "loop") {
							page.setLoopBackgroundSound(Boolean.valueOf(attribValue).booleanValue());
						}
					}
				}
			}

			else if (qName == "content") {
				if (attrib != null) {
					for (int i = 0, n = attrib.getLength(); i < n; i++) {
						attribName = attrib.getQName(i).intern();
						attribValue = attrib.getValue(i);
						if (attribName == "start") {
							Integer ig = Parser.parseInt(attribValue);
							if (ig != null)
								startOffset = ig.intValue();
						}
						else if (attribName == "end") {
							Integer ig = Parser.parseInt(attribValue);
							if (ig != null)
								endOffset = ig.intValue();
						}
					}
				}
				currentStyle = styleContext.addStyle(null, null);
				StyleConstants.setFontSize(currentStyle, Page.getDefaultFontSize());
				StyleConstants.setFontFamily(currentStyle, Page.getDefaultFontFamily());
			}

			else if (qName == "elementarray") {
				tableValue = new String[nrow][ncol];
			}

			else if (qName.startsWith("time_series_y")) {
				if (attrib != null) {
					int symbol = -1;
					float widthOfLine = -1.0f;
					int styleOfLine = -1;
					int sizeOfSymbol = -1;
					int spacingOfSymbol = -1;
					byte sf = 0;
					float mlp = 1.0f;
					float add = 0.0f;
					for (int i = 0, n = attrib.getLength(); i < n; i++) {
						attribName = attrib.getQName(i).intern();
						attribValue = attrib.getValue(i);
						if (attribName == "color") {
							Integer ig = Parser.parseInt(attribValue, 16);
							if (ig != null)
								argb1 = ig.intValue();
						}
						else if (attribName == "symbol") {
							Integer ig = Parser.parseInt(attribValue);
							if (ig != null)
								symbol = ig.intValue();
						}
						else if (attribName == "style") {
							Integer ig = Parser.parseInt(attribValue);
							if (ig != null)
								styleOfLine = ig.intValue();
						}
						else if (attribName == "width") {
							Float fl = Parser.parseFloat(attribValue);
							if (fl != null)
								widthOfLine = fl.floatValue();
						}
						else if (attribName == "size") {
							Integer ig = Parser.parseInt(attribValue);
							if (ig != null)
								sizeOfSymbol = ig.intValue();
						}
						else if (attribName == "spacing") {
							Integer ig = Parser.parseInt(attribValue);
							if (ig != null)
								spacingOfSymbol = ig.intValue();
						}
						else if (attribName == "multiplier") {
							Float fl = Parser.parseFloat(attribValue);
							if (fl != null)
								mlp = fl.floatValue();
						}
						else if (attribName == "addend") {
							Float fl = Parser.parseFloat(attribValue);
							if (fl != null)
								add = fl.floatValue();
						}
						else if (attribName == "smoother") {
							Byte bt = Parser.parseByte(attribValue);
							if (bt != null)
								sf = bt.byteValue();
						}
					}
					if (lineColor == null)
						lineColor = new Color[PageXYGraph.MAX];
					if (sf != 0) {
						if (smoothers == null) {
							smoothers = new byte[PageXYGraph.MAX];
							Arrays.fill(smoothers, Curve.INSTANTANEOUS_VALUE);
						}
					}
					if (mlp != 1.0f) {
						if (multiplier_y == null) {
							multiplier_y = new float[PageXYGraph.MAX];
							Arrays.fill(multiplier_y, 1.0f);
						}
					}
					if (add != 0.0f) {
						if (addend_y == null) {
							addend_y = new float[PageXYGraph.MAX];
							Arrays.fill(addend_y, 0.0f);
						}
					}
					if (symbol != -1) {
						if (lineSymbol == null) {
							lineSymbol = new int[PageXYGraph.MAX];
							Arrays.fill(lineSymbol, LineSymbols.SYMBOL_NUMBER_1);
						}
					}
					if (styleOfLine != -1) {
						if (lineStyle == null)
							lineStyle = new int[PageXYGraph.MAX];
					}
					if (widthOfLine > -1.0f) {
						if (lineWidth == null) {
							lineWidth = new float[PageXYGraph.MAX];
							Arrays.fill(lineWidth, 1.0f);
						}
					}
					if (sizeOfSymbol != -1) {
						if (symbolSize == null) {
							symbolSize = new int[PageXYGraph.MAX];
							Arrays.fill(symbolSize, 4);
						}
					}
					if (spacingOfSymbol != -1) {
						if (symbolSpacing == null) {
							symbolSpacing = new int[PageXYGraph.MAX];
							Arrays.fill(symbolSpacing, 5);
						}
					}
					String afterY = qName.substring(qName.lastIndexOf("y") + 1);
					Integer ig = Parser.parseInt(afterY);
					if (ig != null) {
						int its = ig.intValue() - 1;
						if ((argb1 | ARGB_NOT_SET) != ARGB_NOT_SET) {
							lineColor[its] = new Color(argb1);
							argb1 = ARGB_NOT_SET;
						}
						if (symbol != -1)
							lineSymbol[its] = symbol;
						if (styleOfLine != -1)
							lineStyle[its] = styleOfLine;
						if (widthOfLine > -1.0f)
							lineWidth[its] = widthOfLine;
						if (sizeOfSymbol != -1)
							symbolSize[its] = sizeOfSymbol;
						if (spacingOfSymbol != -1)
							symbolSpacing[its] = spacingOfSymbol;
						if (mlp != 1.0f)
							multiplier_y[its] = mlp;
						if (add != 0.0f)
							addend_y[its] = add;
						if (sf != 0)
							smoothers[its] = sf;
					}
				}
			}

		}