/*******************************************************************************
 * Copyright (c) 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.html.core.internal.contentmodel;



import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collection;
import java.util.Vector;

import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;

/**
 * Factory for element declarations.
 */
final class ElementCollection extends DeclCollection implements org.eclipse.wst.html.core.internal.provisional.HTML40Namespace.ElementName {


	// Element IDs
	private static class Ids {
		public static final int ID_A = 0;
		public static final int ID_ABBR = 1;
		public static final int ID_ACRONYM = 2;
		public static final int ID_ADDRESS = 3;
		public static final int ID_APPLET = 4;
		public static final int ID_AREA = 5;
		public static final int ID_B = 6;
		public static final int ID_BASE = 7;
		public static final int ID_BASEFONT = 8;
		public static final int ID_BDO = 9;
		public static final int ID_BIG = 10;
		public static final int ID_BLINK = 11;
		public static final int ID_BLOCKQUOTE = 12;
		public static final int ID_BODY = 13;
		public static final int ID_BR = 14;
		public static final int ID_BUTTON = 15;
		public static final int ID_CAPTION = 16;
		public static final int ID_CENTER = 17;
		public static final int ID_CITE = 18;
		public static final int ID_CODE = 19;
		public static final int ID_COL = 20;
		public static final int ID_COLGROUP = 21;
		public static final int ID_DD = 22;
		public static final int ID_DEL = 23;
		public static final int ID_DFN = 24;
		public static final int ID_DIR = 25;
		public static final int ID_DIV = 26;
		public static final int ID_DL = 27;
		public static final int ID_DT = 28;
		public static final int ID_EM = 29;
		public static final int ID_EMBED = 30;
		public static final int ID_FIELDSET = 31;
		public static final int ID_FONT = 32;
		public static final int ID_FORM = 33;
		public static final int ID_FRAME = 34;
		public static final int ID_FRAMESET = 35;
		public static final int ID_H1 = 36;
		public static final int ID_H2 = 37;
		public static final int ID_H3 = 38;
		public static final int ID_H4 = 39;
		public static final int ID_H5 = 40;
		public static final int ID_H6 = 41;
		public static final int ID_HEAD = 42;
		public static final int ID_HR = 43;
		public static final int ID_HTML = 44;
		public static final int ID_I = 45;
		public static final int ID_IFRAME = 46;
		public static final int ID_IMG = 47;
		public static final int ID_INPUT = 48;
		public static final int ID_INS = 49;
		public static final int ID_ISINDEX = 50;
		public static final int ID_KBD = 51;
		public static final int ID_LABEL = 52;
		public static final int ID_LEGEND = 53;
		public static final int ID_LI = 54;
		public static final int ID_LINK = 55;
		public static final int ID_MAP = 56;
		public static final int ID_MENU = 57;
		public static final int ID_META = 58;
		public static final int ID_NOEMBED = 59;
		public static final int ID_NOFRAMES = 60;
		public static final int ID_NOSCRIPT = 61;
		public static final int ID_OBJECT = 62;
		public static final int ID_OL = 63;
		public static final int ID_OPTGROUP = 64;
		public static final int ID_OPTION = 65;
		public static final int ID_P = 66;
		public static final int ID_PARAM = 67;
		public static final int ID_PRE = 68;
		public static final int ID_Q = 69;
		public static final int ID_S = 70;
		public static final int ID_SAMP = 71;
		public static final int ID_SCRIPT = 72;
		public static final int ID_SELECT = 73;
		public static final int ID_SMALL = 74;
		public static final int ID_SPAN = 75;
		public static final int ID_STRIKE = 76;
		public static final int ID_STRONG = 77;
		public static final int ID_STYLE = 78;
		public static final int ID_SUB = 79;
		public static final int ID_SUP = 80;
		public static final int ID_TABLE = 81;
		public static final int ID_TBODY = 82;
		public static final int ID_TD = 83;
		public static final int ID_TEXTAREA = 84;
		public static final int ID_TFOOT = 85;
		public static final int ID_TH = 86;
		public static final int ID_THEAD = 87;
		public static final int ID_TITLE = 88;
		public static final int ID_TR = 89;
		public static final int ID_TT = 90;
		public static final int ID_U = 91;
		public static final int ID_UL = 92;
		public static final int ID_VAR = 93;
		public static final int ID_MARQUEE = 94;
		public static final int ID_SSI_CONFIG = 95;
		public static final int ID_SSI_ECHO = 96;
		public static final int ID_SSI_EXEC = 97;
		public static final int ID_SSI_FSIZE = 98;
		public static final int ID_SSI_FLASTMOD = 99;
		public static final int ID_SSI_INCLUDE = 100;
		public static final int ID_SSI_PRINTENV = 101;
		public static final int ID_SSI_SET = 102;
		// <<D205513
		public static final int ID_BGSOUND = 103;
		public static final int ID_NOBR = 104;
		public static final int ID_WBR = 105;

