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



import java.util.Enumeration;
import java.util.Iterator;

import org.eclipse.wst.css.core.internal.Logger;
import org.eclipse.wst.css.core.internal.parser.CSSRegionUtil;
import org.eclipse.wst.css.core.internal.parserz.CSSRegionContexts;
import org.eclipse.wst.css.core.internal.parserz.CSSTextToken;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;


public class CSSUtil {

	/**
	 * 
	 */
	public static void debugOut(String str) {
		Logger.log(Logger.WARNING, "css warning: " + str); //$NON-NLS-1$
	}

	/**
	 * 
	 */
	// public static Vector extractMediaContents(Vector regions) {
	// Vector media = new Vector();
	// if (regions == null) { return media; }
	//
	// boolean bReady = true;
	// for (Iterator i = regions.iterator(); i.hasNext(); ) {
	// ITextRegion region = (ITextRegion)i.next();
	// if (region == null) { continue; }
	// String type = region.getType();
	// if (bReady) {
	// if (type == IDENT) {
	// media.addElement(region.getText());
	// bReady = false;
	// }
	// } else {
	// if (type == COMMA) {
	// bReady = true;
	// }
	// }
	// }
	//
	// return media;
	// }
	/**
	 * 
	 */
	public static String extractStringContents(String text) {
		return stripQuotes(text);
	}

	/**
	 * 
	 */
	public static String extractUriContents(String text) {
		String contents = text.trim();
		if (contents.toLowerCase().startsWith("url(") && //$NON-NLS-1$
					contents.toLowerCase().endsWith(")")) {//$NON-NLS-1$
			// strip "url(", ")"
			contents = contents.substring(4, contents.length() - 1);
		}
		contents = stripQuotes(contents);

		return contents;
	}

	/**
	 * 
	 */
	public static IStructuredDocumentRegion findNextSignificantNode(IStructuredDocumentRegion startNode) {
		if (startNode == null) {
			return null;
		}
		IStructuredDocumentRegion node = startNode.getNext();
		while (node != null) {
			String type = getStructuredDocumentRegionType(node);
			if (type != CSSRegionContexts.CSS_S && type != CSSRegionContexts.CSS_COMMENT && type != CSSRegionContexts.CSS_CDO && type != CSSRegionContexts.CSS_CDC) {
				return node;
			}
			node = node.getNext();
		}
		return null;
	}

	/**
	 * 
	 */
	public static IStructuredDocumentRegion findNodeBackward(IStructuredDocumentRegion startNode, IStructuredDocumentRegion endNode, String type) {
		IStructuredDocumentRegion node;
		for (node = startNode; node != null; node = node.getPrevious()) {
			if (node.getStartOffset() < endNode.getStartOffset()) {
				node = null;
				break;
			}
			else if (getStructuredDocumentRegionType(node) == type) {
				break;
			}
		}
		return node;
	}

	/**
	 * 
	 */
	public static IStructuredDocumentRegion findNodeForward(IStructuredDocumentRegion startNode, IStructuredDocumentRegion endNode, String type) {
		IStructuredDocumentRegion node;
		for (node = startNode; node != null; node = node.getNext()) {
			if (endNode.getStartOffset() < node.getStartOffset()) {
				node = null;
				break;
			}
			else if (getStructuredDocumentRegionType(node) == type) {
				break;
			}
		}
		return node;
	}

	/**
	 * 
	 */
	public static IStructuredDocumentRegion findPreviousSignificantNode(IStructuredDocumentRegion startNode) {
		if (startNode == null) {
			return null;
		}
		IStructuredDocumentRegion node = startNode.getPrevious();
		while (node != null) {
			String type = getStructuredDocumentRegionType(node);
			if (type != CSSRegionContexts.CSS_S && type != CSSRegionContexts.CSS_COMMENT && type != CSSRegionContexts.CSS_CDO && type != CSSRegionContexts.CSS_CDC) {
				return node;
			}
			node = node.getPrevious();
		}
		return null;
	}

	/**
	 * 
	 */
	public static String getClassString(Object object) {
		if (object == null) {
			return "null"; //$NON-NLS-1$
		}
		else {
			String name = object.getClass().toString();
			int lastPeriod = name.lastIndexOf('.');
			return name.substring(lastPeriod + 1);
		}
	}

