/*
* Copyright (c) 2008 Orbis Technology Ltd. All rights reserved.
*/
__tzone_id = '';
/*******************************************************************************
* TimeZone Utilities
******************************************************************************/
function TimeZone()
{
this._init();
}
// one time init
TimeZone.prototype._init = function()
{
};
//Populate time zone list for customer to choose from.
function populateTzoneList (req) {
if (typeof(req.responseText) == 'undefined' || req.responseText == null || req.responseText == "") {
return;
}
var data = eval('(' + req.responseText + ')');
if (data.timezones.length == 0 || (data.timezones.length == 1 && data.timezones[0].zone_id == document.TimeZone.def_id)) {
// if we've got no timezones back from the server, we'll just set the default (zone_id = 1). If we've got
// a timezone back we'll set that automatically for the user rather than given them the option
var new_zone_id = data.timezones.length == 0 ? 1 : data.timezones[0].zone_id;
var setTZone = $(document.createElement('form'));
$('').attr('type','hidden')
.attr('name','def_time_zone')
.attr('value',new_zone_id)
.appendTo(setTZone);
$('').attr('type','hidden')
.attr('name','action')
.attr('value','SetCustTZone')
.appendTo(setTZone);
setTZone.submit();
return true;
}
var time_zone_msg = data.timezone_opt_msg;
var time_zone_all_msg = data.timezone_all_msg;
var tzone_list = time_zone_msg + "
";
tzone_list += "" + time_zone_all_msg + "";
showPopUp(tzone_list,4,"changeTimeZone");
}
//Submit the form to change timezone
function changeTimeZone (resp) {
//If cancel button is pressed then set it to default
if (resp == -1) {
document.getElementById('def_time_zone').value = '1';
}
var form = document.getElementById('setTZone');
form.submit();
return true;
}
//Make an ajax call to get complete list of timezones
function showAllTimeZones () {
var postData = "action=GoTimeZoneList";
HttpRequest(document.cgi_url, 'POST', function(req) { updateTzoneList(req); }, postData, true);
}
//Update customer offset timezone list with complete timezone list
function updateTzoneList (req) {
var data = eval('(' + req.responseText + ')');
var time_zone = "";
for (var i = 0; i < data.timezones.length; i++) {
time_zone = time_zone + "";
}
$('#time_zone').html(time_zone);
}
//Display option box for customer to choose his timezone
function dispTZoneOpt ()
{
var d = new Date();
var gmtHours = -d.getTimezoneOffset() * 60;
var stdDate = new Date(Date.UTC(d.getFullYear(),12,30,0,0,0,0));
var stdOffset = -stdDate.getTimezoneOffset() * 60;
var dstDate = new Date(Date.UTC(d.getFullYear(),6,30,0,0,0,0));
var dstOffset = -dstDate.getTimezoneOffset() * 60;
var postData = "action=GoTimeZoneList&stdOffset=" + stdOffset + "&dstOffset=" + dstOffset;
var url = document.cgi_url;
HttpRequest(url, 'POST', function(req) { populateTzoneList(req); }, postData, true);
}
//Bind timezone object on startup
function bindTZones (defaultZone, custZone, tzone_long_month_xls, tzone_short_month_xls)
{
document.TimeZone = new TimeZone();
var def_zone = defaultZone.split(",");
var cust_zone = custZone.split(",");
document.TimeZone.def_id = def_zone[0];
document.TimeZone.def_name = def_zone[1];
document.TimeZone.def_standard_code = def_zone[2];
document.TimeZone.def_standard_offset = def_zone[3];
document.TimeZone.def_dst_code = def_zone[4];
document.TimeZone.def_dst_offset = def_zone[5];
document.TimeZone.def_status = def_zone[6];
document.TimeZone.def_dst_start_timestamp = def_zone[8];
document.TimeZone.def_dst_end_timestamp = def_zone[9];
document.TimeZone.def_xl_std_code = def_zone[10];
document.TimeZone.def_xl_dst_code = def_zone[11];
document.TimeZone.id = cust_zone[0];
document.TimeZone.name = cust_zone[1];
document.TimeZone.standard_code = cust_zone[2];
document.TimeZone.standard_offset = cust_zone[3];
document.TimeZone.dst_code = cust_zone[4];
document.TimeZone.dst_offset = cust_zone[5];
document.TimeZone.status = cust_zone[6];
document.TimeZone.dst_start_timestamp = cust_zone[8];
document.TimeZone.dst_end_timestamp = cust_zone[9];
document.TimeZone.xl_std_code = cust_zone[10];
document.TimeZone.xl_dst_code = cust_zone[11];
document.TimeZone.long_month_xls_array = tzone_long_month_xls.split(", ");
document.TimeZone.short_month_xls_array = tzone_short_month_xls.split(", ");
}
//Returns a requested value from TimeZone list
function getTZoneValue (tZoneItem)
{
return document.TimeZone[tZoneItem];
}
//Returns cust specific or default object value
function toCustTZone (inpDate)
{
try {
var inpSec = inpDate.getTime() / 1000;
} catch (e) {
inpDate = formatDate(inpDate, 'toJSObj');
var inpSec = inpDate.getTime() / 1000;
}
// passes DB times
var retSec = toCustomerZone(0, inpSec, 0);
inpDate.setTime(retSec * 1000);
var year = inpDate.getFullYear();
var mon = inpDate.getMonth();
var day = inpDate.getDate();
var hour = inpDate.getHours();
var min = inpDate.getMinutes();
var sec = inpDate.getSeconds();
var ms = inpDate.getMilliseconds();
var outputDate = new Date(year, mon, day, hour, min, sec, ms);
return outputDate;
}
//Converts a date from informix format to JS date object or vice versa
function formatDate(inpDate, format)
{
if (format == "toJSObj") {
//Convert from informix format to JS date object
var arrDate = inpDate.split(" ");
var subDate = arrDate[0].split("-");
var subTime = arrDate[1].split(":");
var objDate = new Date(subDate[0], subDate[1], subDate[2], subTime[0], subTime[1], subTime[2]);
return objDate;
} else {
//convert from JS date object to informix format
var mon = inpDate.getUTCMonth();
var day = inpDate.getUTCDate();
var hour = inpDate.getUTCHours();
var min = inpDate.getUTCMinutes();
var sec = inpDate.getUTCSeconds();
//Add leading 0 if any of following is single digit
if(mon<10) mon = "0"+mon;
if(day<10) day = "0"+day;
if(hour<10) hour = "0"+hour;
if(min<10) min = "0"+min;
if(sec<10) sec = "0"+sec;
var retDate = inpDate.getFullYear() + "-" + mon + "-" + day;
retDate += " " + hour + ":" + min + ":" + sec;
return retDate;
}
}
//Returns user timezone code (DST or UTC) based on customer browser's date
function getCustTzoneCode (inpDate)
{
if (document.TimeZone.dst_end_date == "") {
return document.TimeZone.standard_code
}
try {
inpDate.getTime();
} catch (e) {
inpDate = formatDate(inpDate, 'toJSObj');
}
var dst_start_date = formatDate(document.TimeZone.dst_start_date, 'toJSObj');
var dst_end_date = formatDate(document.TimeZone.dst_end_date, 'toJSObj');
if (inpDate > dst_start_date && inpDate < dst_end_date) {
return document.TimeZone.dst_code
} else {
return document.TimeZone.standard_code
}
}
//Returns user timezone offset (DST or UTC) based on customer browser's date
function getCustTzoneOffset (inpDate)
{
if (document.TimeZone.dst_end_date == "") {
return document.TimeZone.standard_offset
}
try {
inpDate.getTime();
} catch (e) {
inpDate = formatDate(inpDate, 'toJSObj');
}
var dst_start_date = formatDate(document.TimeZone.dst_start_date, 'toJSObj');
var dst_end_date = formatDate(document.TimeZone.dst_end_date, 'toJSObj');
if (inpDate > dst_start_date && inpDate < dst_end_date) {
return document.TimeZone.dst_offset
} else {
return document.TimeZone.standard_offset
}
}
//Convert the given dates/times to customer timezone date/times.
function convertSpanTimes ()
{
if ( typeof(document.TimeZone) == 'undefined' || document.TimeZone == null) {
return;
}
//Don't replace span content if cust timezone is same as default.
if (document.TimeZone.def_name == document.TimeZone.name) {
return 1;
}
var spans = document.getElementsByTagName("span");
for( var i = 0; i < spans.length; i++ ) {
var element = spans[i];
//work only on spans with ids
if (element.attributes["id"]) {
//eg "tzTime:br:1301064075:br:dd-MM-yyyy_hh:mm:ss_bCB:br:1"
var spanId = element.id;
var spanIdArray = spanId.split(":br:");
var spanUsedFor = spanIdArray[0];
//Do any manipulation only if the span is used for timezone conversion
if (spanUsedFor == "tzTime") {
var timeStamp = spanIdArray[1];
var formatToUse = spanIdArray[2];
var converted_time_stamp = toCustomerZone(1, timeStamp);
// do not update time if it is same as default timezone timestamp
if (timeStamp != converted_time_stamp[0]) {
element.innerHTML = toFormat(converted_time_stamp, formatToUse);
}
}
}
}
}
//convert to customer's timezone
function toCustomerZone(isUTC, inpSec, timeZoneCode)
{
// Set timeZoneCode parameter if not provided
timeZoneCode = typeof(timeZoneCode) != 'undefined' ? timeZoneCode : 1;
zoneCode = "";
offset = 0;
if ( typeof(document.TimeZone) != 'undefined' || document.TimeZone != null) {
// customer timezone DST times (might be NaN)
var dst_start_timestamp = getTZoneValue("dst_start_timestamp");
var dst_end_timestamp = getTZoneValue("dst_end_timestamp");
var dst_offset = getTZoneValue("dst_offset");
var def_dst_start_timestamp = getTZoneValue("def_dst_start_timestamp");
var def_dst_end_timestamp = getTZoneValue("def_dst_end_timestamp");
var def_standard_offset = getTZoneValue("def_standard_offset");
var def_dst_offset = getTZoneValue("def_dst_offset");
if (typeof(def_dst_offset) == 'undefined' || def_dst_offset == "") {
def_dst_offset = 0;
}
if (typeof(def_standard_offset) == 'undefined' || def_standard_offset == "") {
def_standard_offset = 0;
}
if (typeof(dst_offset) == 'undefined' || dst_offset == "") {
dst_offset = 0;
}
// take default offsets for customer timezone before checking for DST
offset = getTZoneValue("standard_offset");
zoneCode = getTZoneValue("xl_std_code");
// are we in DST in customer zone? Use that zone DST offset instead
if (typeof(dst_start_timestamp) != 'undefined' && dst_start_timestamp != "" &&
typeof(dst_end_timestamp) != 'undefined' && dst_end_timestamp != "" &&
((dst_start_timestamp < dst_end_timestamp &&
inpSec > dst_start_timestamp && inpSec < dst_end_timestamp) ||
(dst_start_timestamp > dst_end_timestamp &&
(inpSec > dst_start_timestamp || inpSec < dst_end_timestamp)))) {
// new offset comes from DST customer zon
offset = dst_offset;
zoneCode = getTZoneValue("xl_dst_code");
}
if (!isUTC) {
// if not passing UTC time, we need to adjust offset by server DST offset
if (typeof(def_dst_start_timestamp) != 'undefined' && def_dst_start_timestamp != "" &&
typeof(def_dst_end_timestamp) != 'undefined' && def_dst_end_timestamp != "" &&
((def_dst_start_timestamp < def_dst_end_timestamp &&
inpSec > def_dst_start_timestamp && inpSec < def_dst_end_timestamp) ||
(def_dst_start_timestamp > def_dst_end_timestamp &&
(inpSec > def_dst_start_timestamp || inpSec < def_dst_end_timestamp)))) {
offset -= def_dst_offset;
} else {
// not in DST, use a default standard offset (for standard=GMT will be always 0)
offset -= def_standard_offset;
}
}
// offset is + or -
inpSec = parseInt(inpSec) + parseInt(offset);
}
if (timeZoneCode) {
return [inpSec,zoneCode];
} else {
return inpSec;
}
}
//given an input time in ms and a format, returns a date object in needed format
function toFormat(timeStamp, format)
{
//input has to be in msec to create date object
var date = new Date(timeStamp[0] * 1000);
var tzone_code = timeStamp[1];
format = format+"";
var result = "";
var i_format = 0;
var ch = "";
var token = "";
var y = date.getUTCFullYear()+"";
var M = date.getUTCMonth()+1;
var d = date.getUTCDate();
var E = date.getUTCDay();
var H = date.getUTCHours();
var m = date.getUTCMinutes();
var s = date.getUTCSeconds();
var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
var xl_long_months = document.TimeZone.long_month_xls_array;
var xl_short_months = document.TimeZone.short_month_xls_array;
//Object to hold return values
var value = new Object();
if (y.length < 4) {
y = "" + (y-0+1900);
}
value["y"] = "" + y;
value["yyyy"] = y;
value["yy"] = y.substring(2,4);
value["MM"] = makeTwoDigit(M);
value["MMMM"] = xl_long_months[M-1];
value["MMM"] = xl_short_months[M-1];
value["d"] = d;
value["dd"] = makeTwoDigit(d);
value["HH"] = makeTwoDigit(H);
if (H == 0) {
value["h"] = 12;
} else if (H > 12) {
value["h"] = H-12;
} else {
value["h"] = H;
}
value["hh"] = makeTwoDigit(value["h"]);
if (H > 11) {
value["K"] = H-12;
} else {
value["K"] = H;
}
value["k"] = H+1;
value["KK"] = makeTwoDigit(value["K"]);
value["kk"] = makeTwoDigit(value["k"]);
if (H > 11) {
value["a"] = "PM";
} else {
value["a"] = "AM";
}
value["mm"] = makeTwoDigit(m);
value["ss"] = makeTwoDigit(s);
value["b"] = "(";
value["C"] = tzone_code;
value["B"] = ")";
value["c"] = ",";
value["_"] = " ";
while (i_format < format.length) {
ch = format.charAt(i_format);
token = "";
while ((format.charAt(i_format) == ch) && (i_format < format.length)) {
token += format.charAt(i_format++);
}
if (value[token] != null) {
result = result + value[token];
} else {
result = result + token;
}
}
return result;
}
// If input is single digit, make is 2 digit by appending a 0 in front
function makeTwoDigit(x)
{
return ((x >= 0 && x <= 9) ? "0" : "") + x;
}