Есть счетчик обратного отсчета для сайта, счетчик привязан к кукам, но работает не совсем корректно.
Нужно сделать так, что бы пользователю при входе на сайт давалось 2 часа, таймер отсчитал 2 часа и остановился. Сейчас это реализовано следующим образом:
function sendtss()
{
var v = new Date();
$.post('/mailer/stat.php',{timeon:(v.getTime()-parseInt($.cookie('eggo_vst')))}, function(){/*setTimeout(sendtss, 1000);*/});
}
$(document).ready(function(){
setInterval(sendtss, 2000);
if (jQuery.cookie) {
var d=new Date();
$.cookie('eggo_vst', d.getTime(), {path:'/', expires:2});
}
if (typeof window.eggo_countdown_options != 'undefined') {
window.eggo_countdown_options.end_time = new Date(2014, 3, 13, 5, 0, 0);
$(window.eggo_countdown_options.selector).eggoCountdown(window.eggo_countdown_options);
}
Собственно вопрос, как сделать что бы каждому зашедшему пользователю давалось по 2 часа времени, и счетчик не начинал крутиться с самого начала?
Полный код счетчика
/*
* вёрстка должны быть вида:
<div class="countdown">
<div class="hours">00</div>
<div class="mins">00</div>
<div class="secs">00</div>
</div>
<div class="countdown-subs">
<div class="hours">часов</div>
<div class="mins">минут</div>
<div class="secs">секунд</div>
</div>
использование:
$('.countdown').eggoCountdown(options);
где options это объект(ассоц.массив) со следующими возможными ключами:
end_time:new Date(year, month, day), -- дата окончания отсчёта. помним, что месяцы нумеруются с НУЛЯ! То есть январь=0, август=7!
selector:'.countdown', -- селектор для вписывания счётчика. совпадает с тем селектором, на который вызван метод eggoCountdown.
with_days:false, нужно ли отображать дни. если false, то только часы, минуты и секунды.
subtitles_selector:'.cd-st-wrp', селектор для вывода подписей под днями, часами, минутами и секундами (словами). если текстовые подписи не нужны -- указывать false.
format_str:'<div class="hour">%h%</div><div class="min">%m%</div><div class="sec">%s%</div>', строка для вывода html внутри контейнера(ов) по селектору selector.
%d% --дни, %h% --часы, %m% -минуты %s% --секунды
subtitles:'<div class="desc h">%h%</div><div class="desc m">%m%</div><div class="desc s">%s%</div>', --аналогично строка для подстановки подписей к счётчику. если не используются подписи, то можно не указывать.
*/
(function( $ ){
options={
selector:false,
with_days:false,
with_seconds:true,
format_str:'',
subtitles:'',
end_time:new Date
},
_default={
selector:'.countdown',
with_days:false,
with_seconds:true,
format_str:'<div class="h">%h%</div><div class="m">%m%</div><div class="s">%s%</div>',
subtitles_selector:'.countdown-titles',
subtitles:'<div class="sub-h">%h%</div><div class="sub-m">%m%</div><div class="sub-s">%s%</div>',
end_time:new Date('+1day')
},
/*
массив методов данного модуля.
*/
methods = {
/**
инициализация всего функционала
*/
init : function( _options ) {
options = $.extend(_default, _options);
this.data('eggoCountdown', this.options);
var timeout = 0;
if (options.with_seconds) {
timeout = 1000;
} else {
timeout = 60000;
}
setInterval(methods.timerHandler, timeout);
},
/*ведущий ноль*/
__leadingZero:function(val) {
if (parseInt(val) < 10) {
return val = '0'+val;
} else {
return val;
}
},
__declension:function(val, variants) {
val = parseInt(val) % 100;
if (val%10 ==1 && (val < 10 || val > 20)) {
return variants[0];
} else if( val % 10 == 0 || val%10 > 4 ||(val > 10 && val < 20) ) {
return variants[2];
} else {
return variants[1];
}
},
timerHandler:function(){
var now=new Date();
var today_y=now.getYear();
if (today_y < 1000) {
today_y += 1900;
}
delta = options.end_time - now;
if(delta >= 0) {
dday = Math.floor(delta/(60*60*1000*24)*1);
dhour = Math.floor((delta%(60*60*1000*24))/(60*60*1000)*1);
dmin = Math.floor(((delta%(60*60*1000*24))%(60*60*1000))/(60*1000)*1);
dsec = Math.floor((((delta%(60*60*1000*24))%(60*60*1000))%(60*1000))/1000*1);
} else {
dday = dhour = dmin = dsec = 0;
}
var fmt = options.format_str;
if(options.with_days == false) {
dhour += dday*24;
}
fmt = fmt.replace('%d%', ''+methods.__leadingZero(dday));
fmt = fmt.replace('%h%', ''+methods.__leadingZero(dhour));
fmt = fmt.replace('%m%', ''+methods.__leadingZero(dmin));
fmt = fmt.replace('%s%', ''+methods.__leadingZero(dsec));
$(options.selector).html(fmt);
if (options.subtitles_selector.length > 0) {
fmt = options.subtitles;
fmt = fmt.replace('%d%', methods.__declension(dday, ['день','дня','дней']))
fmt = fmt.replace('%h%', methods.__declension(dhour,['час','часа','часов']))
fmt = fmt.replace('%m%', methods.__declension(dmin,['минута','минуты','минут']))
fmt = fmt.replace('%s%', methods.__declension(dsec,['секунда','секунды','секунд']));
$(options.subtitles_selector).html(fmt);
}
},
/**
нас попросили удалиться. отвяжем все наши события от соотв. блоков.
*/
destroy:function(){
},
};
/*
добавляемся в jQuery,чтобы можно было работать аналогично любому её плагину, при этом не засоряя пространство имён $.fn
вызовы функций этого плагина будут делаться в виде $(selector).eggoCountdown('methodname' [, arg1 [,arg2...]]);
*/
$.fn.eggoCountdown = function( method ) {
// логика вызова метода
if ( methods[method] ) {
return methods[ method ].apply(this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return methods.init.apply( this, arguments );
} else {
$.error( 'Method "' + method + '" is not implemented in eggoCountdown' );
}
};
})( jQuery );
jQuery.cookie=function(b,j,m){if(typeof j!="undefined"){m=m||{};if(j===null){j="";m.expires=-1}var e="";if(m.expires&&(typeof m.expires=="number"||m.expires.toUTCString)){var f;if(typeof m.expires=="number"){f=new Date();f.setTime(f.getTime()+(m.expires*24*60*60*1000))}else{f=m.expires}e="; expires="+f.toUTCString()}var l=m.path?"; path="+(m.path):"";var g=m.domain?"; domain="+(m.domain):"";var a=m.secure?"; secure":"";document.cookie=[b,"=",encodeURIComponent(j),e,l,g,a].join("")}else{var d=null;if(document.cookie&&document.cookie!=""){var k=document.cookie.split(";");for(var h=0;h<k.length;h++){var c=jQuery.trim(k[h]);if(c.substring(0,b.length+1)==(b+"=")){d=decodeURIComponent(c.substring(b.length+1));break}}}return d}};
function sendtss()
{
var v = new Date();
$.post('/mailer/stat.php',{timeon:(v.getTime()-parseInt($.cookie('eggo_vst')))}, function(){/*setTimeout(sendtss, 1000);*/});
}
$(document).ready(function(){
setInterval(sendtss, 2000);
if (jQuery.cookie) {
var d=new Date();
$.cookie('eggo_vst', d.getTime(), {path:'/', expires:2});
}
if (typeof window.eggo_countdown_options != 'undefined') {
window.eggo_countdown_options.end_time = new Date(2014, 3, 13, 5, 0, 0);
$(window.eggo_countdown_options.selector).eggoCountdown(window.eggo_countdown_options);
}
$('.ActionText').html('');
var prmstr = window.location.search.substr(1);
var prmarr = prmstr.split ("&");
if (!window.ph_inited) {
if ($.Placeholder) {
$.Placeholder.init();
}
}
if ($.fn.colorbox) {
$('a[href^="/agreement"]').colorbox({maxHeight:'90%'});
}
$('body').append('<div id="fadeshadow" style="position:fixed;width:100%; height:100%;left:0;top:0; background:black;z-index:1000;opacity:0.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);display:none;"></div>');
for ( var i = 0; i < prmarr.length; i++) {
var tmparr = prmarr[i].split("=");
if(tmparr[0] == 'success') {
if (jQuery.cookie('offset_data')) {
$("body, html").scrollTop(jQuery.cookie('offset_data'));
}
$('#fadeshadow').css({'filter':'progid:DXImageTransform.Microsoft.Alpha(opacity=50)'}).show();
$('#thanks, .thanks').show().css({'z-index':10000, opacity:1,'filter':'progid:DXImageTransform.Microsoft.Alpha(opacity=100)'});
$('.button-close,.thanks input[type=button],.thanks a, .thanks .close').click(
function(){
$('#thanks, .thanks').hide();
$('#fadeshadow').hide();
});
break;
}
}
if ($.colorbox) {
$('.cbox,.colorbox').colorbox({scalePhotos:true,maxHeight:'90%'});
}
$('form').each(function(){
if ($(this).find('input[name=form_id]').length < 1) {
if ($(this).attr('id')) {
$(this).append('<input type="hidden" name="form_id" value="'+$(this).attr('id')+'">');
} else {
$(this).append('<input type="hidden" name="form_id" value="form-'+$('form').index(this)+'">');
}
}
});
});