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

import java.util.Arrays;

import org.eclipse.gef.EditPart;
import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

/**
 * This rule deal with containers 'body', 'view', 'subview'.
 * 
 * @author mengbo
 */
public class RootContainerPositionRule extends DefaultPositionRule {
	static final String[] HTML_ROOT_CONTAINERS = { "body" }; //$NON-NLS-1$

	/**
	 * @param actionData
	 */
	public RootContainerPositionRule(ActionData actionData) {
		super(actionData);
	}

	/**
	 * 1. If anyone of the three containers exists, the target should be in the
	 * container. 2. If none of the containers exists, then target will be not
	 * restricted.
	 * 
	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.validation.caret.Target)
	 */
	public boolean hasEditableArea(Target target) {
		EditPart part = target.getPart();
		if (part == null) {
			return false;
		}
		Node node = target.getNode();
		if (hasBasicContainers(EditModelQuery.getDocumentNode(node))) {
			return true;// isWithinkBasicContainer(node);
		}
		return super.hasEditableArea(target);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.gef.EditPart)
	 */
	public boolean isEditable(Target target) {
		Node node = target.getNode();
		if (hasBasicContainers(EditModelQuery.getDocumentNode(node))) {
			boolean result = isWithinkBasicContainer(node);
			return result;
		}
		return super.isEditable(target);
	}

	/**
	 * We need to see if body, view are there. and they should be at first or
	 * second level.
	 * 
	 * @param document
	 * @return true if the document has basic containers
	 */
	public static boolean hasBasicContainers(Document document) {
		return getBasicContainer(document) != null;

	}

	private static boolean isWithinkBasicContainer(Node node) {
		return EditModelQuery.isChild(HTML_ROOT_CONTAINERS, node, true, false);
	}

	/**
	 * @param document
	 * @return the basic root container for the document or null
	 */
	public static Node getBasicContainer(Document document) {
		Node node = EditModelQuery.getChild(document, HTML_ROOT_CONTAINERS, 2,
				false);
		if (node == null) {
			node = EditModelQuery.getChild(document, HTML_ROOT_CONTAINERS, 2,
					true);
		}
		return node;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#canReference(org.eclipse.jst.pagedesigner.validation.caret.Target,
	 *      boolean)
	 */
	public boolean canReference(Target target, boolean atRight) {
		Node node = target.getNode();
		if (node.getLocalName() != null) {
			if (Arrays.asList(HTML_ROOT_CONTAINERS).contains(
					node.getLocalName().toLowerCase())) {
				return EditModelQuery.isChild(
						JSFRootContainerPositionRule.JSF_ROOT_CONTAINERS, node,
						false, false);
			}
		}
		return true;
	}
}
