/*
* Copyright 2009 Sysmap Solutions Software e Consultoria Ltda.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
//package br.com.sysmap.crux.core.client.utils;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.Element;
/**
*
* @author Thiago
*/
public class DOMUtils {
/**
* Implementation of DOM's getElementsByTagName
* @param tagName
* @return
*/
public static Element[] getElementsByTagName(String tagName)
{
JavaScriptObject elements = getElementsByTagNameInternal(tagName);
int length = getArrayLength(elements);
Element[] result = new Element[length];
for (int i=0; i {
result[i] = getArrayElement(elements, i);
}
return result;
}
/**
* List all elements with the specified class. Try first the implementation of DOM's getElementsByClassName.
* If not present try to use XPATH. If xpath is not supported searches DOM structure.
*
* @param tagName
* @return
*/
public static Element[] getElementsByClassName(String className, Element parentElement)
{
JavaScriptObject elements = getElementsByClassNameInternal(className, parentElement);
int length = getArrayLength(elements);
Element[] result = new Element[length];
for (int i=0; i {
result[i] = getArrayElement(elements, i);
}
return result;
}
private static native int getArrayLength(JavaScriptObject array)/*-{
return array.length;
}-*/;
private static native Element getArrayElement(JavaScriptObject array, int position)/*-{
return (position>=0 && position }-*/;
private static native JavaScriptObject getElementsByTagNameInternal(String tagName)/*-{
return $doc.getElementsByTagName(tagName);
}-*/;
private static native JavaScriptObject getElementsByClassNameInternal(String className, Element parentElement)/*-{
if ((parentElement && parentElement.getElementsByClassName) || $doc.getElementsByClassName)
{
return (parentElement || $doc).getElementsByClassName(className);
}
else if (!!document.evaluate)
{
var expression = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
var results = [];
var query = $doc.evaluate(expression, parentElement || $doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i = 0, length = query.snapshotLength; i < length; i++)
results.push(query.snapshotItem(i));
return results;
}
else
{
var children = (parentElement || $doc.body).getElementsByTagName('*');
var elements = [], child, pattern = new RegExp("(^|\\s)" + className + "(\\s|$)");
for (var i = 0, length = children.length; i < length; i++) {
child = children[i];
var elementClassName = child.className;
if (elementClassName.length == 0) continue;
if (elementClassName == className || elementClassName.match(pattern))
elements.push(child);
}
return elements;
}
}-*/;
public static native String getDocumentName()/*-{
return $doc.location.href;
}-*/;
public static native Element getPreviousSiblingElement(Element elem) /*-{
var sib = elem.previousSibling;
while (sib && sib.nodeType != 1)
sib = sib.previousSibling;
return sib;
}-*/;
}