(function(){var root=this;var timezoneJS;if(typeof exports!=="undefined"){timezoneJS=exports}else{timezoneJS=root.timezoneJS={}}timezoneJS.VERSION="1.0.0";var $=root.$||root.jQuery||root.Zepto,fleegix=root.fleegix,DAYS=timezoneJS.Days=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],MONTHS=timezoneJS.Months=["January","February","March","April","May","June","July","August","September","October","November","December"],SHORT_MONTHS={},SHORT_DAYS={},EXACT_DATE_TIME={},TZ_REGEXP=new RegExp("^[a-zA-Z]+/");for(var i=0;idigits){return number.substr(number.length-digits,number.length)}while(s.length3){return timezoneJS.Months[_month]}else{if(_len>2){return timezoneJS.Months[_month].substring(0,_len)}}return _fixWidth(_month+1,_len)}).replace(/k+/g,function(){if(hours>=12){if(hours>12){hours-=12}return"PM"}return"AM"}).replace(/H+/g,function(token){return _fixWidth(hours,token.length)}).replace(/E+/g,function(token){return DAYS[_this.getDay()].substring(0,token.length)}).replace(/Z+/gi,function(){return tzInfo.tzAbbr})},toUTCString:function(){return this.toGMTString()},civilToJulianDayNumber:function(y,m,d){var a;m++;if(m>12){a=parseInt(m/12,10);m=m%12;y+=a}if(m<=2){y-=1;m+=12}a=Math.floor(y/100);var b=2-a+Math.floor(a/4),jDt=Math.floor(365.25*(y+4716))+Math.floor(30.6001*(m+1))+d+b-1524;return jDt},getLocalOffset:function(){return this._dateProxy.getTimezoneOffset()}};timezoneJS.timezone=new function(){var _this=this,regionMap={Etc:"etcetera",EST:"northamerica",MST:"northamerica",HST:"northamerica",EST5EDT:"northamerica",CST6CDT:"northamerica",MST7MDT:"northamerica",PST8PDT:"northamerica",America:"northamerica",Pacific:"australasia",Atlantic:"europe",Africa:"africa",Indian:"africa",Antarctica:"antarctica",Asia:"asia",Australia:"australasia",Europe:"europe",WET:"europe",CET:"europe",MET:"europe",EET:"europe"},regionExceptions={"Pacific/Honolulu":"northamerica","Atlantic/Bermuda":"northamerica","Atlantic/Cape_Verde":"africa","Atlantic/St_Helena":"africa","Indian/Kerguelen":"antarctica","Indian/Chagos":"asia","Indian/Maldives":"asia","Indian/Christmas":"australasia","Indian/Cocos":"australasia","America/Danmarkshavn":"europe","America/Scoresbysund":"europe","America/Godthab":"europe","America/Thule":"europe","Asia/Yekaterinburg":"europe","Asia/Omsk":"europe","Asia/Novosibirsk":"europe","Asia/Krasnoyarsk":"europe","Asia/Irkutsk":"europe","Asia/Yakutsk":"europe","Asia/Vladivostok":"europe","Asia/Sakhalin":"europe","Asia/Magadan":"europe","Asia/Kamchatka":"europe","Asia/Anadyr":"europe","Africa/Ceuta":"europe","America/Argentina/Buenos_Aires":"southamerica","America/Argentina/Cordoba":"southamerica","America/Argentina/Tucuman":"southamerica","America/Argentina/La_Rioja":"southamerica","America/Argentina/San_Juan":"southamerica","America/Argentina/Jujuy":"southamerica","America/Argentina/Catamarca":"southamerica","America/Argentina/Mendoza":"southamerica","America/Argentina/Rio_Gallegos":"southamerica","America/Argentina/Ushuaia":"southamerica","America/Aruba":"southamerica","America/La_Paz":"southamerica","America/Noronha":"southamerica","America/Belem":"southamerica","America/Fortaleza":"southamerica","America/Recife":"southamerica","America/Araguaina":"southamerica","America/Maceio":"southamerica","America/Bahia":"southamerica","America/Sao_Paulo":"southamerica","America/Campo_Grande":"southamerica","America/Cuiaba":"southamerica","America/Porto_Velho":"southamerica","America/Boa_Vista":"southamerica","America/Manaus":"southamerica","America/Eirunepe":"southamerica","America/Rio_Branco":"southamerica","America/Santiago":"southamerica","Pacific/Easter":"southamerica","America/Bogota":"southamerica","America/Curacao":"southamerica","America/Guayaquil":"southamerica","Pacific/Galapagos":"southamerica","Atlantic/Stanley":"southamerica","America/Cayenne":"southamerica","America/Guyana":"southamerica","America/Asuncion":"southamerica","America/Lima":"southamerica","Atlantic/South_Georgia":"southamerica","America/Paramaribo":"southamerica","America/Port_of_Spain":"southamerica","America/Montevideo":"southamerica","America/Caracas":"southamerica"};function invalidTZError(t){throw new Error('Timezone "'+t+'" is either incorrect, or not loaded in the timezone registry.')}function builtInLoadZoneFile(fileName,opts){var url=_this.zoneFileBasePath+"/"+fileName;return !opts||!opts.async?_this.parseZones(_this.transport({url:url,async:false})):_this.transport({async:true,url:url,success:function(str){if(_this.parseZones(str)&&typeof opts.callback==="function"){opts.callback()}return true},error:function(){throw new Error('Error retrieving "'+url+'" zoneinfo files')}})}function getRegionForTimezone(tz){var exc=regionExceptions[tz],reg,ret;if(exc){return exc}reg=tz.split("/")[0];ret=regionMap[reg];if(ret){return ret}var link=_this.zones[tz];if(typeof link==="string"){return getRegionForTimezone(link)}if(!_this.loadedZones.backward){_this.loadZoneFile("backward");return getRegionForTimezone(tz)}invalidTZError(tz)}function parseTimeString(str){var pat=/(\d+)(?::0*(\d*))?(?::0*(\d*))?([wsugz])?$/;var hms=str.match(pat);hms[1]=parseInt(hms[1],10);hms[2]=hms[2]?parseInt(hms[2],10):0;hms[3]=hms[3]?parseInt(hms[3],10):0;return hms}function processZone(z){if(!z[3]){return}var yea=parseInt(z[3],10);var mon=11;var dat=31;if(z[4]){mon=SHORT_MONTHS[z[4].substr(0,3)];dat=parseInt(z[5],10)||1}var string=z[6]?z[6]:"00:00:00",t=parseTimeString(string);return[yea,mon,dat,t[1],t[2],t[3]]}function getZone(dt,tz){var utcMillis=typeof dt==="number"?dt:new Date(dt).getTime();var t=tz;var zoneList=_this.zones[t];while(typeof zoneList==="string"){t=zoneList;zoneList=_this.zones[t]}if(!zoneList){if(!_this.loadedZones.backward){_this.loadZoneFile("backward");return getZone(dt,tz)}invalidTZError(t)}if(zoneList.length===0){throw new Error('No Zone found for "'+tz+'" on '+dt)}for(var i=zoneList.length-1;i>=0;i--){var z=zoneList[i];if(z[3]&&utcMillis>z[3]){break}}return zoneList[i+1]}function getBasicOffset(time){var off=parseTimeString(time),adj=time.indexOf("-")===0?-1:1;off=adj*(((off[1]*60+off[2])*60+off[3])*1000);return off/60/1000}function getRule(dt,zone,isUTC){var date=typeof dt==="number"?new Date(dt):dt;var ruleset=zone[1];var basicOffset=zone[0];var convertDateToUTC=function(date,type,rule){var offset=0;if(type==="u"||type==="g"||type==="z"){offset=0}else{if(type==="s"){offset=basicOffset}else{if(type==="w"||!type){offset=getAdjustedOffset(basicOffset,rule)}else{throw ("unknown type "+type)}}}offset*=60*1000;return new Date(date.getTime()+offset)};var convertRuleToExactDateAndTime=function(yearAndRule,prevRule){var year=yearAndRule[0],rule=yearAndRule[1];var hms=rule[5];var effectiveDate;if(!EXACT_DATE_TIME[year]){EXACT_DATE_TIME[year]={}}if(EXACT_DATE_TIME[year][rule]){effectiveDate=EXACT_DATE_TIME[year][rule]}else{if(!isNaN(rule[4])){effectiveDate=new Date(Date.UTC(year,SHORT_MONTHS[rule[3]],rule[4],hms[1],hms[2],hms[3],0))}else{var targetDay,operator;if(rule[4].substr(0,4)==="last"){effectiveDate=new Date(Date.UTC(year,SHORT_MONTHS[rule[3]]+1,1,hms[1]-24,hms[2],hms[3],0));targetDay=SHORT_DAYS[rule[4].substr(4,3)];operator="<="}else{effectiveDate=new Date(Date.UTC(year,SHORT_MONTHS[rule[3]],rule[4].substr(5),hms[1],hms[2],hms[3],0));targetDay=SHORT_DAYS[rule[4].substr(0,3)];operator=rule[4].substr(3,2)}var ourDay=effectiveDate.getUTCDay();if(operator===">="){effectiveDate.setUTCDate(effectiveDate.getUTCDate()+(targetDay-ourDay+((targetDayourDay)?7:0)))}}EXACT_DATE_TIME[year][rule]=effectiveDate}if(prevRule){effectiveDate=convertDateToUTC(effectiveDate,hms[4],prevRule)}return effectiveDate};var findApplicableRules=function(year,ruleset){var applicableRules=[];for(var i=0;ruleset&&i=year||(ruleset[i][0]===year&&ruleset[i][1]==="only")||ruleset[i][1]==="max")){applicableRules.push([year,ruleset[i]])}}return applicableRules};var compareDates=function(a,b,prev){var year,rule;if(a.constructor!==Date){year=a[0];rule=a[1];a=(!prev&&EXACT_DATE_TIME[year]&&EXACT_DATE_TIME[year][rule])?EXACT_DATE_TIME[year][rule]:convertRuleToExactDateAndTime(a,prev)}else{if(prev){a=convertDateToUTC(a,isUTC?"u":"w",prev)}}if(b.constructor!==Date){year=b[0];rule=b[1];b=(!prev&&EXACT_DATE_TIME[year]&&EXACT_DATE_TIME[year][rule])?EXACT_DATE_TIME[year][rule]:convertRuleToExactDateAndTime(b,prev)}else{if(prev){b=convertDateToUTC(b,isUTC?"u":"w",prev)}}a=Number(a);b=Number(b);return a-b};var year=date.getUTCFullYear();var applicableRules;applicableRules=findApplicableRules(year,_this.rules[ruleset]);applicableRules.push(date);applicableRules.sort(compareDates);if(applicableRules.indexOf(date)<2){applicableRules=applicableRules.concat(findApplicableRules(year-1,_this.rules[ruleset]));applicableRules.sort(compareDates)}var pinpoint=applicableRules.indexOf(date);if(pinpoint>1&&compareDates(date,applicableRules[pinpoint-1],applicableRules[pinpoint-2][1])<0){return applicableRules[pinpoint-2][1]}else{if(pinpoint>0&&pinpoint0){return applicableRules[pinpoint+1][1]}else{if(pinpoint===0){return null}}}return applicableRules[pinpoint-1][1]}function getAdjustedOffset(off,rule){return -Math.ceil(rule[6]-off)}function getAbbreviation(zone,rule){var res;var base=zone[2];if(base.indexOf("%s")>-1){var repl;if(rule){repl=rule[7]==="-"?"":rule[7]}else{repl="S"}res=base.replace("%s",repl)}else{if(base.indexOf("/")>-1){res=base.split("/",2)[rule[6]?1:0]}else{res=base}}return res}this.zoneFileBasePath;this.zoneFiles=["africa","antarctica","asia","australasia","backward","etcetera","europe","northamerica","pacificnew","southamerica"];this.loadingSchemes={PRELOAD_ALL:"preloadAll",LAZY_LOAD:"lazyLoad",MANUAL_LOAD:"manualLoad"};this.loadingScheme=this.loadingSchemes.LAZY_LOAD;this.loadedZones={};this.zones={};this.rules={};this.init=function(o){var opts={async:true},def=this.defaultZoneFile=this.loadingScheme===this.loadingSchemes.PRELOAD_ALL?this.zoneFiles:"northamerica",done=0,callbackFn;for(var p in o){opts[p]=o[p]}if(typeof def==="string"){return this.loadZoneFile(def,opts)}callbackFn=opts.callback;opts.callback=function(){done++;(done===def.length)&&typeof callbackFn==="function"&&callbackFn()};for(var i=0;i3){arr=l.split(/\s+/);chunk=arr.shift();switch(chunk){case"Zone":zone=arr.shift();if(!_this.zones[zone]){_this.zones[zone]=[]}if(arr.length<3){break}arr.splice(3,arr.length,processZone(arr));if(arr[3]){arr[3]=Date.UTC.apply(null,arr[3])}arr[0]=-getBasicOffset(arr[0]);_this.zones[zone].push(arr);break;case"Rule":rule=arr.shift();if(!_this.rules[rule]){_this.rules[rule]=[]}arr[0]=parseInt(arr[0],10);arr[1]=parseInt(arr[1],10)||arr[1];arr[5]=parseTimeString(arr[5]);arr[6]=getBasicOffset(arr[6]);_this.rules[rule].push(arr);break;case"Link":if(_this.zones[arr[1]]){throw new Error("Error with Link "+arr[1]+". Cannot create link of a preexisted zone.")}_this.zones[arr[1]]=arr[0];break}}}return true};this.transport=_transport;this.getTzInfo=function(dt,tz,isUTC){if(this.loadingScheme===this.loadingSchemes.LAZY_LOAD){var zoneFile=getRegionForTimezone(tz);if(!zoneFile){throw new Error("Not a valid timezone ID.")}if(!this.loadedZones[zoneFile]){this.loadZoneFile(zoneFile)}}var z=getZone(dt,tz);var off=z[0];var rule=getRule(dt,z,isUTC);if(rule){off=getAdjustedOffset(off,rule)}var abbr=getAbbreviation(z,rule);return{tzOffset:off,tzAbbr:abbr}}}}).call(this);