/* http://keith-wood.name/countdown.html
Countdown for jQuery v1.5.8.
Written by Keith Wood (kbwood{at}iinet.com.au) January 2008.
Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and
MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses.
Please attribute the author if you use it. */
/* Display a countdown timer.
Attach it with options like:
$('div selector').countdown(
{until: new Date(2009, 1 - 1, 1, 0, 0, 0), onExpiry: happyNewYear}); */
(function($) { // Hide scope, no $ conflict
/* Countdown manager. */
function Countdown(){this.regional=[];this.regional['']={labels:['Years','Months','Weeks','Days','Hours','Minutes','Seconds'],labels1:['Year','Month','Week','Day','Hour','Minute','Second'],compactLabels:['y','m','w','d'],whichLabels:null,timeSeparator:':',isRTL:false};this._defaults={until:null,since:null,timezone:null,serverSync:null,format:'dHMS',layout:'',compact:false,significant:0,description:'',expiryUrl:'',expiryText:'',alwaysExpire:false,onExpiry:null,onTick:null,tickInterval:1};$.extend(this._defaults,this.regional['']);this._serverSyncs=[];}
var PROP_NAME='countdown';var Y=0;var O=1;var W=2;var D=3;var H=4;var M=5;var S=6;$.extend(Countdown.prototype,{markerClassName:'hasCountdown',_timer:setInterval(function(){$.countdown._updateTargets();},980),_timerTargets:[],setDefaults:function(options){this._resetExtraLabels(this._defaults,options);extendRemove(this._defaults,options||{});},UTCDate:function(tz,year,month,day,hours,mins,secs,ms){if(typeof year=='object'&&year.constructor==Date){ms=year.getMilliseconds();secs=year.getSeconds();mins=year.getMinutes();hours=year.getHours();day=year.getDate();month=year.getMonth();year=year.getFullYear();}
var d=new Date();d.setUTCFullYear(year);d.setUTCDate(1);d.setUTCMonth(month||0);d.setUTCDate(day||1);d.setUTCHours(hours||0);d.setUTCMinutes((mins||0)-(Math.abs(tz)<30?tz*60:tz));d.setUTCSeconds(secs||0);d.setUTCMilliseconds(ms||0);return d;},periodsToSeconds:function(periods){return periods[0]*31557600+periods[1]*2629800+periods[2]*604800+
periods[3]*86400+periods[4]*3600+periods[5]*60+periods[6];},_settingsCountdown:function(target,name){if(!name){return $.countdown._defaults;}
var inst=$.data(target,PROP_NAME);return(name=='all'?inst.options:inst.options[name]);},_attachCountdown:function(target,options){var $target=$(target);if($target.hasClass(this.markerClassName)){return;}
$target.addClass(this.markerClassName);var inst={options:$.extend({},options),_periods:[0,0,0,0,0,0,0]};$.data(target,PROP_NAME,inst);this._changeCountdown(target);},_addTarget:function(target){if(!this._hasTarget(target)){this._timerTargets.push(target);}},_hasTarget:function(target){return($.inArray(target,this._timerTargets)>-1);},_removeTarget:function(target){this._timerTargets=$.map(this._timerTargets,function(value){return(value==target?null:value);});},_updateTargets:function(){for(var i=this._timerTargets.length-1;i>=0;i--){this._updateCountdown(this._timerTargets[i]);}},_updateCountdown:function(target,inst){var $target=$(target);inst=inst||$.data(target,PROP_NAME);if(!inst){return;}
$target.html(this._generateHTML(inst));$target[(this._get(inst,'isRTL')?'add':'remove')+'Class']('countdown_rtl');var onTick=this._get(inst,'onTick');if(onTick){var periods=inst._hold!='lap'?inst._periods:this._calculatePeriods(inst,inst._show,this._get(inst,'significant'),new Date());var tickInterval=this._get(inst,'tickInterval');if(tickInterval==1||this.periodsToSeconds(periods)%tickInterval==0){onTick.apply(target,[periods]);}}
var expired=inst._hold!='pause'&&(inst._since?inst._now.getTime()=inst._until.getTime());if(expired&&!inst._expiring){inst._expiring=true;if(this._hasTarget(target)||this._get(inst,'alwaysExpire')){this._removeTarget(target);var onExpiry=this._get(inst,'onExpiry');if(onExpiry){onExpiry.apply(target,[]);}
var expiryText=this._get(inst,'expiryText');if(expiryText){var layout=this._get(inst,'layout');inst.options.layout=expiryText;this._updateCountdown(target,inst);inst.options.layout=layout;}
var expiryUrl=this._get(inst,'expiryUrl');if(expiryUrl){window.location=expiryUrl;}}
inst._expiring=false;}
else if(inst._hold=='pause'){this._removeTarget(target);}
$.data(target,PROP_NAME,inst);},_changeCountdown:function(target,options,value){options=options||{};if(typeof options=='string'){var name=options;options={};options[name]=value;}
var inst=$.data(target,PROP_NAME);if(inst){this._resetExtraLabels(inst.options,options);extendRemove(inst.options,options);this._adjustSettings(target,inst);$.data(target,PROP_NAME,inst);var now=new Date();if((inst._since&&inst._sincenow)){this._addTarget(target);}
this._updateCountdown(target,inst);}},_resetExtraLabels:function(base,options){var changingLabels=false;for(var n in options){if(n!='whichLabels'&&n.match(/[Ll]abels/)){changingLabels=true;break;}}
if(changingLabels){for(var n in base){if(n.match(/[Ll]abels[0-9]/)){base[n]=null;}}}},_adjustSettings:function(target,inst){var now;var serverSync=this._get(inst,'serverSync');var serverOffset=0;var serverEntry=null;for(var i=0;i0);show[period]=(inst._show[period]=='?'&&!shownNonZero?null:inst._show[period]);showCount+=(show[period]?1:0);sigCount-=(inst._periods[period]>0?1:0);}
var showSignificant=[false,false,false,false,false,false,false];for(var period=S;period>=Y;period--){if(inst._show[period]){if(inst._periods[period]){showSignificant[period]=true;}
else{showSignificant[period]=sigCount>0;sigCount--;}}}
var compact=this._get(inst,'compact');var layout=this._get(inst,'layout');var labels=(compact?this._get(inst,'compactLabels'):this._get(inst,'labels'));var whichLabels=this._get(inst,'whichLabels')||this._normalLabels;var timeSeparator=this._get(inst,'timeSeparator');var description=this._get(inst,'description')||'';var showCompact=function(period){var labelsNum=$.countdown._get(inst,'compactLabels'+whichLabels(inst._periods[period]));return(show[period]?inst._periods[period]+
(labelsNum?labelsNum[period]:labels[period])+' ':'');};var showFull=function(period){var labelsNum=$.countdown._get(inst,'labels'+whichLabels(inst._periods[period]));return((!significant&&show[period])||(significant&&showSignificant[period])?''+
inst._periods[period]+'
'+
(labelsNum?labelsNum[period]:labels[period])+'':'');};return(layout?this._buildLayout(inst,show,layout,compact,significant,showSignificant):((compact?''+
showCompact(Y)+showCompact(O)+showCompact(W)+showCompact(D)+
(show[H]?this._minDigits(inst._periods[H],2):'')+
(show[M]?(show[H]?timeSeparator:'')+
this._minDigits(inst._periods[M],2):'')+
(show[S]?(show[H]||show[M]?timeSeparator:'')+
this._minDigits(inst._periods[S],2):''):''+
showFull(Y)+showFull(O)+showFull(W)+showFull(D)+
showFull(H)+showFull(M)+showFull(S))+''+
(description?''+description+'':'')));},_buildLayout:function(inst,show,layout,compact,significant,showSignificant){var labels=this._get(inst,(compact?'compactLabels':'labels'));var whichLabels=this._get(inst,'whichLabels')||this._normalLabels;var labelFor=function(index){return($.countdown._get(inst,(compact?'compactLabels':'labels')+whichLabels(inst._periods[index]))||labels)[index];};var digit=function(value,position){return Math.floor(value/position)%10;};var subs={desc:this._get(inst,'description'),sep:this._get(inst,'timeSeparator'),yl:labelFor(Y),yn:inst._periods[Y],ynn:this._minDigits(inst._periods[Y],2),ynnn:this._minDigits(inst._periods[Y],3),y1:digit(inst._periods[Y],1),y10:digit(inst._periods[Y],10),y100:digit(inst._periods[Y],100),y1000:digit(inst._periods[Y],1000),ol:labelFor(O),on:inst._periods[O],onn:this._minDigits(inst._periods[O],2),onnn:this._minDigits(inst._periods[O],3),o1:digit(inst._periods[O],1),o10:digit(inst._periods[O],10),o100:digit(inst._periods[O],100),o1000:digit(inst._periods[O],1000),wl:labelFor(W),wn:inst._periods[W],wnn:this._minDigits(inst._periods[W],2),wnnn:this._minDigits(inst._periods[W],3),w1:digit(inst._periods[W],1),w10:digit(inst._periods[W],10),w100:digit(inst._periods[W],100),w1000:digit(inst._periods[W],1000),dl:labelFor(D),dn:inst._periods[D],dnn:this._minDigits(inst._periods[D],2),dnnn:this._minDigits(inst._periods[D],3),d1:digit(inst._periods[D],1),d10:digit(inst._periods[D],10),d100:digit(inst._periods[D],100),d1000:digit(inst._periods[D],1000),hl:labelFor(H),hn:inst._periods[H],hnn:this._minDigits(inst._periods[H],2),hnnn:this._minDigits(inst._periods[H],3),h1:digit(inst._periods[H],1),h10:digit(inst._periods[H],10),h100:digit(inst._periods[H],100),h1000:digit(inst._periods[H],1000),ml:labelFor(M),mn:inst._periods[M],mnn:this._minDigits(inst._periods[M],2),mnnn:this._minDigits(inst._periods[M],3),m1:digit(inst._periods[M],1),m10:digit(inst._periods[M],10),m100:digit(inst._periods[M],100),m1000:digit(inst._periods[M],1000),sl:labelFor(S),sn:inst._periods[S],snn:this._minDigits(inst._periods[S],2),snnn:this._minDigits(inst._periods[S],3),s1:digit(inst._periods[S],1),s10:digit(inst._periods[S],10),s100:digit(inst._periods[S],100),s1000:digit(inst._periods[S],1000)};var html=layout;for(var i=Y;i<=S;i++){var period='yowdhms'.charAt(i);var re=new RegExp('\\{'+period+'<\\}(.*)\\{'+period+'>\\}','g');html=html.replace(re,((!significant&&show[i])||(significant&&showSignificant[i])?'$1':''));}
$.each(subs,function(n,v){var re=new RegExp('\\{'+n+'\\}','g');html=html.replace(re,v);});return html;},_minDigits:function(value,len){value=''+value;if(value.length>=len){return value;}
value='0000000000'+value;return value.substr(value.length-len);},_determineShow:function(inst){var format=this._get(inst,'format');var show=[];show[Y]=(format.match('y')?'?':(format.match('Y')?'!':null));show[O]=(format.match('o')?'?':(format.match('O')?'!':null));show[W]=(format.match('w')?'?':(format.match('W')?'!':null));show[D]=(format.match('d')?'?':(format.match('D')?'!':null));show[H]=(format.match('h')?'?':(format.match('H')?'!':null));show[M]=(format.match('m')?'?':(format.match('M')?'!':null));show[S]=(format.match('s')?'?':(format.match('S')?'!':null));return show;},_calculatePeriods:function(inst,show,significant,now){inst._now=now;inst._now.setMilliseconds(0);var until=new Date(inst._now.getTime());if(inst._since){if(now.getTime()inst._until.getTime()){inst._now=now=until;}}
var periods=[0,0,0,0,0,0,0];if(show[Y]||show[O]){var lastNow=$.countdown._getDaysInMonth(now.getFullYear(),now.getMonth());var lastUntil=$.countdown._getDaysInMonth(until.getFullYear(),until.getMonth());var sameDay=(until.getDate()==now.getDate()||(until.getDate()>=Math.min(lastNow,lastUntil)&&now.getDate()>=Math.min(lastNow,lastUntil)));var getSecs=function(date){return(date.getHours()*60+date.getMinutes())*60+date.getSeconds();};var months=Math.max(0,(until.getFullYear()-now.getFullYear())*12+until.getMonth()-now.getMonth()+
((until.getDate()lastDay){now.setDate(lastDay);}
now.setFullYear(now.getFullYear()+periods[Y]);now.setMonth(now.getMonth()+periods[O]);if(wasLastDay){now.setDate(lastDay);}}
var diff=Math.floor((until.getTime()-now.getTime())/1000);var extractPeriod=function(period,numSecs){periods[period]=(show[period]?Math.floor(diff/numSecs):0);diff-=periods[period]*numSecs;};extractPeriod(W,604800);extractPeriod(D,86400);extractPeriod(H,3600);extractPeriod(M,60);extractPeriod(S,1);if(diff>0&&!inst._since){var multiplier=[1,12,4.3482,7,24,60,60];var lastShown=S;var max=1;for(var period=S;period>=Y;period--){if(show[period]){if(periods[lastShown]>=max){periods[lastShown]=0;diff=1;}
if(diff>0){periods[period]++;diff=0;lastShown=period;max=1;}}
max*=multiplier[period];}}
if(significant){for(var period=Y;period<=S;period++){if(significant&&periods[period]){significant--;}
else if(!significant){periods[period]=0;}}}
return periods;}});function extendRemove(target,props){$.extend(target,props);for(var name in props){if(props[name]==null){target[name]=null;}}
return target;}
$.fn.countdown=function(options){var otherArgs=Array.prototype.slice.call(arguments,1);if(options=='getTimes'||options=='settings'){return $.countdown['_'+options+'Countdown'].apply($.countdown,[this[0]].concat(otherArgs));}
return this.each(function(){if(typeof options=='string'){$.countdown['_'+options+'Countdown'].apply($.countdown,[this].concat(otherArgs));}
else{$.countdown._attachCountdown(this,options);}});};$.countdown=new Countdown();})(jQuery);