// -------------------------------------------------------------------------------------------
//
// AVIA Countdown
//
// @since 4.5.6 Countdown is UTC based to reflect different browser timezones
//
// -------------------------------------------------------------------------------------------
(function($)
{
"use strict";
var _units = ['years','months','weeks','days','hours','minutes','seconds'],
_second = 1000,
_minute = _second * 60,
_hour = _minute * 60,
_day = _hour * 24,
_week = _day * 7,
getDaysInMonth = function( month, year )
{
// January is 1 based
return new Date( year, month, 0 ).getDate();
},
splitStartDate = function( date )
{
var result = {
year: date.getFullYear(),
month: date.getMonth() + 1,
day: date.getDate(),
hours: date.getHours(),
minutes: date.getMinutes(),
seconds: date.getSeconds()
};
return result;
},
getYears = function( start, endDate )
{
var diff = endDate.getFullYear() - start.year;
if( diff > 0 )
{
// take care of leap year
var check = new Date( start.year + diff, start.month - 1, start.day, start.hours, start.minutes, start.seconds );
if( check > endDate )
{
diff --;
}
}
return ( diff >= 0 ) ? diff : 0;
},
getMonths = function( start, endDate )
{
var endMonth = endDate.getMonth() + 1;
var diff = endMonth - start.month;
if( diff < 0 )
{
diff = 12 - start.month + endMonth;
}
if( diff > 0 )
{
// take care of leap year
var check = new Date( start.year, start.month - 1 + diff, start.day, start.hours, start.minutes, start.seconds );
if( check > endDate )
{
diff --;
}
}
return ( diff >= 0 ) ? diff : 0;
},
getDays = function( start, endDate )
{
var endDay = endDate.getDate();
var diff = endDay - start.day;
if( diff < 0 )
{
diff = getDaysInMonth( start.month, start.year ) - start.day + endDay;
}
if( diff > 0 )
{
var check = new Date( start.year, start.month - 1, start.day + diff, start.hours, start.minutes, start.seconds );
if( check > endDate )
{
diff --;
}
}
return ( diff >= 0 ) ? diff : 0;
},
getBetween = function( startDate, endDate )
{
var start = splitStartDate( startDate ),
result = {
years: 0,
year_months: 0,
month_months: 0,
days: 0
};
result.years = getYears( start, endDate );
start.year += result.years;
result.year_months = getMonths( start, endDate );
start.month += result.year_months;
result.days = getDays( start, endDate );
start.day += result.days;
result.month_months = result.years * 12 + result.year_months;
return result;
},
ticker = function( _self )
{
var tmLoc = new Date(),
_now = new Date( tmLoc.getTime() + tmLoc.getTimezoneOffset() * 60000 ), // get UTC time
_timestamp = _self.end - _now;
if( _timestamp <= 0 )
{
clearInterval( _self.countdown );
return;
}
_self.time.years = 0;
_self.time.months = 0;
_self.time.weeks = Math.floor( _timestamp / _week );
_self.time.days = Math.floor( ( _timestamp % _week ) / _day );
_self.time.hours = Math.floor( ( _timestamp % _day ) / _hour );
_self.time.minutes = Math.floor( ( _timestamp % _hour ) / _minute );
_self.time.seconds = Math.floor( ( _timestamp % _minute ) / _second );
var between = getBetween( _now, _self.end );
switch( _self.data.maximum )
{
case 1:
_self.time.seconds = Math.floor( _timestamp / _second );
break;
case 2:
_self.time.minutes = Math.floor( _timestamp / _minute );
break;
case 3:
_self.time.hours = Math.floor( _timestamp / _hour );
break;
case 4:
_self.time.days = Math.floor( _timestamp / _day );
break;
case 6:
_self.time.days = between.days;
_self.time.months = between.month_months;
break;
case 7:
_self.time.days = between.days;
_self.time.months = between.year_months;
_self.time.years = between.years;
break;
}
for( var i in _self.time )
{
if( typeof _self.update[i] == "object" )
{
if(_self.firstrun || _self.oldtime[i] != _self.time[i])
{
var labelkey = ( _self.time[i] === 1 ) ? "single" : "multi";
_self.update[i].time_container.text(_self.time[i]);
_self.update[i].label_container.text(_self.update[i][labelkey]);
}
}
}
//show ticker
if( _self.firstrun )
{
_self.container.addClass('av-countdown-active');
}
_self.oldtime = $.extend( {}, _self.time );
_self.firstrun = false;
};
$.fn.aviaCountdown = function( options )
{
if( ! this.length )
{
return;
}
return this.each( function()
{
var _self = {};
_self.update = {};
_self.time = {};
_self.oldtime = {};
_self.firstrun = true;
_self.container = $(this);
_self.data = _self.container.data();
_self.end = new Date( _self.data.year, _self.data.month, _self.data.day, _self.data.hour, _self.data.minute );
if( _self.data.timezone != '0' )
{
_self.end = new Date( _self.end.getTime() - _self.data.timezone * 60000 );
}
for( var i in _units )
{
_self.update[_units[i]] = {
time_container: _self.container.find('.av-countdown-' + _units[i] + ' .av-countdown-time'),
label_container: _self.container.find('.av-countdown-' + _units[i] + ' .av-countdown-time-label')
};
if( _self.update[_units[i]].label_container.length )
{
_self.update[_units[i]].single = _self.update[_units[i]].label_container.data('label');
_self.update[_units[i]].multi = _self.update[_units[i]].label_container.data('label-multi');
}
}
ticker( _self );
_self.countdown = setInterval( function(){ ticker( _self ); }, 1000 );
});
};
}(jQuery));