package org.tltv.gantt.client.shared;
import java.util.Date;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.i18n.client.TimeZone;
public class GanttUtil {
/**
* Calculate week number for the given date.
*
* @param d
* Target date
* @param timezoneOffset
* Time zone offset in milliseconds
* @param firstDayOfWeek
* First day of week. Integer between 1-7. 1 is Sunday.
* @return
*/
public static int getWeekNumber(Date d, long timezoneOffset,
int firstDayOfWeek) {
/*
* Thanks to stackoverflow.com for a easy function to calculate week
* number. See
* http://stackoverflow.com/questions/6117814/get-week-of-year
* -in-javascript-like-in-php
*/
d = new Date(d.getYear(), d.getMonth(), d.getDate());
int daysToTursday;
if (firstDayOfWeek == 1) {
daysToTursday = 4 - d.getDay();
} else {
daysToTursday = 4 - ((d.getDay() == 0) ? 7 : d.getDay());
}
d.setDate(d.getDate() + daysToTursday);
Date yearStart = new Date(d.getYear(), 0, 1);
double weekNo = Math
.ceil((((d.getTime() - yearStart.getTime()) / 86400000.0) + 1.0) / 7.0);
return (int) weekNo;
}
/**
* Parse computed styles to get precise margin height for the given element.
* Returns zero if computed styles is not defined.
*
* @param elem
* Target element to measure
*/
public static native double getMarginByComputedStyle(
com.google.gwt.dom.client.Element elem)
/*-{
var cs = elem.ownerDocument.defaultView.getComputedStyle(elem);
if (cs) {
size = parseInt(cs.getPropertyValue('margin-top'))
+ parseInt(cs.getPropertyValue('margin-bottom'));
} else {
size = 0;
}
return size;
}-*/;
public static native double getBoundingClientRectRight(
com.google.gwt.dom.client.Element element)
/*-{
if(!element) {
return 0.0;
}
if (element.getBoundingClientRect) {
var rect = element.getBoundingClientRect();
return rect.right;
} else {
return element.offsetLeft + element.offsetWidth;
}
}-*/;
public static native double getBoundingClientRectLeft(
com.google.gwt.dom.client.Element element)
/*-{
if(!element) {
return 0.0;
}
if (element.getBoundingClientRect) {
var rect = element.getBoundingClientRect();
return rect.left;
} else {
return element.offsetLeft;
}
}-*/;
public static native double getBoundingClientRectWidth(
com.google.gwt.dom.client.Element element)
/*-{
if(!element) {
return 0.0;
}
if (element.getBoundingClientRect) {
var rect = element.getBoundingClientRect();
return rect.right - rect.left;
} else {
return element.offsetWidth;
}
}-*/;
public static native double getBoundingClientRectHeight(
com.google.gwt.dom.client.Element element)
/*-{
if(!element) {
return 0.0;
}
if (element.getBoundingClientRect) {
var rect = element.getBoundingClientRect();
return rect.bottom - rect.top;
} else {
return element.offsetHeight;
}
}-*/;
public static native double getBoundingClientRectTop(
com.google.gwt.dom.client.Element element)
/*-{
if(!element) {
return 0.0;
}
if (element.getBoundingClientRect) {
var rect = element.getBoundingClientRect();
return rect.top;
} else {
return element.offsetTop;
}
}-*/;
public static native double getBoundingClientRectBottom(
com.google.gwt.dom.client.Element element)
/*-{
if(!element) {
return 0.0;
}
if (element.getBoundingClientRect) {
var rect = element.getBoundingClientRect();
return rect.bottom;
} else {
return element.offsetTop + element.offsetHeight;
}
}-*/;
public static boolean isTouchEvent(NativeEvent event) {
return event.getType().contains("touch");
}
public static int getTouchOrMouseClientX(NativeEvent event) {
if (isTouchEvent(event)) {
return event.getChangedTouches().get(0).getClientX();
} else {
return event.getClientX();
}
}
public static int getTouchOrMouseClientY(NativeEvent event) {
if (isTouchEvent(event)) {
return event.getChangedTouches().get(0).getClientY();
} else {
return event.getClientY();
}
}
public static native Element getElementFromPoint(int clientX, int clientY)
/*-{
var el = $wnd.document.elementFromPoint(clientX, clientY);
// Call elementFromPoint two times to make sure IE8 also returns something sensible if the application is running in an iframe
el = $wnd.document.elementFromPoint(clientX, clientY);
if(el != null && el.nodeType == 3) {
el = el.parentNode;
}
return el;
}-*/;
/**
* Returns daylight saving adjustment (in minutes) for normalized date.
* Normalized date is zoned date without DST.
*
* @param normalDate
* Date representing target time zone without DST.
* @param targetTimeZone
* @return Daylight saving adjustment in minutes
*/
public static native int getDaylightAdjustmentForNormalDate(
Long normalDate, TimeZone targetTimeZone)
/*-{
if (targetTimeZone.@com.google.gwt.i18n.client.TimeZone::transitionPoints == null) {
return 0;
}
var timeInHours = normalDate / 1000 / 3600;
var index = 0;
while (index < targetTimeZone.@com.google.gwt.i18n.client.TimeZone::transitionPoints.length
&& timeInHours >= (targetTimeZone.@com.google.gwt.i18n.client.TimeZone::transitionPoints[index]
- ( ((index == 0) ? 0 : targetTimeZone.@com.google.gwt.i18n.client.TimeZone::adjustments[index - 1]) / 60) )) {
++index;
}
return (index == 0) ? 0 : targetTimeZone.@com.google.gwt.i18n.client.TimeZone::adjustments[index - 1];
}-*/;
}