		// D205513

		public static int getNumOfIds() {
			if (numofids != -1)
				return numofids;

			// NOTE: If the reflection is too slow, this method should
			// just return the literal value, like 105.
			// -- 5/25/2001
			Class clazz = Ids.class;
			Field[] fields = clazz.getFields();
			numofids = 0;
			for (int i = 0; i < fields.length; i++) {
				String name = fields[i].getName();
				if (name.startsWith("ID_"))//$NON-NLS-1$
					numofids++;
			}
			return numofids;
		}

		// chache the result of the reflection.
		private static int numofids = -1;
	}

	/** %fontstyle;. TT | I | B | U | S | STRIKE | BIG | SMALL | BLINK */
	private static final String[] FONTSTYLE = {TT, I, B, U, S, STRIKE, BIG, SMALL, BLINK};
	/** %formctl;. INPUT | SELECT | TEXTAREA | LABEL | BUTTON */
	private static final String[] FORMCTL = {INPUT, SELECT, TEXTAREA, LABEL, BUTTON};
	/** %phrase;.
	 * EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE | ABBR | ACRONYM
	 */
	private static final String[] PHRASE = {EM, STRONG, DFN, CODE, SAMP, KBD, VAR, CITE, ABBR, ACRONYM};
	/** %special;.
	 * A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT |
	 * MAP | Q | SUB | SUP | SPAN | BDO | IFRAME | EMBED | MARQUEE |
	 * D2W | SUBMIT
	 * WBR | NOBR | BGSOUND
	 */
	private static final String[] SPECIAL = {A, IMG, APPLET, OBJECT, FONT, BASEFONT, BR, WBR, // D205513
				SCRIPT, MAP, Q, SUB, SUP, SPAN, BDO, IFRAME, EMBED, BGSOUND, // D205513
				MARQUEE, NOBR // D205513
	};
	/** %heading;. H[1-6] */
	private static final String[] HEADING = {H1, H2, H3, H4, H5, H6};
	/** %list;. UL | OL | DIR | MENU */
	private static final String[] LIST = {UL, OL, DIR, MENU};
	/** %preformatted;. PRE */
	private static final String[] PREFORMATTED = {PRE};
	private AttributeCollection attributeCollection = null;
	private static String[] fNames = null;

