<?

/**
 * @author pigu.lt dev team
 * @package tools
 */

/**
 * work time helperis
 * 
 * @author medutis (justinas@pigu.lt)
 * @package tools
 */

/**
 * returns working time in hours
 *
 * @param string $date_from
 * @param string $date_to
 * @param string $work_start_time
 * @param string $work_end_time
 * @return string
 */

function work_time($date_from$date_to$work_start_time '08:00'$work_end_time '18:00')
{
    
$sk work_time_difference($date_from$date_to$work_start_time$work_end_time);

    return 
hour_diff($sk);
}

/**
 * returns seconds of working time
 * returns 0, if less
 *
 * @param string $date_from
 * @param string $date_to
 * @param string $work_start_time
 * @param string $work_end_time
 * @return int
 */

function work_time_difference($date_from$date_to$work_start_time '08:00'$work_end_time '18:00')
{
    
// pasiimam sventines dienas
    
$current_year date("Y"mktime($date_from));    
    
$holidays get_holidays($current_year);

    
// darbo dienos
    
$work_week_days = array(1,2,3,4,5);
    
    
// timestamps
    
$date_from_ts strtotime($date_from);
    
$date_to_ts strtotime($date_to);
    
    list(
$work_start_h$work_start_min) = split(":"$work_start_time);
    list(
$work_end_h$work_end_min) = split(":"$work_end_time);
    
    
// work time
    
$start_fix_time mktime($work_start_h$work_start_min0112000);
    
$end_fix_time mktime($work_end_h$work_end_min0112000);
    
$work_time $end_fix_time -  $start_fix_time;
    
$not_work_time 3600*24-$work_time;
    
    
    
// START OF date_from
    
    // jei data savaitgali arba sventine diena,
    // nusukame ja i tos dienos pradzia (po to atsuksim iki pirmadienio darbo pradzios)
    
$weekday date("w"$date_from_ts);
    
$monthday date("m-d"$date_from_ts);
    if (!
in_array($weekday$work_week_days) || in_array($monthday$holidays))
    {
        
$date_from_ts mktime($work_start_h$work_start_min0date("m"$date_from_ts), date("d"$date_from_ts), date("y"$date_from_ts));
    }

    
// jei pradzia duota po darbo pabaigos iki 0:00,
    // tuomet permetam i kitos dienos pradzia
    
if (date("H:i"$date_from_ts)>=$work_end_time)
    {
        
$date_from_ts mktime($work_start_h$work_start_min0date("m"$date_from_ts), date("d"$date_from_ts)+1date("y"$date_from_ts));
    }
    
    
// jei pradzia duota pries darbo pradzia po 0:00,
    // tuomet permetam i sitos dienos pradzia
    
if (date("H:i"$date_from_ts)<=$work_start_time)
    {
        
$date_from_ts mktime($work_start_h$work_start_min0date("m"$date_from_ts), date("d"$date_from_ts), date("y"$date_from_ts));
    }
    
    
// jei pradzios data yra sventine diena arba savaitgaline,
    // tai prasukam i prieki, kol jos baigsis
    
$weekday date("w"$date_from_ts);
    
$monthday date("m-d"$date_from_ts);
    while (!
in_array($weekday$work_week_days) || in_array($monthday$holidays))
    {
        
$date_from_ts+=3600*24;
        
$weekday date("w"$date_from_ts);
        
$monthday date("m-d"$date_from_ts);
    }

    
// END OF date_from
    
    
    // START OF date_to
    
    // jei baigimo data savaitgali arba sventine diena, nusukame i tos dienos pabaiga
    // (po to atsuksim iki penktadienio darbo pabaigos)
    
$weekday date("w"$date_to_ts);
    
$monthday date("m-d"$date_to_ts);
    if (!
in_array($weekday$work_week_days) || in_array($monthday$holidays))
    {
        
$date_to_ts mktime($work_end_h$work_end_min0date("m"$date_to_ts), date("d"$date_to_ts), date("y"$date_to_ts));
    }

    
// jei pabaiga duota po darbo pabaigos iki 0:00,
    // graziname i tos dienos darbo pabaiga
    
if (date("H:i"$date_to_ts)>=$work_end_time)
    {
        
$date_to_ts mktime($work_end_h$work_end_min0date("m"$date_to_ts), date("d"$date_to_ts), date("y"$date_to_ts));
    }

    
// jei pabaiga duota pries darbo pradzia po 0:00,
    // graziname i vakar dienos darbo pabaiga
    
if (date("H:i"$date_to_ts)<=$work_start_time)
    {
        
$date_to_ts mktime($work_start_h$work_start_min0date("m"$date_to_ts), date("d"$date_to_ts), date("y"$date_to_ts));
    }
    
    
// jei baigimo data yra sventine data arba savaitgaline,
    // atsukam atgal kol jos bus nebesventines
    
$weekday date("w"$date_to_ts);
    
$monthday date("m-d"$date_to_ts);
    
    while (!
in_array($weekday$work_week_days) || in_array($monthday$holidays))
    {
        
$date_to_ts-=3600*24;
        
$weekday date("w"$date_to_ts);
        
$monthday date("m-d"$date_to_ts);
    }

    
    
// ismetam savaitgalines dienas bei ne darbo valandas
    
$end_iter mktime($work_start_h$work_start_min0date("m"$date_to_ts), date("d"$date_to_ts), date("y"$date_to_ts));
    for (
$i=$date_from_ts;$i<$end_iter;$i+=3600*24)
    {
        
$weekday date("w"$i);
        
$monthday date("m-d"$i);
        if (!
in_array($weekday$work_week_days) || in_array($monthday$holidays)) $date_to_ts -= 3600*24;
        else 
$date_to_ts -= $not_work_time;
    }

    
// END OF date_to
    
    
    
$sk $date_to_ts $date_from_ts;

    return 
max($sk0);
}


/**
 * returns holidays in Lithuania

 * @param int $current_year
 * @return array
 */
 
function get_holidays($current_year)
{
    
$holidays = array(
        
'01-01'// Naujieji metai
        
'02-16'// Lietuvos valstybės atkūrimo diena
        
'03-11'// Lietuvos nepriklausomybės atkūrimo diena
        
'05-01'// Tarptautinė darbo diena
        
'06-24'// Rasos (Joninių) diena
        
'07-06'// Valstybės (Karaliaus Mindaugo karūnavimo) diena
        
'08-15'// Žolinė
        
'11-01'// Visų šventųjų diena
        
'12-25'// Kalėdos
        
'12-26'// Kalėdos
    
);
    
    
// mamos ir tevo dienos - visalaik sekmadieni
    
    // Velykos
    
$easter_days easter_days($current_year);
    
$holidays[] = date("m-d"mktime(000322+$easter_days$current_year)); // imam tik antra Velyku diena - pirmadieni
    
    
return $holidays;
}

/**
 * formats string in hours, minutes and seconds
 *
 * @param int $sk
 * @return string
 */

function hour_diff($sk)
{
    if (
$sk<=0) return '1min.';
    
    
$hours floor($sk/3600);
    
$minutes floor(($sk-($hours*3600))/60);
    
$seconds $sk%60;

    
$s '';
    
    if (
$hours>0$s .= $hours.'h. ';
    if (
$hours>|| $minutes>0$s .= $minutes.'min. ';
    if (
$seconds>0$s .= $seconds.'s. ';
    
    return 
trim($s);
    
}

?>