/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.commands.single;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
import org.eclipse.jst.pagedesigner.utils.JSPUtil;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.w3c.dom.Attr;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * This is for command that changes an element's tagname and some attributes.
 * 
 * @author mengbo
 */
public class ChangeTagCommand extends SingleNodeCommand {
    private final IDOMElement _element;

    private final Map _attributes;

    private final boolean _moveContent;

    private String _uri;

    private String _localTag;

    private  String _totalTag;

	/**
	 * @param label
	 * @param node
	 * @param totaltag
	 * @param attributes
	 * @param movecontent
	 */
	public ChangeTagCommand(String label, IDOMElement node, String totaltag,
			Map attributes, boolean movecontent) {
		super(label, node);
		this._element = node;
		this._totalTag = totaltag;
		this._attributes = attributes;
		this._moveContent = movecontent;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
	 */
	protected void doExecute() {
		String tag = null;

		if (_totalTag != null) {
			tag = _totalTag;
		} else {
			if (ITLDConstants.URI_HTML.equals(_uri)) {
				tag = _localTag;
			} else if (ITLDConstants.URI_JSP.equals(_uri)) {
				tag = "jsp:" + _localTag;
			} else {
				tag = JSPUtil.getOrCreatePrefix(getModel(), _uri, null)
						+ _localTag;
			}
		}
		// we need to remove the old element and create a new one with the new
		// tag.
		IDOMElement replacement = (IDOMElement) _element.getOwnerDocument()
				.createElement(tag);
		NamedNodeMap attrs = _element.getAttributes();
		for (int i = 0, n = attrs.getLength(); i < n; i++) {
			Attr a = (Attr) attrs.item(i);
			replacement.setAttribute(a.getName(), a.getValue());
		}
		if (_attributes != null) {
			for (Iterator iter = _attributes.keySet().iterator(); iter
					.hasNext();) {
				String name = (String) iter.next();
				String value = (String) _attributes.get(name);
				replacement.setAttribute(name, value);
			}
		}
		if (_moveContent) {
			NodeList nl = _element.getChildNodes();
			ArrayList list = new ArrayList();
			for (int i = 0, n = nl.getLength(); i < n; i++) {
				list.add(nl.item(i));

			}
			for (int i = 0, n = list.size(); i < n; i++) {
				replacement.appendChild((Node) list.get(i));
			}
		}
		_element.getParentNode().replaceChild(replacement, _element);
		setReplacedElement(replacement);
	}

	/**
	 * @return the replacemd element
	 */
	public IDOMElement getNewElement() {
		return getReplacedElment();
	}
}