	static {
		fNames = new String[Ids.getNumOfIds()];
		fNames[Ids.ID_A] = A;
		fNames[Ids.ID_ABBR] = ABBR;
		fNames[Ids.ID_ACRONYM] = ACRONYM;
		fNames[Ids.ID_ADDRESS] = ADDRESS;
		fNames[Ids.ID_APPLET] = APPLET;
		fNames[Ids.ID_AREA] = AREA;
		fNames[Ids.ID_B] = B;
		fNames[Ids.ID_BASE] = BASE;
		fNames[Ids.ID_BASEFONT] = BASEFONT;
		fNames[Ids.ID_BDO] = BDO;
		fNames[Ids.ID_BIG] = BIG;
		fNames[Ids.ID_BLINK] = BLINK;
		fNames[Ids.ID_BLOCKQUOTE] = BLOCKQUOTE;
		fNames[Ids.ID_BODY] = BODY;
		fNames[Ids.ID_BR] = BR;
		fNames[Ids.ID_BUTTON] = BUTTON;
		fNames[Ids.ID_CAPTION] = CAPTION;
		fNames[Ids.ID_CENTER] = CENTER;
		fNames[Ids.ID_CITE] = CITE;
		fNames[Ids.ID_CODE] = CODE;
		fNames[Ids.ID_COL] = COL;
		fNames[Ids.ID_COLGROUP] = COLGROUP;
		fNames[Ids.ID_DD] = DD;
		fNames[Ids.ID_DEL] = DEL;
		fNames[Ids.ID_DFN] = DFN;
		fNames[Ids.ID_DIR] = DIR;
		fNames[Ids.ID_DIV] = DIV;
		fNames[Ids.ID_DL] = DL;
		fNames[Ids.ID_DT] = DT;
		fNames[Ids.ID_EM] = EM;
		fNames[Ids.ID_EMBED] = EMBED;
		fNames[Ids.ID_FIELDSET] = FIELDSET;
		fNames[Ids.ID_FONT] = FONT;
		fNames[Ids.ID_FORM] = FORM;
		fNames[Ids.ID_FRAME] = FRAME;
		fNames[Ids.ID_FRAMESET] = FRAMESET;
		fNames[Ids.ID_H1] = H1;
		fNames[Ids.ID_H2] = H2;
		fNames[Ids.ID_H3] = H3;
		fNames[Ids.ID_H4] = H4;
		fNames[Ids.ID_H5] = H5;
		fNames[Ids.ID_H6] = H6;
		fNames[Ids.ID_HEAD] = HEAD;
		fNames[Ids.ID_HR] = HR;
		fNames[Ids.ID_HTML] = HTML;
		fNames[Ids.ID_I] = I;
		fNames[Ids.ID_IFRAME] = IFRAME;
		fNames[Ids.ID_IMG] = IMG;
		fNames[Ids.ID_INPUT] = INPUT;
		fNames[Ids.ID_INS] = INS;
		fNames[Ids.ID_ISINDEX] = ISINDEX;
		fNames[Ids.ID_KBD] = KBD;
		fNames[Ids.ID_LABEL] = LABEL;
		fNames[Ids.ID_LEGEND] = LEGEND;
		fNames[Ids.ID_LI] = LI;
		fNames[Ids.ID_LINK] = LINK;
		fNames[Ids.ID_MAP] = MAP;
		fNames[Ids.ID_MENU] = MENU;
		fNames[Ids.ID_META] = META;
		fNames[Ids.ID_NOEMBED] = NOEMBED;
		fNames[Ids.ID_NOFRAMES] = NOFRAMES;
		fNames[Ids.ID_NOSCRIPT] = NOSCRIPT;
		fNames[Ids.ID_OBJECT] = OBJECT;
		fNames[Ids.ID_OL] = OL;
		fNames[Ids.ID_OPTGROUP] = OPTGROUP;
		fNames[Ids.ID_OPTION] = OPTION;
		fNames[Ids.ID_P] = P;
		fNames[Ids.ID_PARAM] = PARAM;
		fNames[Ids.ID_PRE] = PRE;
		fNames[Ids.ID_Q] = Q;
		fNames[Ids.ID_S] = S;
		fNames[Ids.ID_SAMP] = SAMP;
		fNames[Ids.ID_SCRIPT] = SCRIPT;
		fNames[Ids.ID_SELECT] = SELECT;
		fNames[Ids.ID_SMALL] = SMALL;
		fNames[Ids.ID_SPAN] = SPAN;
		fNames[Ids.ID_STRIKE] = STRIKE;
		fNames[Ids.ID_STRONG] = STRONG;
		fNames[Ids.ID_STYLE] = STYLE;
		fNames[Ids.ID_SUB] = SUB;
		fNames[Ids.ID_SUP] = SUP;
		fNames[Ids.ID_TABLE] = TABLE;
		fNames[Ids.ID_TBODY] = TBODY;
		fNames[Ids.ID_TD] = TD;
		fNames[Ids.ID_TEXTAREA] = TEXTAREA;
		fNames[Ids.ID_TFOOT] = TFOOT;
		fNames[Ids.ID_TH] = TH;
		fNames[Ids.ID_THEAD] = THEAD;
		fNames[Ids.ID_TITLE] = TITLE;
		fNames[Ids.ID_TR] = TR;
		fNames[Ids.ID_TT] = TT;
		fNames[Ids.ID_U] = U;
		fNames[Ids.ID_UL] = UL;
		fNames[Ids.ID_VAR] = VAR;
		fNames[Ids.ID_MARQUEE] = MARQUEE;
		fNames[Ids.ID_SSI_CONFIG] = SSI_CONFIG;
		fNames[Ids.ID_SSI_ECHO] = SSI_ECHO;
		fNames[Ids.ID_SSI_EXEC] = SSI_EXEC;
		fNames[Ids.ID_SSI_FSIZE] = SSI_FSIZE;
		fNames[Ids.ID_SSI_FLASTMOD] = SSI_FLASTMOD;
		fNames[Ids.ID_SSI_INCLUDE] = SSI_INCLUDE;
		fNames[Ids.ID_SSI_PRINTENV] = SSI_PRINTENV;
		fNames[Ids.ID_SSI_SET] = SSI_SET;
		fNames[Ids.ID_BGSOUND] = BGSOUND;
		fNames[Ids.ID_NOBR] = NOBR;
		fNames[Ids.ID_WBR] = WBR;
	}

