/*******************************************************************************
 * 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; //$NON-NLS-1$
			} 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();
	}
}
