1/** 2 * This script gives you the zone info key representing your device's time zone setting. 3 * 4 * @name jsTimezoneDetect 5 * @version 1.0.5 6 * @author Jon Nylander 7 * @license MIT License - http://www.opensource.org/licenses/mit-license.php 8 * 9 * For usage and examples, visit: 10 * http://pellepim.bitbucket.org/jstz/ 11 * 12 * Copyright (c) Jon Nylander 13 */ 14 15/*jslint undef: true */ 16/*global console, exports*/ 17 18(function(root) { 19 /** 20 * Namespace to hold all the code for timezone detection. 21 */ 22 var jstz = (function () { 23 'use strict'; 24 var HEMISPHERE_SOUTH = 's', 25 26 /** 27 * Gets the offset in minutes from UTC for a certain date. 28 * @param {Date} date 29 * @returns {Number} 30 */ 31 get_date_offset = function (date) { 32 var offset = -date.getTimezoneOffset(); 33 return (offset !== null ? offset : 0); 34 }, 35 36 get_date = function (year, month, date) { 37 var d = new Date(); 38 if (year !== undefined) { 39 d.setFullYear(year); 40 } 41 d.setMonth(month); 42 d.setDate(date); 43 return d; 44 }, 45 46 get_january_offset = function (year) { 47 return get_date_offset(get_date(year, 0 ,2)); 48 }, 49 50 get_june_offset = function (year) { 51 return get_date_offset(get_date(year, 5, 2)); 52 }, 53 54 /** 55 * Private method. 56 * Checks whether a given date is in daylight saving time. 57 * If the date supplied is after august, we assume that we're checking 58 * for southern hemisphere DST. 59 * @param {Date} date 60 * @returns {Boolean} 61 */ 62 date_is_dst = function (date) { 63 var is_southern = date.getMonth() > 7, 64 base_offset = is_southern ? get_june_offset(date.getFullYear()) : 65 get_january_offset(date.getFullYear()), 66 date_offset = get_date_offset(date), 67 is_west = base_offset < 0, 68 dst_offset = base_offset - date_offset; 69 70 if (!is_west && !is_southern) { 71 return dst_offset < 0; 72 } 73 74 return dst_offset !== 0; 75 }, 76 77 /** 78 * This function does some basic calculations to create information about 79 * the user's timezone. It uses REFERENCE_YEAR as a solid year for which 80 * the script has been tested rather than depend on the year set by the 81 * client device. 82 * 83 * Returns a key that can be used to do lookups in jstz.olson.timezones. 84 * eg: "720,1,2". 85 * 86 * @returns {String} 87 */ 88 89 lookup_key = function () { 90 var january_offset = get_january_offset(), 91 june_offset = get_june_offset(), 92 diff = january_offset - june_offset; 93 94 if (diff < 0) { 95 return january_offset + ",1"; 96 } else if (diff > 0) { 97 return june_offset + ",1," + HEMISPHERE_SOUTH; 98 } 99 100 return january_offset + ",0"; 101 }, 102 103 /** 104 * Uses get_timezone_info() to formulate a key to use in the olson.timezones dictionary. 105 * 106 * Returns a primitive object on the format: 107 * {'timezone': TimeZone, 'key' : 'the key used to find the TimeZone object'} 108 * 109 * @returns Object 110 */ 111 determine = function () { 112 var key = lookup_key(); 113 return new jstz.TimeZone(jstz.olson.timezones[key]); 114 }, 115 116 /**
117 * This object contains information on when daylight savings starts for 118 * different timezones. 119 * 120 * The list is short for a reason. Often we do not have to be very specific 121 * to single out the correct timezone. But when we do, this list comes in 122 * handy. 123 * 124 * Each value is a date denoting when daylight savings starts for that timezone. 125 */ 126 dst_start_for = function (tz_name) { 127 128 var ru_pre_dst_change = new Date(2010, 6, 15, 1, 0, 0, 0), // In 2010 Russia had DST, this allows us to detect Russia :) 129 dst_starts = { 130 'America/Denver': new Date(2011, 2, 13, 3, 0, 0, 0), 131 'America/Mazatlan': new Date(2011, 3, 3, 3, 0, 0, 0), 132 'America/Chicago': new Date(2011, 2, 13, 3, 0, 0, 0), 133 'America/Mexico_City': new Date(2011, 3, 3, 3, 0, 0, 0), 134 'America/Asuncion': new Date(2012, 9, 7, 3, 0, 0, 0), 135 'America/Santiago': new Date(2012, 9, 3, 3, 0, 0, 0), 136 'America/Campo_Grande': new Date(2012, 9, 21, 5, 0, 0, 0), 137 'America/Montevideo': new Date(2011, 9, 2, 3, 0, 0, 0), 138 'America/Sao_Paulo': new Date(2011, 9, 16, 5, 0, 0, 0), 139 'America/Los_Angeles': new Date(2011, 2, 13, 8, 0, 0, 0), 140 'America/Santa_Isabel': new Date(2011, 3, 5, 8, 0, 0, 0), 141 'America/Havana': new Date(2012, 2, 10, 2, 0, 0, 0), 142 'America/New_York': new Date(2012, 2, 10, 7, 0, 0, 0), 143 'Europe/Helsinki': new Date(2013, 2, 31, 5, 0, 0, 0), 144 'Pacific/Auckland': new Date(2011, 8, 26, 7, 0, 0, 0), 145 'America/Halifax': new Date(2011, 2, 13, 6, 0, 0, 0), 146 'America/Goose_Bay': new Date(2011, 2, 13, 2, 1, 0, 0), 147 'America/Miquelon': new Date(2011, 2, 13, 5, 0, 0, 0), 148 'America/Godthab': new Date(2011, 2, 27, 1, 0, 0, 0), 149 'Europe/Moscow': ru_pre_dst_change, 150 'Asia/Amman': new Date(2013, 2, 29, 1, 0, 0, 0), 151 'Asia/Beirut': new Date(2013, 2, 31, 2, 0, 0, 0), 152 'Asia/Damascus': new Date(2013, 3, 6, 2, 0, 0, 0), 153 'Asia/Jerusalem': new Date(2013, 2, 29, 5, 0, 0, 0), 154 'Asia/Yekaterinburg': ru_pre_dst_change, 155 'Asia/Omsk': ru_pre_dst_change, 156 'Asia/Krasnoyarsk': ru_pre_dst_change, 157 'Asia/Irkutsk': ru_pre_dst_change, 158 'Asia/Yakutsk': ru_pre_dst_change, 159 'Asia/Vladivostok': ru_pre_dst_change, 160 'Asia/Baku': new Date(2013, 2, 31, 4, 0, 0), 161 'Asia/Yerevan': new Date(2013, 2, 31, 3, 0, 0), 162 'Asia/Kamchatka': ru_pre_dst_change, 163 'Asia/Gaza': new Date(2010, 2, 27, 4, 0, 0), 164 'Africa/Cairo': new Date(2010, 4, 1, 3, 0, 0), 165 'Europe/Minsk': ru_pre_dst_change, 166 'Pacific/Apia': new Date(2010, 10, 1, 1, 0, 0, 0), 167 'Pacific/Fiji': new Date(2010, 11, 1, 0, 0, 0), 168 'Australia/Perth': new Date(2008, 10, 1, 1, 0, 0, 0) 169 }; 170 171 return dst_starts[tz_name]; 172 }; 173 174 return { 175 determine: determine, 176 date_is_dst: date_is_dst, 177 dst_start_for: dst_start_for 178 }; 179 }()); 180 181 /** 182 * Simple object to perform ambiguity check and to return name of time zone. 183 */ 184 jstz.TimeZone = function (tz_name) { 185 'use strict'; 186 /** 187 * The keys in this object are timezones that we know may be ambiguous after 188 * a preliminary scan through the olson_tz object. 189 * 190 * The array of timezones to compare must be in the order that daylight savings 191 * starts for the regions. 192 */ 193 var AMBIGUITIES = { 194 'America/Denver': ['America/Denver', 'America/Mazatlan'], 195 'America/Chicago': ['America/Chicago', 'America/Mexico_City'], 196 'America/Santiago': ['America/Santiago', 'America/Asuncion', 'America/Campo_Grande'], 197 'America/Montevideo': ['America/Montevideo', 'America/Sao_Paulo'], 198 'Asia/Beirut': ['Asia/Amman', 'Asia/Jerusalem', 'Asia/Beirut', 'Europe/Helsinki','Asia/Damascus'], 199 'Pacific/Auckland': ['Pacific/Auckland', 'Pacific/Fiji'], 200 'America/Los_Angeles': ['America/Los_Angeles', 'America/Santa_Isabel'],
201 'America/New_York': ['America/Havana', 'America/New_York'], 202 'America/Halifax': ['America/Goose_Bay', 'America/Halifax'], 203 'America/Godthab': ['America/Miquelon', 'America/Godthab'], 204 'Asia/Dubai': ['Europe/Moscow'], 205 'Asia/Dhaka': ['Asia/Yekaterinburg'], 206 'Asia/Jakarta': ['Asia/Omsk'], 207 'Asia/Shanghai': ['Asia/Krasnoyarsk', 'Australia/Perth'], 208 'Asia/Tokyo': ['Asia/Irkutsk'], 209 'Australia/Brisbane': ['Asia/Yakutsk'], 210 'Pacific/Noumea': ['Asia/Vladivostok'], 211 'Pacific/Tarawa': ['Asia/Kamchatka', 'Pacific/Fiji'], 212 'Pacific/Tongatapu': ['Pacific/Apia'], 213 'Asia/Baghdad': ['Europe/Minsk'], 214 'Asia/Baku': ['Asia/Yerevan','Asia/Baku'], 215 'Africa/Johannesburg': ['Asia/Gaza', 'Africa/Cairo'] 216 }, 217 218 timezone_name = tz_name, 219 220 /** 221 * Checks if a timezone has possible ambiguities. I.e timezones that are similar. 222 * 223 * For example, if the preliminary scan determines that we're in America/Denver. 224 * We double check here that we're really there and not in America/Mazatlan. 225 * 226 * This is done by checking known dates for when daylight savings start for different 227 * timezones during 2010 and 2011. 228 */ 229 ambiguity_check = function () { 230 var ambiguity_list = AMBIGUITIES[timezone_name], 231 length = ambiguity_list.length, 232 i = 0, 233 tz = ambiguity_list[0]; 234 235 for (; i < length; i += 1) { 236 tz = ambiguity_list[i]; 237 238 if (jstz.date_is_dst(jstz.dst_start_for(tz))) { 239 timezone_name = tz; 240 return; 241 } 242 } 243 }, 244 245 /** 246 * Checks if it is possible that the timezone is ambiguous. 247 */ 248 is_ambiguous = function () { 249 return typeof (AMBIGUITIES[timezone_name]) !== 'undefined'; 250 }; 251 252 if (is_ambiguous()) { 253 ambiguity_check(); 254 } 255 256 return { 257 name: function () { 258 return timezone_name; 259 } 260 }; 261 }; 262 263 jstz.olson = {}; 264 265 /* 266 * The keys in this dictionary are comma separated as such: 267 * 268 * First the offset compared to UTC time in minutes. 269 * 270 * Then a flag which is 0 if the timezone does not take daylight savings into account and 1 if it 271 * does. 272 * 273 * Thirdly an optional 's' signifies that the timezone is in the southern hemisphere, 274 * only interesting for timezones with DST. 275 * 276 * The mapped arrays is used for constructing the jstz.TimeZone object from within 277 * jstz.determine_timezone(); 278 */ 279 jstz.olson.timezones = { 280 '-720,0' : 'Pacific/Majuro', 281 '-660,0' : 'Pacific/Pago_Pago', 282 '-600,1' : 'America/Adak', 283 '-600,0' : 'Pacific/Honolulu', 284 '-570,0' : 'Pacific/Marquesas', 285 '-540,0' : 'Pacific/Gambier', 286 '-540,1' : 'America/Anchorage', 287 '-480,1' : 'America/Los_Angeles', 288 '-480,0' : 'Pacific/Pitcairn', 289 '-420,0' : 'America/Phoenix', 290 '-420,1' : 'America/Denver', 291 '-360,0' : 'America/Guatemala', 292 '-360,1' : 'America/Chicago', 293 '-360,1,s' : 'Pacific/Easter', 294 '-300,0' : 'America/Bogota', 295 '-300,1' : 'America/New_York', 296 '-270,0' : 'America/Caracas', 297 '-240,1' : 'America/Halifax', 298 '-240,0' : 'America/Santo_Domingo', 299 '-240,1,s' : 'America/Santiago', 300 '-210,1' : 'America/St_Johns', 301 '-180,1' : 'America/Godthab', 302 '-180,0' : 'America/Argentina/Buenos_Aires', 303 '-180,1,s' : 'America/Montevideo', 304 '-120,0' : 'America/Noronha', 305 '-120,1' : 'America/Noronha',
306 '-60,1' : 'Atlantic/Azores', 307 '-60,0' : 'Atlantic/Cape_Verde', 308 '0,0' : 'UTC', 309 '0,1' : 'Europe/London', 310 '60,1' : 'Europe/Berlin', 311 '60,0' : 'Africa/Lagos', 312 '60,1,s' : 'Africa/Windhoek', 313 '120,1' : 'Asia/Beirut', 314 '120,0' : 'Africa/Johannesburg', 315 '180,0' : 'Asia/Baghdad', 316 '180,1' : 'Europe/Moscow', 317 '210,1' : 'Asia/Tehran', 318 '240,0' : 'Asia/Dubai', 319 '240,1' : 'Asia/Baku', 320 '270,0' : 'Asia/Kabul', 321 '300,1' : 'Asia/Yekaterinburg', 322 '300,0' : 'Asia/Karachi', 323 '330,0' : 'Asia/Kolkata', 324 '345,0' : 'Asia/Kathmandu', 325 '360,0' : 'Asia/Dhaka', 326 '360,1' : 'Asia/Omsk', 327 '390,0' : 'Asia/Rangoon', 328 '420,1' : 'Asia/Krasnoyarsk', 329 '420,0' : 'Asia/Jakarta', 330 '480,0' : 'Asia/Shanghai', 331 '480,1' : 'Asia/Irkutsk', 332 '525,0' : 'Australia/Eucla', 333 '525,1,s' : 'Australia/Eucla', 334 '540,1' : 'Asia/Yakutsk', 335 '540,0' : 'Asia/Tokyo', 336 '570,0' : 'Australia/Darwin', 337 '570,1,s' : 'Australia/Adelaide', 338 '600,0' : 'Australia/Brisbane', 339 '600,1' : 'Asia/Vladivostok', 340 '600,1,s' : 'Australia/Sydney', 341 '630,1,s' : 'Australia/Lord_Howe', 342 '660,1' : 'Asia/Kamchatka', 343 '660,0' : 'Pacific/Noumea', 344 '690,0' : 'Pacific/Norfolk', 345 '720,1,s' : 'Pacific/Auckland', 346 '720,0' : 'Pacific/Tarawa', 347 '765,1,s' : 'Pacific/Chatham', 348 '780,0' : 'Pacific/Tongatapu', 349 '780,1,s' : 'Pacific/Apia', 350 '840,0' : 'Pacific/Kiritimati' 351 }; 352 353 if (typeof exports !== 'undefined') { 354 exports.jstz = jstz; 355 } else { 356 root.jstz = jstz; 357 } 358})(this);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.