286 lines
8.7 KiB
PHP
286 lines
8.7 KiB
PHP
<?php
|
|
# ***** BEGIN LICENSE BLOCK *****
|
|
#
|
|
# This file is part of CountDown, a plugin for Dotclear 2
|
|
# Copyright 2007,2010 Moe (http://gniark.net/)
|
|
#
|
|
# CountDown is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License v2.0
|
|
# as published by the Free Software Foundation.
|
|
#
|
|
# CountDown is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public
|
|
# License along with this program. If not, see
|
|
# <http://www.gnu.org/licenses/>.
|
|
#
|
|
# ***** END LICENSE BLOCK *****
|
|
|
|
if (!defined('DC_RC_PATH')) {return;}
|
|
|
|
dcCore::app()->addBehavior('initWidgets',
|
|
array('CountDownBehaviors','initWidgets'));
|
|
|
|
class CountDownBehaviors
|
|
{
|
|
public static function initWidgets($w)
|
|
{
|
|
# set timezone
|
|
dcCore::app();
|
|
$tz = dcCore::app()->blog->settings->system->blog_timezone;
|
|
|
|
$w->create('CountDown',__('Countdown'),
|
|
array('CountDownBehaviors','Show'),
|
|
null,
|
|
__('A countdown to a future date or stopwatch to a past date'));
|
|
|
|
$w->CountDown->setting('title',__('Title:'),__('CountDown'),'text');
|
|
|
|
$w->CountDown->setting('text_before',
|
|
__('Text displayed if the date is in the future:'),__('In'),'text');
|
|
|
|
$w->CountDown->setting('text_after',
|
|
__('Text displayed if the date is in the past:'),__('For'),'text');
|
|
|
|
# create arrays for year, month, day, hour, minute and second
|
|
$array_year = $array_month = $array_day = $array_hour = array();
|
|
$array_minute = $array_number_of_times = array();
|
|
for ($i = 1902;$i <= 2037;$i++)
|
|
{
|
|
$array_year[$i] = $i;
|
|
}
|
|
for ($i = 1;$i <= 12;$i++)
|
|
{
|
|
$i = str_repeat('0',(2-strlen($i))).$i;
|
|
$array_month[ucfirst(__(strftime('%B', mktime(0, 0, 0, $i, 1, 1970)))).' ('.$i.')'] = $i;
|
|
}
|
|
for ($i = 1;$i <= 31;$i++)
|
|
{
|
|
$i = str_repeat('0',(2-strlen($i))).$i;
|
|
$array_day[$i] = $i;
|
|
}
|
|
for ($i = 0;$i <= 23;$i++)
|
|
{
|
|
$i = str_repeat('0',(2-strlen($i))).$i;
|
|
$array_hour[$i] = $i;
|
|
}
|
|
for ($i = 0;$i <= 60;$i++)
|
|
{
|
|
$i = str_repeat('0',(2-strlen($i))).$i;
|
|
$array_minute[$i] = $i;
|
|
}
|
|
for ($i = 1;$i <= 5;$i++)
|
|
{
|
|
$array_number_of_times[$i] = $i;
|
|
}
|
|
$array_number_of_times['6 ('.__('all').')'] = 6;
|
|
# /create arrays
|
|
|
|
$w->CountDown->setting('year',ucfirst(__('year')).':',
|
|
dt::str('%Y',null,$tz),'combo',$array_year);
|
|
$w->CountDown->setting('month',ucfirst(__('month')).':',
|
|
dt::str('%m',null,$tz),'combo',$array_month);
|
|
$w->CountDown->setting('day',ucfirst(__('day')).':',
|
|
dt::str('%d',null,$tz),'combo',$array_day);
|
|
$w->CountDown->setting('hour',ucfirst(__('hour')).':',
|
|
dt::str('%H',null,$tz),'combo',$array_hour);
|
|
$w->CountDown->setting('minute',ucfirst(__('minute')).':',
|
|
dt::str('%M',null,$tz),'combo',$array_minute);
|
|
$w->CountDown->setting('second',ucfirst(__('second')).':',
|
|
dt::str('%S',null,$tz),'combo',$array_minute);
|
|
|
|
$w->CountDown->setting('number_of_times',
|
|
__('Number of values to be displayed:'),'6','combo',
|
|
$array_number_of_times);
|
|
|
|
$w->CountDown->setting('zeros',
|
|
__('Show zeros before hours, minutes and seconds'),false,'check');
|
|
|
|
$w->CountDown->setting('dynamic',
|
|
__('Enable dynamic display'),false,'check');
|
|
|
|
$w->CountDown->setting('dynamic_format',
|
|
sprintf(__('Dynamic display format (see <a href="%1$s" %2$s>jQuery Countdown Reference</a>):'),
|
|
'http://keith-wood.name/countdownRef.html#format',
|
|
'onclick="return window.confirm(\''.
|
|
__('Are you sure you want to leave this page?').'\')"'),
|
|
__('yowdHMS'),'text');
|
|
|
|
$w->CountDown->setting('dynamic_layout_before',
|
|
sprintf(__('Dynamic display layout if the date is in the future (see <a href="%1$s" %2$s>jQuery Countdown Reference</a>):'),
|
|
'http://keith-wood.name/countdownRef.html#layout',
|
|
'onclick="return window.confirm(\''.
|
|
__('Are you sure you want to leave this page?').'\')"'),
|
|
__('In {y<}{yn} {yl}, {y>} {o<}{on} {ol}, {o>} {w<}{wn} {wl}, {w>} {d<}{dn} {dl}, {d>} {hn} {hl}, {mn} {ml} and {sn} {sl}'),
|
|
'textarea');
|
|
|
|
$w->CountDown->setting('dynamic_layout_after',
|
|
sprintf(__('Dynamic display layout if the date is in the past (see <a href="%1$s" %2$s>jQuery Countdown Reference</a>):'),
|
|
'http://keith-wood.name/countdownRef.html#layout',
|
|
'onclick="return window.confirm(\''.
|
|
__('Are you sure you want to leave this page?').'\')"'),
|
|
__('For {y<}{yn} {yl}, {y>} {o<}{on} {ol}, {o>} {w<}{wn} {wl}, {w>} {d<}{dn} {dl}, {d>} {hn} {hl}, {mn} {ml} and {sn} {sl}'),
|
|
'textarea');
|
|
|
|
$w->CountDown->setting('homeonly',__('Display on:'),0,'combo',
|
|
array(
|
|
__('All pages') => 0,
|
|
__('Home page only') => 1,
|
|
__('Except on home page') => 2
|
|
)
|
|
);
|
|
$w->CountDown->setting('content_only',__('Content only'),0,'check');
|
|
$w->CountDown->setting('class',__('CSS class:'),'');
|
|
$w->CountDown->setting('offline',__('Offline'),0,'check');
|
|
}
|
|
|
|
# escape quotes but not XHTML tags
|
|
# inspired by html::escapeJS()
|
|
public static function escapeQuotes($str)
|
|
{
|
|
$str = str_replace("'","\'",$str);
|
|
$str = str_replace('"','\"',$str);
|
|
return $str;
|
|
}
|
|
|
|
public static function Show($w)
|
|
{
|
|
# set timezone
|
|
dcCore::app();
|
|
|
|
if ($w->offline)
|
|
return;
|
|
|
|
if (($w->homeonly == 1 && dcCore::app()->url->type != 'default') ||
|
|
($w->homeonly == 2 && dcCore::app()->url->type == 'default')) {
|
|
return;
|
|
}
|
|
|
|
# get local time
|
|
$local_time = dt::addTimeZone(dcCore::app()->blog->settings->system->blog_timezone);
|
|
|
|
$ts = mktime($w->hour,$w->minute,$w->second,$w->month,$w->day,
|
|
$w->year);
|
|
# get difference
|
|
(int)$diff = ($local_time - $ts);
|
|
$after = ($diff > 0) ? true : false;
|
|
$diff = abs($diff);
|
|
|
|
$times = array();
|
|
|
|
$intervals = array
|
|
(
|
|
(3600*24*365.24) => array('one'=>__('year'),'more'=>__('years'),
|
|
'zeros'=>false),
|
|
(3600*24*30.4) => array('one'=>__('month'),'more'=>__('months'),
|
|
'zeros'=>false),
|
|
(3600*24) => array('one'=>__('day'),'more'=>__('days'),
|
|
'zeros'=>false),
|
|
(3600) => array('one'=>__('hour'),'more'=>__('hours'),
|
|
'zeros'=>true),
|
|
(60) => array('one'=>__('minute'),'more'=>__('minutes'),
|
|
'zeros'=>true),
|
|
(1) => array('one'=>__('second'),'more'=>__('seconds'),
|
|
'zeros'=>true),
|
|
);
|
|
|
|
foreach ($intervals as $k => $v)
|
|
{
|
|
if ($diff >= $k)
|
|
{
|
|
$time = floor($diff/$k);
|
|
$times[] = (($w->zeros AND $v['zeros'])
|
|
? sprintf('%02d',$time) : $time).' '.(($time <= 1) ? $v['one']
|
|
: $v['more']);
|
|
$diff = $diff%$k;
|
|
}
|
|
}
|
|
|
|
# output
|
|
$text = ($after) ? $w->text_after : $w->text_before;
|
|
if (strlen($text) > 0) {$text .= ' ';}
|
|
|
|
# get times and make a string
|
|
$times = array_slice($times,0,$w->number_of_times);
|
|
if (count($times) > 1)
|
|
{
|
|
$last = array_pop($times);
|
|
$str = implode(', ',$times).' '.__('and').' '.$last;
|
|
}
|
|
else {$str = implode('',$times);}
|
|
|
|
if (!$w->dynamic)
|
|
{
|
|
|
|
$res = ($w->title ? $w->renderTitle(html::escapeHTML($w->title)) : '').
|
|
'<p>'.$text.'<span>'.$str.'</span></p>';
|
|
return $w->renderDiv($w->content_only,'countdown '.$w->class,'',$res);
|
|
}
|
|
|
|
else
|
|
{
|
|
# dynamic display with Countdown for jQuery
|
|
if (!is_numeric(dcCore::app()->ctx->countdown))
|
|
{
|
|
dcCore::app()->ctx->countdown = 0;
|
|
}
|
|
$id = dcCore::app()->ctx->countdown;
|
|
dcCore::app()->ctx->countdown += 1;
|
|
|
|
$script = '';
|
|
|
|
if (!defined('COUNTDOWN_SCRIPT'))
|
|
{
|
|
$script =
|
|
'<script type="text/javascript" src="'.
|
|
dcCore::app()->blog->getQmarkURL().
|
|
'pf=countdown/js/jquery.countdown.min.js"></script>'."\n";
|
|
|
|
$l10n_file =
|
|
'jquery.countdown-'.dcCore::app()->blog->settings->system->lang.'.js';
|
|
if (file_exists(dirname(__FILE__).'/js/'.$l10n_file))
|
|
{
|
|
$script .=
|
|
'<script type="text/javascript" src="'.dcCore::app()->blog->getQmarkURL().
|
|
'pf=countdown/js/'.$l10n_file.'"></script>'."\n";
|
|
}
|
|
|
|
define('COUNTDOWN_SCRIPT',(bool)true);
|
|
}
|
|
|
|
if ($after)
|
|
{
|
|
$to = 'since';
|
|
$layout = $w->dynamic_layout_after;
|
|
}
|
|
else
|
|
{
|
|
$to = 'until';
|
|
$layout = $w->dynamic_layout_before;
|
|
}
|
|
|
|
$res = ($w->title ? $w->renderTitle(html::escapeHTML($w->title)) : '').
|
|
'<p id="countdown-'.$id.'">'.$text.$str.'</p>'.
|
|
'<script type="text/javascript">'."\n".
|
|
'//<![CDATA['."\n".
|
|
'$().ready(function() {'.
|
|
"$('#countdown-".$id."').countdown({".
|
|
# In Javascript, 0 = January, 11 = December
|
|
$to.": new Date(".(int)$w->year.",".(int)$w->month."-1,".
|
|
(int)$w->day.",".(int)$w->hour.",".(int)$w->minute.",".
|
|
(int)$w->second."),
|
|
description: '".html::escapeJS($text)."',
|
|
format: '".$w->dynamic_format."',
|
|
layout: '".$layout."',
|
|
expiryText: '".html::escapeJS($w->text_after)."'
|
|
});".
|
|
'});'."\n".
|
|
'//]]>'.
|
|
'</script>'."\n";
|
|
return $w->renderDiv($w->content_only,'countdown '.$w->class,'',$res);
|
|
}
|
|
}
|
|
} |