/*******************************************************************************
 * 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.css.core.internal.document;



import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
import org.w3c.dom.DOMException;
import org.w3c.dom.stylesheets.MediaList;


/**
 * 
 */
class MediaListImpl extends CSSRegionContainer implements MediaList {

	int mediumCounter;

	/**
	 * MediaListImpl constructor comment.
	 */
	MediaListImpl() {
		super();
	}

	/**
	 * MediaListImpl constructor comment.
	 */
	MediaListImpl(MediaListImpl that) {
		super(that);
	}

	/**
	 * Adds the medium <code>newMedium</code> to the end of the list. If the
	 * <code>newMedium</code> is already used, it is first removed.
	 * 
	 * @param newMediumThe
	 *            new medium to add.
	 * @exception DOMException
	 *                INVALID_CHARACTER_ERR: If the medium contains characters
	 *                that are invalid in the underlying style language. <br>
	 *                NO_MODIFICATION_ALLOWED_ERR: Raised if this list is
	 *                readonly.
	 */
	public void appendMedium(String newMedium) throws DOMException {
		if (newMedium == null)
			return;

		CSSNodeListImpl m = getMedia();
		for (int i = 0; i != m.getLength(); i++) {
			if (newMedium.equals(item(i)))
				return;
		}

		setAttribute("medium" + Integer.toString(mediumCounter++), newMedium);//$NON-NLS-1$
	}

	public ICSSNode cloneNode(boolean deep) {
		MediaListImpl cloned = new MediaListImpl(this);
		return cloned;
	}

	/**
	 * Deletes the medium indicated by <code>oldMedium</code> from the list.
	 * 
	 * @param oldMediumThe
	 *            medium to delete in the media list.
	 * @exception DOMException
	 *                NO_MODIFICATION_ALLOWED_ERR: Raised if this list is
	 *                readonly. <br>
	 *                NOT_FOUND_ERR: Raised if <code>oldMedium</code> is not
	 *                in the list.
	 */
	public void deleteMedium(String oldMedium) throws DOMException {
		for (int i = 0; i != getLength(); i++) {
			if (oldMedium.equals(item(i))) {
				removeAttributeNode((CSSAttrImpl) fAttrs.item(i));
			}
		}
	}

	/**
	 * The number of media in the list. The range of valid media is
	 * <code>0</code> to <code>length-1</code> inclusive.
	 */
	public int getLength() {
		return getMedia().getLength();
	}

	/**
	 * @return CSSNodeListImpl
	 */
	CSSNodeListImpl getMedia() {
		if (fAttrs == null)
			fAttrs = new CSSNamedNodeMapImpl();
		return fAttrs;
	}

	/**
	 * The parsable textual representation of the media list. This is a
	 * comma-separated list of media.
	 * 
	 * @exception DOMException
	 *                SYNTAX_ERR: Raised if the specified string value has a
	 *                syntax error and is unparsable. <br>
	 *                NO_MODIFICATION_ALLOWED_ERR: Raised if this media list
	 *                is readonly.
	 */
	public String getMediaText() {
		return getCssText();
	}

	/**
	 * Insert the method's description here. Creation date: (2001/01/17
	 * 18:50:29)
	 * 
	 * @return short
	 */
	public short getNodeType() {
		return MEDIALIST_NODE;
	}

	/**
	 * Returns the <code>index</code> th in the list. If <code>index</code>
	 * is greater than or equal to the number of media in the list, this
	 * returns <code>null</code>.
	 * 
	 * @param index
	 *            Index into the collection.
	 * @return The medium at the <code>index</code> th position in the
	 *         <code>MediaList</code>, or <code>null</code> if that is
	 *         not a valid index.
	 */
	public String item(int index) {
		if (index < 0 || getLength() <= index)
			return null;

		return ((CSSAttrImpl) getMedia().item(index)).getValue();
	}

	/**
	 * setMediaText method comment.
	 */
	public void setMediaText(String mediaText) throws DOMException {
		setCssText(mediaText);
	}
}