	/**
	 * 
	 */
	public static String getStructuredDocumentRegionType(IStructuredDocumentRegion flatNode) {
		if (flatNode == null) {
			return CSSRegionContexts.CSS_UNDEFINED;
		}
		ITextRegionList regions = flatNode.getRegions();
		if (regions == null || regions.size() == 0) {
			return CSSRegionContexts.CSS_UNDEFINED;
		}
		ITextRegion region = regions.get(0);
		return region.getType();
	}

	/**
	 * 
	 */
	public static int getLengthDifference(IStructuredDocumentRegionList newNodes, IStructuredDocumentRegionList oldNodes) {
		int newLen = getTextLength(newNodes);
		int oldLen = getTextLength(oldNodes);
		return newLen - oldLen;
	}

	/**
	 * 
	 */
	public static String getRegionText(IStructuredDocumentRegion flatNode, ITextRegionList regions) {
		StringBuffer buf = new StringBuffer();
		if (regions != null) {
			for (Iterator i = regions.iterator(); i.hasNext();) {
				ITextRegion region = (ITextRegion) i.next();
				if (region == null) {
					continue;
				}
				buf.append(flatNode.getText(region));
			}
		}

		return buf.toString();
	}

	/**
	 * 
	 */
	public static int getTextLength(IStructuredDocumentRegionList nodes) {
		int length = 0;

		if (nodes != null) {
			for (Enumeration e = nodes.elements(); e.hasMoreElements();) {
				IStructuredDocumentRegion flatNode = (IStructuredDocumentRegion) e.nextElement();
				if (flatNode != null) {
					length += flatNode.getText().length();
				}
			}
		}

		return length;
	}

	/**
	 * 
	 * @param token
	 * @return
	 */
	public static boolean isLength(CSSTextToken token) {
		if (token == null)
			return false;
		if (token.kind == CSSRegionContexts.CSS_DECLARATION_VALUE_DIMENSION)
			return true;
		if (token.kind == CSSRegionContexts.CSS_DECLARATION_VALUE_NUMBER) {
			double number = Double.parseDouble(token.image);
			if (number == 0.0)
				return true;
		}
		return false;
	}

	/**
	 * 
	 */
	public static boolean isSelectorText(IStructuredDocumentRegion region) {
		String type = getStructuredDocumentRegionType(region);
		if (CSSRegionUtil.isSelectorBegginingType(type)) {
			return true;
		}
		else if (type == CSSRegionContexts.CSS_UNKNOWN) {
			// String text = flatNode.getText();
			// if (text != null && text.indexOf('.') == 0) {
			return true;
			// }
		}

		return false;
	}

	/**
	 * 
	 */
	public static String stripQuotes(String text) {
		if (text == null)
			return null;
		String contents = text.trim();
		if (2 <= contents.length()) {
			char first = contents.charAt(0);
			char last = contents.charAt(contents.length() - 1);
			if ((first == '\"' && last == '\"') || (first == '\'' && last == '\'')) {
				contents = contents.substring(1, contents.length() - 1);
			}
		}
		return contents;
	}

	public static String detectQuote(String source, String defaultQuote) {
		if (source == null)
			return defaultQuote;
		final String D_QUOTE = "\""; //$NON-NLS-1$
		final String S_QUOTE = "\'"; //$NON-NLS-1$

		int dIndex = source.indexOf(D_QUOTE);
		int sIndex = source.indexOf(S_QUOTE);
		if (dIndex < 0 && sIndex < 0) {
			return defaultQuote;
		}
		else if (dIndex < 0) {
			return D_QUOTE;
		}
		else if (sIndex < 0) {
			return S_QUOTE;
		}
		else if (dIndex < sIndex) {
			return S_QUOTE;
		}
		else {
			return D_QUOTE;
		}
	}

	/**
	 * 
	 */
	public static void stripSurroundingSpace(ITextRegionList regions) {
		if (regions == null) {
			return;
		}
		while (!regions.isEmpty()) {
			ITextRegion region = regions.get(0);
			String type = region.getType();
			if (type == CSSRegionContexts.CSS_S || type == CSSRegionContexts.CSS_COMMENT) {
				regions.remove(0);
			}
			else {
				break;
			}
		}
		while (!regions.isEmpty()) {
			ITextRegion region = regions.get(regions.size() - 1);
			String type = region.getType();
			if (type == CSSRegionContexts.CSS_S || type == CSSRegionContexts.CSS_COMMENT) {
				regions.remove(region);
			}
			else {
				break;
			}
		}
	}
}