/*******************************************************************************
 * 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.dom;

import org.w3c.dom.Node;

/**
 * This ref position use a parent node as reference. And provide whether this
 * location is at the beginning of its parent or last of its parent.
 * 
 * @author mengbo
 * @version 1.5
 */
public class DOMRefPosition2 implements IDOMRefPosition {
	Node _parentNode;

	boolean _last;

	/**
	 * @param replacement
	 * @param _last2
	 */
	public DOMRefPosition2(Node parent, boolean last) {
		_parentNode = parent;
		_last = last;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.dom.IDOMRefPosition#getReferenceNode()
	 */
	public Node getReferenceNode() {
		return _parentNode;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getSibling(boolean)
	 */
	public Node getSibling(boolean forward) {
		if (forward) {
			if (_last) {
				return null;
			} else {
				return _parentNode.getFirstChild();
			}
		} else {
			if (_last) {
				return _parentNode.getLastChild();
			} else {
				return null;
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getNextSiblingNode()
	 */
	public Node getNextSiblingNode() {
		return getSibling(true);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getPreviousSiblingNode()
	 */
	public Node getPreviousSiblingNode() {
		return getSibling(false);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getContainerNode()
	 */
	public Node getContainerNode() {
		return _parentNode;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getOffset()
	 */
	public int getOffset() {
		if (!_last) {
			return 0;
		} else {
			return _parentNode.getChildNodes().getLength();
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#isText()
	 */
	public boolean isText() {
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#handleReplacement(org.w3c.dom.Node,
	 *      org.w3c.dom.Node)
	 */
	public IDOMPosition handleReplacement(Node original, Node replacement) {
		if (original == _parentNode) {
			return new DOMRefPosition2(replacement, _last);
		} else
			return this;
	}

}