	/**
	 */
	public ElementCollection(AttributeCollection collection) {
		super(fNames, TOLERANT_CASE);
		attributeCollection = collection;
	}

	/**
	 * Actually creates HTMLElementDeclaration instance.
	 * @return HTMLElementDeclaration
	 */
	protected CMNode create(String elementName) {
		HTMLElemDeclImpl edec = null;

		if (elementName.equalsIgnoreCase(A)) {
			edec = new HedA(this);
		}
		else if (elementName.equalsIgnoreCase(ABBR)) {
			edec = new HedPhrase(ABBR, this);

		}
		else if (elementName.equalsIgnoreCase(ACRONYM)) {
			edec = new HedPhrase(ACRONYM, this);

		}
		else if (elementName.equalsIgnoreCase(ADDRESS)) {
			edec = new HedADDRESS(this);

		}
		else if (elementName.equalsIgnoreCase(APPLET)) {
			edec = new HedAPPLET(this);

		}
		else if (elementName.equalsIgnoreCase(AREA)) {
			edec = new HedAREA(this);

		}
		else if (elementName.equalsIgnoreCase(B)) {
			edec = new HedFontStyle(B, this);

		}
		else if (elementName.equalsIgnoreCase(BASE)) {
			edec = new HedBASE(this);

		}
		else if (elementName.equalsIgnoreCase(BASEFONT)) {
			edec = new HedBASEFONT(this);

		}
		else if (elementName.equalsIgnoreCase(BDO)) {
			edec = new HedBDO(this);

		}
		else if (elementName.equalsIgnoreCase(BIG)) {
			edec = new HedFontStyle(BIG, this);

		}
		else if (elementName.equalsIgnoreCase(BLINK)) {
			edec = new HedFontStyle(BLINK, this);

		}
		else if (elementName.equalsIgnoreCase(BLOCKQUOTE)) {
			edec = new HedBLOCKQUOTE(this);

		}
		else if (elementName.equalsIgnoreCase(BODY)) {
			edec = new HedBODY(this);

		}
		else if (elementName.equalsIgnoreCase(BR)) {
			edec = new HedBR(this);

		}
		else if (elementName.equalsIgnoreCase(BUTTON)) {
			edec = new HedBUTTON(this);

		}
		else if (elementName.equalsIgnoreCase(CAPTION)) {
			edec = new HedCAPTION(this);

		}
		else if (elementName.equalsIgnoreCase(CENTER)) {
			edec = new HedCENTER(this);

		}
		else if (elementName.equalsIgnoreCase(CITE)) {
			edec = new HedPhrase(CITE, this);

		}
		else if (elementName.equalsIgnoreCase(CODE)) {
			edec = new HedPhrase(CODE, this);

		}
		else if (elementName.equalsIgnoreCase(COL)) {
			edec = new HedCOL(this);

		}
		else if (elementName.equalsIgnoreCase(COLGROUP)) {
			edec = new HedCOLGROUP(this);

		}
		else if (elementName.equalsIgnoreCase(DD)) {
			edec = new HedDD(this);

		}
		else if (elementName.equalsIgnoreCase(DEL)) {
			edec = new HedMarkChanges(DEL, this);

		}
		else if (elementName.equalsIgnoreCase(DFN)) {
			edec = new HedPhrase(DFN, this);

		}
		else if (elementName.equalsIgnoreCase(DIR)) {
			edec = new HedMENU(DIR, this);

		}
		else if (elementName.equalsIgnoreCase(DIV)) {
			edec = new HedDIV(this);

		}
		else if (elementName.equalsIgnoreCase(DL)) {
			edec = new HedDL(this);

		}
		else if (elementName.equalsIgnoreCase(DT)) {
			edec = new HedDT(this);

		}
		else if (elementName.equalsIgnoreCase(EM)) {
			edec = new HedPhrase(EM, this);

		}
		else if (elementName.equalsIgnoreCase(EMBED)) {
			edec = new HedEMBED(this);

		}
		else if (elementName.equalsIgnoreCase(FIELDSET)) {
			edec = new HedFIELDSET(this);

		}
		else if (elementName.equalsIgnoreCase(FONT)) {
			edec = new HedFONT(this);

		}
		else if (elementName.equalsIgnoreCase(FORM)) {
			edec = new HedFORM(this);

		}
		else if (elementName.equalsIgnoreCase(FRAME)) {
			edec = new HedFRAME(this);

		}
		else if (elementName.equalsIgnoreCase(FRAMESET)) {
			edec = new HedFRAMESET(this);

		}
		else if (elementName.equalsIgnoreCase(H1)) {
			edec = new HedHeading(H1, this);

		}
		else if (elementName.equalsIgnoreCase(H2)) {
			edec = new HedHeading(H2, this);

		}
		else if (elementName.equalsIgnoreCase(H3)) {
			edec = new HedHeading(H3, this);

		}
		else if (elementName.equalsIgnoreCase(H4)) {
			edec = new HedHeading(H4, this);

		}
		else if (elementName.equalsIgnoreCase(H5)) {
			edec = new HedHeading(H5, this);

		}
		else if (elementName.equalsIgnoreCase(H6)) {
			edec = new HedHeading(H6, this);

		}
		else if (elementName.equalsIgnoreCase(HEAD)) {
			edec = new HedHEAD(this);

		}
		else if (elementName.equalsIgnoreCase(HR)) {
			edec = new HedHR(this);

		}
		else if (elementName.equalsIgnoreCase(HTML)) {
			edec = new HedHTML(this);

		}
		else if (elementName.equalsIgnoreCase(I)) {
			edec = new HedFontStyle(I, this);

		}
		else if (elementName.equalsIgnoreCase(IFRAME)) {
			edec = new HedIFRAME(this);

		}
		else if (elementName.equalsIgnoreCase(IMG)) {
			edec = new HedIMG(this);

		}
		else if (elementName.equalsIgnoreCase(INPUT)) {
			edec = new HedINPUT(this);

		}
		else if (elementName.equalsIgnoreCase(INS)) {
			edec = new HedMarkChanges(INS, this);

		}
		else if (elementName.equalsIgnoreCase(ISINDEX)) {
			edec = new HedISINDEX(this);

		}
		else if (elementName.equalsIgnoreCase(KBD)) {
			edec = new HedPhrase(KBD, this);

		}
		else if (elementName.equalsIgnoreCase(LABEL)) {
			edec = new HedLABEL(this);

		}
		else if (elementName.equalsIgnoreCase(LEGEND)) {
			edec = new HedLEGEND(this);

		}
		else if (elementName.equalsIgnoreCase(LI)) {
			edec = new HedLI(this);

		}
		else if (elementName.equalsIgnoreCase(LINK)) {
			edec = new HedLINK(this);

		}
		else if (elementName.equalsIgnoreCase(MAP)) {
			edec = new HedMAP(this);

		}
		else if (elementName.equalsIgnoreCase(MARQUEE)) {
			edec = new HedMARQUEE(this);

		}
		else if (elementName.equalsIgnoreCase(MENU)) {
			edec = new HedMENU(MENU, this);

		}
		else if (elementName.equalsIgnoreCase(META)) {
			edec = new HedMETA(this);

		}
		else if (elementName.equalsIgnoreCase(NOEMBED)) {
			edec = new HedNOEMBED(this);

		}
		else if (elementName.equalsIgnoreCase(NOFRAMES)) {
			edec = new HedNOFRAMES(this);

		}
		else if (elementName.equalsIgnoreCase(NOSCRIPT)) {
			edec = new HedNOSCRIPT(this);

		}
		else if (elementName.equalsIgnoreCase(OBJECT)) {
			edec = new HedOBJECT(this);

		}
		else if (elementName.equalsIgnoreCase(OL)) {
			edec = new HedOL(this);

		}
		else if (elementName.equalsIgnoreCase(OPTGROUP)) {
			edec = new HedOPTGROUP(this);

		}
		else if (elementName.equalsIgnoreCase(OPTION)) {
			edec = new HedOPTION(this);

		}
		else if (elementName.equalsIgnoreCase(P)) {
			edec = new HedP(this);

		}
		else if (elementName.equalsIgnoreCase(PARAM)) {
			edec = new HedPARAM(this);

		}
		else if (elementName.equalsIgnoreCase(PRE)) {
			edec = new HedPRE(this);

		}
		else if (elementName.equalsIgnoreCase(Q)) {
			edec = new HedQ(this);

		}
		else if (elementName.equalsIgnoreCase(S)) {
			edec = new HedFontStyle(S, this);

		}
		else if (elementName.equalsIgnoreCase(SAMP)) {
			edec = new HedPhrase(SAMP, this);

		}
		else if (elementName.equalsIgnoreCase(SCRIPT)) {
			edec = new HedSCRIPT(this);

		}
		else if (elementName.equalsIgnoreCase(SELECT)) {
			edec = new HedSELECT(this);

		}
		else if (elementName.equalsIgnoreCase(SMALL)) {
			edec = new HedFontStyle(SMALL, this);

		}
		else if (elementName.equalsIgnoreCase(SPAN)) {
			edec = new HedSPAN(this);

		}
		else if (elementName.equalsIgnoreCase(STRIKE)) {
			edec = new HedFontStyle(STRIKE, this);

		}
		else if (elementName.equalsIgnoreCase(STRONG)) {
			edec = new HedPhrase(STRONG, this);

		}
		else if (elementName.equalsIgnoreCase(STYLE)) {
			edec = new HedSTYLE(this);

		}
		else if (elementName.equalsIgnoreCase(SUB)) {
			edec = new HedScripts(SUB, this);

		}
		else if (elementName.equalsIgnoreCase(SUP)) {
			edec = new HedScripts(SUP, this);

		}
		else if (elementName.equalsIgnoreCase(TABLE)) {
			edec = new HedTABLE(this);

		}
		else if (elementName.equalsIgnoreCase(TBODY)) {
			edec = new HedTableBody(TBODY, this);

		}
		else if (elementName.equalsIgnoreCase(TD)) {
			edec = new HedTableCell(TD, this);

		}
		else if (elementName.equalsIgnoreCase(TEXTAREA)) {
			edec = new HedTEXTAREA(this);

		}
		else if (elementName.equalsIgnoreCase(TFOOT)) {
			edec = new HedTableBody(TFOOT, this);

		}
		else if (elementName.equalsIgnoreCase(TH)) {
			edec = new HedTableCell(TH, this);

		}
		else if (elementName.equalsIgnoreCase(THEAD)) {
			edec = new HedTableBody(THEAD, this);

		}
		else if (elementName.equalsIgnoreCase(TITLE)) {
			edec = new HedTITLE(this);

		}
		else if (elementName.equalsIgnoreCase(TR)) {
			edec = new HedTR(this);

		}
		else if (elementName.equalsIgnoreCase(TT)) {
			edec = new HedFontStyle(TT, this);

		}
		else if (elementName.equalsIgnoreCase(U)) {
			edec = new HedFontStyle(U, this);

		}
		else if (elementName.equalsIgnoreCase(UL)) {
			edec = new HedUL(this);

		}
		else if (elementName.equalsIgnoreCase(VAR)) {
			edec = new HedPhrase(VAR, this);

		}
		else if (elementName.equalsIgnoreCase(SSI_CONFIG)) {
			edec = new HedSSIConfig(this);

		}
		else if (elementName.equalsIgnoreCase(SSI_ECHO)) {
			edec = new HedSSIEcho(this);

		}
		else if (elementName.equalsIgnoreCase(SSI_EXEC)) {
			edec = new HedSSIExec(this);

		}
		else if (elementName.equalsIgnoreCase(SSI_FSIZE)) {
			edec = new HedSSIFsize(this);

		}
		else if (elementName.equalsIgnoreCase(SSI_FLASTMOD)) {
			edec = new HedSSIFlastmod(this);

		}
		else if (elementName.equalsIgnoreCase(SSI_INCLUDE)) {
			edec = new HedSSIInclude(this);

		}
		else if (elementName.equalsIgnoreCase(SSI_PRINTENV)) {
			edec = new HedSSIPrintenv(this);

		}
		else if (elementName.equalsIgnoreCase(SSI_SET)) {
			edec = new HedSSISet(this);

		}
		else if (elementName.equalsIgnoreCase(BGSOUND)) {
			edec = new HedBGSOUND(this);

		}
		else if (elementName.equalsIgnoreCase(NOBR)) {
			edec = new HedNOBR(this);

		}
		else if (elementName.equalsIgnoreCase(WBR)) {
			edec = new HedWBR(this);

		} // unknown
		else {
			// NOTE: We don't define the UNKNOWN element declaration.
			// <code>null</code> for a declaration is a sign of
			// the target element is unknown.
			// -- 3/9/2001
			edec = null;
		}
		return edec;
	}

