My new code:
var tl;
var eventSource = new Timeline.DefaultEventSource(0);
var eventSource2 = new Timeline.DefaultEventSource(0);
var listOfDate = new Array();
function isset (variable) {
return (typeof variable != 'undefined');
}
function setDateAsLoaded(date){
listOfDate[date]=true;
}
function isDateLoaded(date){
return isset(listOfDate[date]);
}
function loadData3(timeline_date){
var i=0;
for (i=-5;i<=5;i++)
{
var date = new Date(timeline_date);
date.setDate(date.getDate()+i);
var day = date.getDate();
var month = date.getMonth();
var year = date.getFullYear();
var d = year+'-'+month+'-'+day;
//alert(d);
if(!isDateLoaded(d)){
setDateAsLoaded(d);
tl.loadJSON("test.php?d="+day+"&m="+month
+"&y="+year, function(json, url) {
eventSource.loadJSON(json, url);
tl.finishedEventLoading();
});
}
}
}
function onLoad() {
var theme1 = Timeline.ClassicTheme.create();
theme1.autoWidth = true;
theme1.mouseWheel = "default";
theme1.firstDayOfWeek=1;
var bandInfos = [
Timeline.createBandInfo({
overview: true,
width: "10%",
intervalUnit: Timeline.DateTime.MONTH,
eventSource: eventSource2,
theme: theme1,
intervalPixels: 100,
timezone: 1
}),Timeline.createBandInfo({
width: "10%",
intervalUnit: Timeline.DateTime.DAY,
eventSource: eventSource,
theme: theme1,
intervalPixels: 150,
timezone: 1
})
];
bandInfos[0].syncWith = 1;
bandInfos[0].highlight = true;
tl = Timeline.create(document.getElementById("tl"),
bandInfos);
tl.getBand(1).setCenterVisibleDate(Timeline.DateTime.parseGregorianDateTime(new
Date()));
tl.loadJSON("test.php", function(json, url) {
eventSource2.loadJSON(json, url);
tl.finishedEventLoading();
});
loadData();
var topBand = tl.getBand(1);
tl.getBand(1).setCenterVisibleDate(Timeline.DateTime.parseGregorianDateTime(new
Date()));
topBand.addOnScrollListener( loadData );
}
function loadData(){
var da = tl.getBand(1).getCenterVisibleDate();
loadData3(da);
}
var resizeTimerID = null;
function onResize() {
if (resizeTimerID == null) {
resizeTimerID = window.setTimeout(function() {
resizeTimerID = null;
tl.layout();
}, 500);
}
}
Only 1 problem, when i scroll (with the month band) he start loading
lot of date at same time and can be slow (apparently he can't do more
than a certain number of synchronous request)
But moving the day band it's really good thanks for the idea
On Sep 30, 9:41 am, Belfo <[email protected]> wrote:
> Hello,
>
> thanks for the info.
>
> Just how can you work on eventSource? Ok for calling the page only
> when needed.But how i can add manually data to eventSource (to check
> if data is already there and avoir double entry)
>
> Thanks
>
> On Sep 29, 9:40 pm, Michael Nosal <[email protected]> wrote:
>
>
>
>
>
>
>
> > You are on the right track, but the problem is that the onScrollListener
> > gets called every time your Timeline moves a single pixel.
> > You want this function to do nothing unless absolutely necessary.
> > For example, your ajax request is asking test.php for new data for an
> > entire day. You want to fetch this data once when the user scrolls to a new
> > day, not every time the user scrolls.
> > Here's how I approached this problem:
>
> > Create the timeline
> > Fetch data for "today" (9-29-2011)
> > Add "9-29-2011" to the list of days I've fetched data for (ListOfDays)
>
> > onScrollListener = function() {
> > var currDate = date of timeline()
> > if (currDate is NOT in ListOfDays) {
> > add currDate to ListOfDays
> > fetch new data via ajax for currDate {
> > update eventSource
> > tl.layout()
> > }
> > }
>
> > }
>
> > This way, I only load new data if it hasn't been fetched before, and the
> > user has scrolled the timeline to a date they haven't seen before. It
> > avoids removing the scrollListener, stopping the timeout, restarting the
> > timeout, re-adding the scroll listener, hoping the data returns in a
> > reasonable time, etc. The data is being returned asynchronously anyway, so
> > I don't care how long it takes to show up. It also avoids race conditions
> > between window.setTimeout()'s
>
> > I don't clear out the event source when fetching new data. Rather I loop
> > over the returned data, adding/changing/deleting events in the eventSource
> > as necessary. Creating events from JSON is expensive, so only do it if
> > necessary.
>
> > Performance is really excellent with this setup, and most of the time the
> > user has no idea that data is being loaded on the fly.
>
> > --Mike
>
> > On Sep 29, 2011, at 8:25 AM, Belfo wrote:
>
> > > I progressed putting this code:
>
> > > var tl;
> > > var eventSource = new Timeline.DefaultEventSource(0);
> > > var eventSource2 = new Timeline.DefaultEventSource(0);
> > > function onLoad() {
>
> > > var theme1 = Timeline.ClassicTheme.create();
> > > theme1.autoWidth = true;
> > > theme1.mouseWheel = "default";
> > > theme1.firstDayOfWeek=1;
>
> > > var bandInfos = [
> > > Timeline.createBandInfo({
> > > overview: true,
> > > width: "10%",
> > > intervalUnit: Timeline.DateTime.MONTH,
> > > eventSource: eventSource2,
> > > theme: theme1,
> > > intervalPixels: 100,
> > > timezone: 1
> > > }),Timeline.createBandInfo({
>
> > > width: "10%",
> > > intervalUnit: Timeline.DateTime.DAY,
> > > //overview: true,
> > > eventSource: eventSource,
> > > theme: theme1,
> > > intervalPixels: 150,
> > > timezone: 1
> > > })
>
> > > ];
> > > bandInfos[0].syncWith = 1;
>
> > > bandInfos[0].highlight = true;
>
> > > tl = Timeline.create(document.getElementById("tl"),
> > > bandInfos);
>
> > > tl.getBand(1).setCenterVisibleDate(Timeline.DateTime.parseGregorianDateTime
> > > (new
> > > Date()));
> > > tl.loadJSON("test.php", function(json, url) {
> > > eventSource2.loadJSON(json, url);
> > > tl.finishedEventLoading();
> > > //
> > > tl.getBand(0).setCenterVisibleDate(Timeline.DateTime.parseGregorianDateTime
> > > (new
> > > Date()));
>
> > > });
> > > var da = tl.getBand(1).getCenterVisibleDate();
> > > var date = new Date(da);
> > > var day = date.getDate();
> > > var month = date.getMonth();
> > > var year = date.getFullYear();
> > > tl.loadJSON("test.php?d="+day+"&m="+month+"&y="+year,
> > > function(json, url) {
> > > eventSource.loadJSON(json, url);
> > > tl.finishedEventLoading();
>
> > > tl.getBand(1).setCenterVisibleDate(Timeline.DateTime.parseGregorianDateTime
> > > (new
> > > Date()));
>
> > > });
>
> > > var func2 = function(){
>
> > > window.clearTimeout(initTimer);
> > > var topBand = tl.getBand(1);
> > > topBand.addOnScrollListener( loadData );
> > > }
> > > var initTimer=window.setTimeout(func2,3000);
> > > }
>
> > > function loadData(){
> > > var band = tl.getBand(1);
>
> > > if (band._timer !== false) {
> > > window.clearTimeout(band._timer);
> > > band._timer = false;
> > > }
> > > var func = function() {
> > > band.removeOnScrollListener(loadData);
> > > window.clearTimeout(band._timer);
> > > band._timer = false;
> > > var eventSource = band.getEventSource();
> > > eventSource.clear();
> > > var da = band.getCenterVisibleDate();
> > > //alert(da);
> > > var date = new Date(da);
> > > var day = date.getDate();
> > > var month = date.getMonth();
> > > var year = date.getFullYear();
> > > tl.loadJSON("test.php?d="+day+"&m="+month
> > > +"&y="+year, function(json, url) {
> > > eventSource.loadJSON(json, url);
> > > tl.finishedEventLoading();
>
> > > });
> > > tl.layout();
> > > band.addOnScrollListener(loadData);
> > > };
> > > band._timer = window.setTimeout(func,3000);
>
> > > }
>
> > > var resizeTimerID = null;
> > > function onResize() {
> > > if (resizeTimerID == null) {
> > > resizeTimerID = window.setTimeout(function() {
> > > resizeTimerID = null;
> > > tl.layout();
> > > }, 500);
> > > }
> > > }
>
> > > The problem is i must set a timeout large enough to be sure the data
> > > is loaded (and can be long (4s) when passing through reverse proxy/
> > > firewall) otherwise it start calling the test.php page infinitely.
> > > Also with this solution, when scrolling i wait the settled second
> > > before start to showing data.
>
> > > --
> > > You received this message because you are subscribed to the Google Groups
> > > "SIMILE Widgets" group.
> > > To post to this group, send email to [email protected].
> > > To unsubscribe from this group, send email to
> > > [email protected].
> > > For more options, visit this group
> > > athttp://groups.google.com/group/simile-widgets?hl=en.
--
You received this message because you are subscribed to the Google Groups
"SIMILE Widgets" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/simile-widgets?hl=en.