Browse Source

Fix for Firefox bug that occurs when in GMT timezone and dates occur before 1970 and continue past 1970. closes #151 and closes #135

Nasty weird bug in the way Firefox handles dates.
pull/162/head
Zach Wise 13 years ago
parent
commit
43f9194f29
  1. 7
      source/js/Core/VMM.Date.js
  2. 242
      source/js/VMM.Timeline.TimeNav.js

7
source/js/Core/VMM.Date.js

@ -139,7 +139,8 @@ if(typeof VMM != 'undefined' && typeof VMM.Date == 'undefined') {
if (d2 != null) {
is_pair = true;
}
if (type.of(d) == "date") {
if (d.getMonth() === 0 && d.getDate() == 1 && d.getHours() === 0 && d.getMinutes() === 0 ) {
// YEAR ONLY
@ -173,8 +174,8 @@ if(typeof VMM != 'undefined' && typeof VMM.Date == 'undefined') {
format = VMM.Date.dateformats.full_long;
}
}
_date = dateFormat(d, format);
_date = dateFormat(d, format, false);
bc_check = _date.split(" ");
// BC TIME SUPPORT

242
source/js/VMM.Timeline.TimeNav.js

@ -1,4 +1,6 @@
/* TIMELINE NAVIGATION
/* TimeNav
This class handles the bottom timeline navigation.
It requires the VMM.Util class and VMM.Date class
================================================== */
if(typeof VMM.Timeline != 'undefined' && typeof VMM.Timeline.TimeNav == 'undefined') {
@ -453,7 +455,9 @@ if(typeof VMM.Timeline != 'undefined' && typeof VMM.Timeline.TimeNav == 'undefin
return _time;
}
/* POSITION
/* POSITION
Positions elements on the timeline based on date
relative to the calculated interval
================================================== */
var positionRelative = function(_interval, first, last) {
var _first,
@ -714,9 +718,9 @@ if(typeof VMM.Timeline != 'undefined' && typeof VMM.Timeline.TimeNav == 'undefin
for(var i = 0; i < the_intervals.length; i++) {
var _interval = the_intervals[i].interval_element,
_interval_date = the_intervals[i].interval_date,
_interval_visible = the_intervals[i].interval_visible,
var _interval = the_intervals[i].element,
_interval_date = the_intervals[i].date,
_interval_visible = the_intervals[i].visible,
_pos = positionOnTimeline(interval, the_intervals[i].relative_pos),
pos = _pos.begin,
_animation = the_intervals[i].animation,
@ -835,150 +839,206 @@ if(typeof VMM.Timeline != 'undefined' && typeof VMM.Timeline.TimeNav == 'undefin
*/
}
/* Interval Elements
================================================== */
var createIntervalElements = function(_interval, _array, _element_parent) {
var inc_time = 0,
_first_run = true,
_last_pos = 0,
_largest_pos = 0;
var inc_time = 0,
_first_run = true,
_last_pos = 0,
_largest_pos = 0,
_timezone_offset,
_first_date,
firefox = {
flag: false,
offset: 0
};
VMM.attachElement(_element_parent, "");
_interval.date = new Date(data[0].startdate.getFullYear(), 0, 1, 0,0,0);
for(var i = 0; i < Math.ceil(_interval.number) + 1; i++) {
var _idd,
_pos,
pos,
_date,
_visible = false,
_relative_pos,
_element = VMM.appendAndGetElement(_element_parent, "<div>", _interval.classname);
_timezone_offset = _interval.date.getTimezoneOffset();
for(var i = 0; i < Math.ceil(_interval.number) + 2; i++) {
var _is_year = false,
int_obj = {
element: VMM.appendAndGetElement(_element_parent, "<div>", _interval.classname),
date: new Date(data[0].startdate.getFullYear(), 0, 1, 0,0,0),
visible: false,
date_string: "",
type: _interval.interval_type,
relative_pos: 0,
is_detached: false,
animation: {
animate: false,
pos: "",
opacity: "100"
}
};
//int_obj.date.setFullYear( data[0].startdate.getFullYear() );
//int_obj.date.setMonth( data[0].startdate.getMonth() );
//int_obj.date.setDate( data[0].startdate.getDate() );
//int_obj.date.setHours( data[0].startdate.getHours() );
//int_obj.date.setMinutes( data[0].startdate.getMinutes() );
//int_obj.date.setSeconds( data[0].startdate.getSeconds() );
//int_obj.date.setMilliseconds(0);
if (_interval.type == "eon") {
if (_first_run) {
_interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 500000000) * 500000000 );
_first_date = Math.floor(data[0].startdate.getFullYear() / 500000000) * 500000000;
}
_interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 500000000));
int_obj.date.setFullYear(_first_date + (inc_time * 500000000));
_is_year = true;
} else if (_interval.type == "era") {
if (_first_run) {
_interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 100000000) * 100000000 );
_first_date = Math.floor(data[0].startdate.getFullYear() / 100000000) * 100000000;
}
_interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 100000000));
int_obj.date.setFullYear(_first_date + (inc_time * 100000000));
_is_year = true;
} else if (_interval.type == "epoch") {
if (_first_run) {
_interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 10000000) * 10000000 );
_first_date = Math.floor(data[0].startdate.getFullYear() / 10000000) * 10000000
}
_interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 10000000));
int_obj.date.setFullYear(_first_date + (inc_time * 10000000));
_is_year = true;
} else if (_interval.type == "age") {
if (_first_run) {
_interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 1000000) * 1000000 );
_first_date = Math.floor(data[0].startdate.getFullYear() / 1000000) * 1000000
}
_interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 1000000));
int_obj.date.setFullYear(_first_date + (inc_time * 1000000));
_is_year = true;
} else if (_interval.type == "millenium") {
if (_first_run) {
_interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 1000) * 1000 );
_first_date = Math.floor(data[0].startdate.getFullYear() / 1000) * 1000;
}
_interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 1000));
int_obj.date.setFullYear(_first_date + (inc_time * 1000));
_is_year = true;
} else if (_interval.type == "century") {
if (_first_run) {
_interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 100) * 100 );
_first_date = Math.floor(data[0].startdate.getFullYear() / 100) * 100
}
_interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 100));
int_obj.date.setFullYear(_first_date + (inc_time * 100));
_is_year = true;
} else if (_interval.type == "decade") {
if (_first_run) {
_interval.date.setFullYear( Math.floor(data[0].startdate.getFullYear() / 10) * 10 );
_first_date = Math.floor(data[0].startdate.getFullYear() / 10) * 10;
}
_interval.date.setFullYear(_interval.date.getFullYear() + (inc_time * 10));
int_obj.date.setFullYear(_first_date + (inc_time * 10));
_is_year = true;
} else if (interval.type == "year") {
if (_first_run) {
_first_date = data[0].startdate.getFullYear();
}
_interval.date.setFullYear(_interval.date.getFullYear() + inc_time);
int_obj.date.setFullYear(_first_date + inc_time);
_is_year = true;
} else if (_interval.type == "month") {
if (_first_run) {
_interval.date.setMonth(data[0].startdate.getMonth());
_first_date = data[0].startdate.getMonth();
}
_interval.date.setMonth(_interval.date.getMonth() + inc_time);
int_obj.date.setMonth(_first_date + inc_time);
} else if (_interval.type == "week") {
if (_first_run) {
_interval.date.setMonth( data[0].startdate.getMonth() );
_interval.date.setDate( Math.floor(data[0].startdate.getDate() *7) );
_first_date = data[0].startdate.getMonth();
}
_interval.date.setDate(_interval.date.getDate() + (inc_time * 7) );
int_obj.date.setMonth(data[0].startdate.getMonth());
int_obj.date.setDate(_first_date + (inc_time * 7) );
} else if (_interval.type == "day") {
if (_first_run) {
_interval.date.setMonth( data[0].startdate.getMonth() );
_interval.date.setDate( data[0].startdate.getDate() );
_first_date = data[0].startdate.getDate();
}
_interval.date.setDate(_interval.date.getDate() + inc_time);
int_obj.date.setMonth(data[0].startdate.getMonth());
int_obj.date.setDate(_first_date + inc_time);
} else if (_interval.type == "hour") {
if (_first_run) {
_interval.date.setMonth( data[0].startdate.getMonth() );
_interval.date.setDate( data[0].startdate.getDate() );
_interval.date.setHours( data[0].startdate.getHours() );
_first_date = data[0].startdate.getHours();
}
_interval.date.setHours(_interval.date.getHours() + inc_time);
int_obj.date.setMonth(data[0].startdate.getMonth());
int_obj.date.setDate(data[0].startdate.getDate());
int_obj.date.setHours(_first_date + inc_time);
} else if (_interval.type == "minute") {
if (_first_run) {
_interval.date.setMonth( data[0].startdate.getMonth() );
_interval.date.setDate( data[0].startdate.getDate() );
_interval.date.setHours( data[0].startdate.getHours() );
_interval.date.setMinutes( data[0].startdate.getMinutes() );
_first_date = data[0].startdate.getMinutes();
}
_interval.date.setMinutes(_interval.date.getMinutes() + inc_time);
int_obj.date.setMonth(data[0].startdate.getMonth());
int_obj.date.setDate(data[0].startdate.getDate());
int_obj.date.setHours(data[0].startdate.getHours());
int_obj.date.setMinutes(_first_date + inc_time);
} else if (_interval.type == "second") {
if (_first_run) {
_interval.date.setMonth( data[0].startdate.getMonth() );
_interval.date.setDate( data[0].startdate.getDate() );
_interval.date.setHours( data[0].startdate.getHours() );
_interval.date.setMinutes( data[0].startdate.getMinutes() );
_interval.date.setSeconds( data[0].startdate.getSeconds() );
_first_date = data[0].startdate.getSeconds();
}
_interval.date.setSeconds(_interval.date.getSeconds() + inc_time);
int_obj.date.setMonth(data[0].startdate.getMonth());
int_obj.date.setDate(data[0].startdate.getDate());
int_obj.date.setHours(data[0].startdate.getHours());
int_obj.date.setMinutes(data[0].startdate.getMinutes());
int_obj.date.setSeconds(_first_date + inc_time);
} else if (_interval.type == "millisecond") {
if (_first_run) {
_first_date = data[0].startdate.getMilliseconds();
}
int_obj.date.setMonth(data[0].startdate.getMonth());
int_obj.date.setDate(data[0].startdate.getDate());
int_obj.date.setHours(data[0].startdate.getHours());
int_obj.date.setMinutes(data[0].startdate.getMinutes());
int_obj.date.setSeconds(data[0].startdate.getSeconds());
int_obj.date.setMilliseconds(_first_date + inc_time);
}
_idd = VMM.Date.prettyDate(_interval.date, true);
inc_time = 1;
_first_run = false;
_relative_pos = positionRelative(interval, _interval.date);
// FIX WEIRD FIREFOX BUG FOR GMT TIME FORMATTING
if (VMM.Browser.browser == "Firefox") {
if (int_obj.date.getFullYear() == "1970" && int_obj.date.getTimezoneOffset() != _timezone_offset) {
trace("FIREFOX 1970 TIMEZONE OFFSET " + int_obj.date.getTimezoneOffset() + " SHOULD BE " + _timezone_offset);
trace(_interval.type + " " + _interval.date);
// try and fix firefox bug, if not the flag will catch it
firefox.offset = (int_obj.date.getTimezoneOffset()/60);
firefox.flag = true;
int_obj.date.setHours(int_obj.date.getHours() + firefox.offset );
} else if (firefox.flag) {
// catch the bug the second time around
firefox.flag = false;
int_obj.date.setHours(int_obj.date.getHours() + firefox.offset );
if (_is_year) {
firefox.flag = true;
}
}
}
//_pos = positionOnTimeline(_interval, _interval.date);
//pos = _pos.begin;
pos = _relative_pos.begin;
if (_is_year) {
if ( int_obj.date.getFullYear() < 0 ) {
int_obj.date_string = Math.abs( int_obj.date.getFullYear() ).toString() + " B.C.";
} else {
int_obj.date_string = int_obj.date.getFullYear();
}
} else {
int_obj.date_string = VMM.Date.prettyDate(int_obj.date, true);
}
VMM.appendElement(_element, _idd);
// Increment Time
inc_time++;
VMM.Lib.css(_element, "text-indent", -(VMM.Lib.width(_element)/2));
VMM.Lib.css(_element, "opacity", "0");
_last_pos = pos;
// No longer first run
_first_run = false;
if (pos > _largest_pos) {
_largest_pos = pos;
int_obj.relative_pos = positionRelative(interval, int_obj.date);
_last_pos = int_obj.relative_pos.begin;
if (int_obj.relative_pos.begin > _largest_pos) {
_largest_pos = int_obj.relative_pos.begin;
}
_date = new Date(_interval.date);
var _obj = {
interval_element: _element,
interval_date: _date,
interval_visible: _visible,
type: _interval.interval_type,
relative_pos: _relative_pos,
is_detached: false,
animation: {
animate: false,
pos: "",
opacity: "100"
}
};
// Add the time string to the element and position it.
VMM.appendElement(int_obj.element, int_obj.date_string);
VMM.Lib.css(int_obj.element, "text-indent", -(VMM.Lib.width(int_obj.element)/2));
VMM.Lib.css(int_obj.element, "opacity", "0");
_array.push(_obj);
// add the interval element to the array
_array.push(int_obj);
}
VMM.Lib.width($timeintervalminor_minor, _largest_pos);

Loading…
Cancel
Save