	public AttributeCollection getAttributeCollection() {
		return attributeCollection;
	}

	public final Collection getNamesOfBlock() {
		// P, DL, DIV, CENTER, NOSCRIPT, NOFRAMES, BLOCKQUOTE, FORM, ISINDEX, HR,
		// TABLE, FIELDSET, ADDRESS
		String[] blockMisc = {P, DL, DIV, CENTER, NOSCRIPT, NOFRAMES, BLOCKQUOTE, FORM, ISINDEX, HR, TABLE, FIELDSET, ADDRESS};
		Vector names = new Vector(Arrays.asList(blockMisc));
		// %heading;
		names.addAll(Arrays.asList(HEADING));
		// %list;
		names.addAll(Arrays.asList(LIST));
		// %preformatted;
		names.addAll(Arrays.asList(PREFORMATTED));

		return names;
	}

	/**
	 * %block;.
	 * %block; is:
	 * P | %heading; | %list; | %preformatted; | DL | DIV | CENTER |
	 * NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR |
	 * TABLE | FIELDSET | ADDRESS.<br>
	 * @param group CMGroupImpl Return values.
	 */
	public final void getBlock(CMGroupImpl group) {
		if (group == null)
			return;
		getDeclarations(group, getNamesOfBlock().iterator());
	}

