Skip to content

Commit

Permalink
Timezone detection: Client implementation
Browse files Browse the repository at this point in the history
refs #6078
  • Loading branch information
mxhash committed Sep 5, 2014
1 parent 0b53f30 commit 3ce4248
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 8 deletions.
1 change: 1 addition & 0 deletions library/Icinga/Web/JavaScript.php
Expand Up @@ -21,6 +21,7 @@ class JavaScript
'js/icinga/events.js',
'js/icinga/history.js',
'js/icinga/module.js',
'js/icinga/timezone.js',
);

protected static $vendorFiles = array(
Expand Down
19 changes: 11 additions & 8 deletions public/js/icinga.js
Expand Up @@ -82,14 +82,16 @@
return false;
}

this.utils = new Icinga.Utils(this);
this.logger = new Icinga.Logger(this);
this.timer = new Icinga.Timer(this);
this.ui = new Icinga.UI(this);
this.loader = new Icinga.Loader(this);
this.events = new Icinga.Events(this);
this.history = new Icinga.History(this);

this.timezone = new Icinga.Timezone();
this.utils = new Icinga.Utils(this);
this.logger = new Icinga.Logger(this);
this.timer = new Icinga.Timer(this);
this.ui = new Icinga.UI(this);
this.loader = new Icinga.Loader(this);
this.events = new Icinga.Events(this);
this.history = new Icinga.History(this);

this.timezone.initialize();
this.timer.initialize();
this.events.initialize();
this.history.initialize();
Expand Down Expand Up @@ -147,6 +149,7 @@
module.destroy();
});

this.timezone.destroy();
this.timer.destroy();
this.events.destroy();
this.loader.destroy();
Expand Down
117 changes: 117 additions & 0 deletions public/js/icinga/timezone.js
@@ -0,0 +1,117 @@
(function(Icinga, $) {

'use strict';

/**
* Get the maximum timezone offset
*
* @returns {Number}
*/
Date.prototype.getStdTimezoneOffset = function() {
if (Date.maxTimezoneOffset !== undefined) {
return Date.maxTimezoneOffset;
}

var year = new Date().getYear();
var previousOffset;

for (var i=0; i<12; i++) {
var d = new Date(year, i, 1);
if (previousOffset !== undefined) {
previousOffset = Math.max(previousOffset, d.getTimezoneOffset());
} else {
previousOffset = d.getTimezoneOffset();
}
}

Date.maxTimezoneOffset = previousOffset;

return Date.maxTimezoneOffset;
};

/**
* Test for daylight saving time zone
*
* @returns {boolean}
*/
Date.prototype.isDst = function() {
return (this.getStdTimezoneOffset() === this.getTimezoneOffset()) ? false : true;
};

/**
* Write timezone information into a cookie
*
* @constructor
*/
Icinga.Timezone = function() {
this.cookieName = 'icingaweb2-tzo';
};

Icinga.Timezone.prototype = {
/**
* Initialize interface method
*/
initialize: function () {
this.writeTimezone();
},

destroy: function() {
// PASS
},

/**
* Write timezone information into cookie
*/
writeTimezone: function() {
var date = new Date();
var timezoneOffset = (date.getTimezoneOffset()*60) * -1;
var dst = date.isDst();

if (this.readCookie(this.cookieName)) {
return;
}

this.writeCookie(this.cookieName, timezoneOffset + ',' + dst);
},

/**
* Write cookie data
*
* @param {String} name
* @param {String} value
* @param {Number} days
*/
writeCookie: function(name, value, days) {
var expires = '';

if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = '; expires=' + date.toGMTString();
}
document.cookie = name + '=' + value + expires + '; path=/';
},

/**
* Read cookie data
*
* @param {String} name
* @returns {*}
*/
readCookie: function(name) {
var nameEq = name + '=';
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') {
c = c.substring(1,c.length);
}
if (c.indexOf(nameEq) == 0) {
return c.substring(nameEq.length,c.length);
}
}
return null;
}
};

})(Icinga, jQuery);

0 comments on commit 3ce4248

Please sign in to comment.