/* http://keith-wood.name/countdown.html
   Countdown for jQuery v1.5.7.
   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. */
(function($){function Countdown(){this.regional=[];this.regional['']={labels:['År','Måneder','Uger','Dage','Timer','Minutter','Sekunder'],labels1:['År','Månad','Uge','Dag','Time','Minut','Sekund'],compactLabels:['Å','M','U','D'],timeSeparator: ':',isRTL: false};this._defaults={until: null,since: null,timezone: null,serverSync: null,format: 'dHMS',layout: '',compact: false,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,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._since.getTime(): 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._since<now)||(inst._until&&inst._until>now)){this._addTarget(target);}this._updateCountdown(target,inst);}},_resetExtraLabels: function(base,options){var changingLabels=false;for(var n in options){if(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;i<this._serverSyncs.length;i++){if(this._serverSyncs[i][0]==serverSync){serverEntry=this._serverSyncs[i][1];break;}}if(serverEntry!=null){serverOffset=(serverSync?serverEntry : 0);now=new Date();}else{var serverResult=(serverSync?serverSync.apply(target,[]): null);now=new Date();serverOffset=(serverResult?now.getTime()-serverResult.getTime(): 0);this._serverSyncs.push([serverSync,serverOffset]);}var timezone=this._get(inst,'timezone');timezone=(timezone==null?-now.getTimezoneOffset(): timezone);inst._since=this._get(inst,'since');if(inst._since!=null){inst._since=this.UTCDate(timezone,this._determineTime(inst._since,null));if(inst._since&&serverOffset){inst._since.setMilliseconds(inst._since.getMilliseconds()+serverOffset);}}inst._until=this.UTCDate(timezone,this._determineTime(this._get(inst,'until'),now));if(serverOffset){inst._until.setMilliseconds(inst._until.getMilliseconds()+serverOffset);}inst._show=this._determineShow(inst);},_destroyCountdown: function(target){var $target=$(target);if(!$target.hasClass(this.markerClassName)){return;}this._removeTarget(target);$target.removeClass(this.markerClassName).empty();$.removeData(target,PROP_NAME);},_pauseCountdown: function(target){this._hold(target,'pause');},_lapCountdown: function(target){this._hold(target,'lap');},_resumeCountdown: function(target){this._hold(target,null);},_hold: function(target,hold){var inst=$.data(target,PROP_NAME);if(inst){if(inst._hold=='pause'&&!hold){inst._periods=inst._savePeriods;var sign=(inst._since?'-' : '+');inst[inst._since?'_since' : '_until']=this._determineTime(sign+inst._periods[0]+'y'+sign+inst._periods[1]+'o'+sign+inst._periods[2]+'w'+sign+inst._periods[3]+'d'+sign+inst._periods[4]+'h'+sign+inst._periods[5]+'m'+sign+inst._periods[6]+'s');this._addTarget(target);}inst._hold=hold;inst._savePeriods=(hold=='pause'?inst._periods : null);$.data(target,PROP_NAME,inst);this._updateCountdown(target,inst);}},_getTimesCountdown: function(target){var inst=$.data(target,PROP_NAME);return(!inst?null :(!inst._hold?inst._periods : this._calculatePeriods(inst,inst._show,new Date())));},_get: function(inst,name){return(inst.options[name]!=null?inst.options[name]: $.countdown._defaults[name]);},_determineTime: function(setting,defaultTime){var offsetNumeric=function(offset){var time=new Date();time.setTime(time.getTime()+offset*1000);return time;};var offsetString=function(offset){offset=offset.toLowerCase();var time=new Date();var year=time.getFullYear();var month=time.getMonth();var day=time.getDate();var hour=time.getHours();var minute=time.getMinutes();var second=time.getSeconds();var pattern=/([+-]?[0-9]+)\s*(s|m|h|d|w|o|y)?/g;var matches=pattern.exec(offset);while(matches){switch(matches[2]||'s'){case 's': second+=parseInt(matches[1],10);break;case 'm': minute+=parseInt(matches[1],10);break;case 'h': hour+=parseInt(matches[1],10);break;case 'd': day+=parseInt(matches[1],10);break;case 'w': day+=parseInt(matches[1],10)*7;break;case 'o': month+=parseInt(matches[1],10);day=Math.min(day,$.countdown._getDaysInMonth(year,month));break;case 'y': year+=parseInt(matches[1],10);day=Math.min(day,$.countdown._getDaysInMonth(year,month));break;}matches=pattern.exec(offset);}return new Date(year,month,day,hour,minute,second,0);};var time=(setting==null?defaultTime :(typeof setting=='string'?offsetString(setting):(typeof setting=='number'?offsetNumeric(setting): setting)));if(time)time.setMilliseconds(0);return time;},_getDaysInMonth: function(year,month){return 32-new Date(year,month,32).getDate();},_generateHTML: function(inst){inst._periods=periods=(inst._hold?inst._periods : this._calculatePeriods(inst,inst._show,new Date()));var shownNonZero=false;var showCount=0;var show=$.extend({},inst._show);for(var period=0;period<inst._show.length;period++){shownNonZero|=(inst._show[period]=='?'&&periods[period]>0);show[period]=(inst._show[period]=='?'&&!shownNonZero?null : inst._show[period]);showCount+=(show[period]?1 : 0);}var compact=this._get(inst,'compact');var layout=this._get(inst,'layout');var labels=(compact?this._get(inst,'compactLabels'): this._get(inst,'labels'));var timeSeparator=this._get(inst,'timeSeparator');var description=this._get(inst,'description')||'';var showCompact=function(period){var labelsNum=$.countdown._get(inst,'compactLabels'+periods[period]);return(show[period]?periods[period]+(labelsNum?labelsNum[period]: labels[period])+' ' : '');};var showFull=function(period){var labelsNum=$.countdown._get(inst,'labels'+periods[period]);return(show[period]?'<span class="countdown_section"><span class="countdown_amount">'+periods[period]+'</span><br/>'+(labelsNum?labelsNum[period]: labels[period])+'</span>' : '');};return(layout?this._buildLayout(inst,show,layout,compact):((compact?'<span class="countdown_row countdown_amount'+(inst._hold?' countdown_holding' : '')+'">'+showCompact(Y)+showCompact(O)+showCompact(W)+showCompact(D)+(show[H]?this._minDigits(periods[H],2): '')+(show[M]?(show[H]?timeSeparator : '')+this._minDigits(periods[M],2): '')+(show[S]?(show[H]||show[M]?timeSeparator : '')+this._minDigits(periods[S],2): ''): '<span class="countdown_row countdown_show'+showCount+(inst._hold?' countdown_holding' : '')+'">'+showFull(Y)+showFull(O)+showFull(W)+showFull(D)+showFull(H)+showFull(M)+showFull(S))+'</span>'+(description?'<span class="countdown_row countdown_descr">'+description+'</span>' : '')));},_buildLayout: function(inst,show,layout,compact){var labels=this._get(inst,(compact?'compactLabels' : 'labels'));var labelFor=function(index){return($.countdown._get(inst,(compact?'compactLabels' : 'labels')+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=0;i<7;i++){var period='yowdhms'.charAt(i);var re=new RegExp('\\{'+period+'<\\}(.*)\\{'+period+'>\\}','g');html=html.replace(re,(show[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,now){inst._now=now;inst._now.setMilliseconds(0);var until=new Date(inst._now.getTime());if(inst._since){if(now.getTime()<inst._since.getTime()){inst._now=now=until;}else{now=inst._since;}}else{until.setTime(inst._until.getTime());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()<now.getDate()&&!sameDay)||(sameDay&&getSecs(until)<getSecs(now))?-1 : 0));periods[Y]=(show[Y]?Math.floor(months/12): 0);periods[O]=(show[O]?months-periods[Y]*12 : 0);var adjustDate=function(date,offset,last){var wasLastDay=(date.getDate()==last);var lastDay=$.countdown._getDaysInMonth(date.getFullYear()+offset*periods[Y],date.getMonth()+offset*periods[O]);if(date.getDate()>lastDay){date.setDate(lastDay);}date.setFullYear(date.getFullYear()+offset*periods[Y]);date.setMonth(date.getMonth()+offset*periods[O]);if(wasLastDay){date.setDate(lastDay);}return date;};if(inst._since){until=adjustDate(until,-1,lastUntil);}else{now=adjustDate(new Date(now.getTime()),+1,lastNow);}}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];}}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);