	/**
	 * Create element declarations and store them
	 * into a <code>CMGroupImpl</code> instance.
	 * @param group CMGroupImpl Return values.
	 */
	public final void getFlow(CMGroupImpl group) {
		if (group == null)
			return;
		getBlock(group);
		getInline(group);
	}

	/**
	 * Create element declarations and store them into a <code>CMGroupImpl</code>
	 * instance.<br>
	 * @param group CMGroupImpl Return values.
	 */
	public final void getFontstyle(CMGroupImpl group) {
		if (group == null)
			return;
		getDeclarations(group, Arrays.asList(FONTSTYLE).iterator());
	}

	/**
	 * Create element declarations and store them into a <code>CMGroupImpl</code>
	 * instance.<br>
	 * @param group CMGroupImpl Return values.
	 */
	public final void getFormctrl(CMGroupImpl group) {
		if (group == null)
			return;
		getDeclarations(group, Arrays.asList(FORMCTL).iterator());
	}

	/**
	 * %heading;.
	 * @param group CMGroupImpl Return values.
	 */
	public final void getHeading(CMGroupImpl group) {
		if (group == null)
			return;

		getDeclarations(group, Arrays.asList(HEADING).iterator());
	}

	/**
	 * Create element declarations and store them
	 * into a <code>CMGroupImpl</code> instance.
	 * @param group CMGroupImpl Return values.
	 */
	public final void getInline(CMGroupImpl group) {
		if (group == null)
			return;
		getFontstyle(group);
		getPhrase(group);
		getSpecial(group);
		getFormctrl(group);
	}

	/**
	 * %list;.
	 * @param group CMGroupImpl Return values.
	 */
	public final void getList(CMGroupImpl group) {
		if (group == null)
			return;

		getDeclarations(group, Arrays.asList(LIST).iterator());
	}

	/**
	 * Create element declarations and store them into a <code>CMGroupImpl</code>
	 * instance.<br>
	 * @param group CMGroupImpl Return values.
	 */
	public final void getPhrase(CMGroupImpl group) {
		if (group == null)
			return;
		getDeclarations(group, Arrays.asList(PHRASE).iterator());
	}

	/**
	 * %preformatted;
	 * @param group CMGroupImpl Return values.
	 */
	public final void getPreformatted(CMGroupImpl group) {
		if (group == null)
			return;

		getDeclarations(group, Arrays.asList(PREFORMATTED).iterator());
	}

	/**
	 * Create element declarations and store them into a <code>CMGroupImpl</code>
	 * instance.<br>
	 * @param group CMGroupImpl Return values.
	 */
	public final void getSpecial(CMGroupImpl group) {
		if (group == null)
			return;
		getDeclarations(group, Arrays.asList(SPECIAL).iterator());
	}
}