function eme_client_clock_callback() {
// Set php clock values in an array
$phptime_obj = new ExpressiveDate(null,$eme_timezone);
// if clock data not set
if (!isset($_SESSION['eme_client_unixtime'])) {
// Preset php clock values in client session variables for fall-back if valid client clock data isn't received.
$_SESSION['eme_client_clock_valid'] = false; // Will be set true if all client clock data passes sanity tests
$_SESSION['eme_client_php_difference'] = 0; // Client-php clock difference integer seconds
$_SESSION['eme_client_unixtime'] = (int) $phptime_obj->format('U'); // Integer seconds since 1/1/1970 @ 12:00 AM
$_SESSION['eme_client_seconds'] = (int) $phptime_obj->format('s'); // Integer second this minute (0-59)
$_SESSION['eme_client_minutes'] = (int) $phptime_obj->format('i'); // Integer minute this hour (0-59)
$_SESSION['eme_client_hours'] = (int) $phptime_obj->format('h'); // Integer hour this day (0-23)
$_SESSION['eme_client_wday'] = (int) $phptime_obj->format('w'); // Integer day this week (0-6), 0 = Sunday, ... , 6 = Saturday
$_SESSION['eme_client_mday'] = (int) $phptime_obj->format('j'); // Integer day this month 1-31)
$_SESSION['eme_client_month'] = (int) $phptime_obj->format('n'); // Integer month this year (1-12)
$_SESSION['eme_client_fullyear'] = (int) $phptime_obj->format('Y'); // Integer year (1970-9999)
$ret = '1'; // reload from server
} else {
$ret = '0';
}
// Cast client clock values as integers to avoid mathematical errors and set in temporary local variables.
$client_unixtime = (int) $_POST['client_unixtime'];
$client_seconds = (int) $_POST['client_seconds'];
$client_minutes = (int) $_POST['client_minutes'];
$client_hours = (int) $_POST['client_hours'];
$client_wday = (int) $_POST['client_wday'];
$client_mday = (int) $_POST['client_mday'];
$client_month = (int) $_POST['client_month'];
$client_fullyear = (int) $_POST['client_fullyear'];
// Client clock sanity tests
$valid = true;
if (abs($client_unixtime - $_SESSION['eme_client_unixtime']) > 300) $valid = false; // allow +/-5 min difference
if (abs($client_seconds - 30) > 30) $valid = false; // Seconds <0 or >60
if (abs($client_minutes - 30) > 30) $valid = false; // Minutes <0 or >60
if (abs($client_hours - 12) > 12) $valid = false; // Hours <0 or >24
if (abs($client_wday - 3) > 3) $valid = false; // Weekday <0 or >6
if (abs($client_mday - $_SESSION['eme_client_mday']) > 30) $valid = false; // >30 day difference
if (abs($client_month - $_SESSION['eme_client_month']) > 11) $valid = false; // >11 month difference
if (abs($client_fullyear - $_SESSION['eme_client_fullyear']) > 1) $valid = false; // >1 year difference
// To insure mutual consistency, don't use any client values unless they all passed the tests.
if ($valid) {
$_SESSION['eme_client_unixtime'] = $client_unixtime;
$_SESSION['eme_client_seconds'] = $client_seconds;
$_SESSION['eme_client_minutes'] = $client_minutes;
$_SESSION['eme_client_hours'] = $client_hours;
$_SESSION['eme_client_wday'] = $client_wday;
$_SESSION['eme_client_mday'] = $client_mday;
$_SESSION['eme_client_month'] = $client_month;
$_SESSION['eme_client_fullyear'] = $client_fullyear;
$_SESSION['eme_client_clock_valid'] = true;
// Set date & time clock strings
$client_clock_str = "$client_fullyear-$client_month-$client_mday $client_hours:$client_minutes:$client_seconds";
$client_clock_obj = new ExpressiveDate($client_clock_str,$eme_timezone);
$_SESSION['eme_client_php_difference'] = (int) $client_clock_obj->getDifferenceInSeconds($phptime_obj);
}
// it is an ajax instance: echo the result
echo $ret;
}