/* * 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 += "
"; 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; }