2001-04-30 05:07:05 +02:00
< ? php
/************************************************************************** \
* phpGroupWare - Calendar Holidays *
* http :// www . phpgroupware . org *
* Written by Mark Peters < skeeter @ phpgroupware . org > *
* -------------------------------------------- *
* This program is free software ; you can redistribute it and / or modify it *
* under the terms of the GNU General Public License as published by the *
* Free Software Foundation ; either version 2 of the License , or ( at your *
* option ) any later version . *
\ **************************************************************************/
/* $Id$ */
class calendar_holiday
{
var $db ;
2001-05-03 01:23:48 +02:00
var $year ;
var $tz_offset ;
2001-05-15 06:05:38 +02:00
var $holidays = Array ();
var $index = Array ();
2001-04-30 05:07:05 +02:00
var $users ;
2001-05-03 01:23:48 +02:00
// var $cal;
2001-04-30 05:07:05 +02:00
function calendar_holiday ( $owner = '' )
{
global $phpgw , $phpgw_info ;
$this -> db = $phpgw -> db ;
$this -> users [ 'user' ] = $phpgw_info [ 'user' ][ 'preferences' ][ 'calendar' ][ 'locale' ];
$owner_id = get_account_id ( $owner );
if ( $owner_id != $phpgw_info [ 'user' ][ 'account_id' ])
{
$owner_pref = CreateObject ( 'phpgwapi.preferences' , $owner_id );
$owner_prefs = $owner_pref -> read_repository ();
$this -> users [ 'owner' ] = $owner_prefs [ 'calendar' ][ 'locale' ];
}
if ( $phpgw_info [ 'server' ][ 'auto_load_holidays' ] == True )
{
while ( list ( $key , $value ) = each ( $this -> users ))
{
$this -> is_network_load_needed ( $value );
}
}
}
function is_network_load_needed ( $locale )
{
$sql = " SELECT count(*) FROM phpgw_cal_holidays WHERE locale=' " . $locale . " ' " ;
$this -> db -> query ( $sql , __LINE__ , __FILE__ );
$this -> db -> next_record ();
$rows = $this -> db -> f ( 0 );
if ( $rows == 0 )
{
$this -> load_from_network ( $locale );
}
}
function load_from_network ( $locale )
{
2001-05-01 05:26:17 +02:00
global $phpgw_info , $HTTP_HOST , $SERVER_PORT ;
2001-04-30 05:07:05 +02:00
@ set_time_limit ( 0 );
// get the file that contains the calendar events for your locale
// "http://www.phpgroupware.org/headlines.rdf";
$network = CreateObject ( 'phpgwapi.network' );
2001-05-01 05:26:17 +02:00
if ( isset ( $phpgw_info [ 'server' ][ 'holidays_url_path' ]) && $phpgw_info [ 'server' ][ 'holidays_url_path' ] != 'localhost' )
2001-04-30 05:07:05 +02:00
{
$load_from = $phpgw_info [ 'server' ][ 'holidays_url_path' ];
}
else
{
$pos = strpos ( ' ' . $phpgw_info [ 'server' ][ 'webserver_url' ], $HTTP_HOST );
if ( $pos === False )
{
switch ( $SERVER_PORT )
{
case 80 :
$http_protocol = 'http://' ;
break ;
case 443 :
$http_protocol = 'https://' ;
break ;
}
$server_host = $http_protocol . $HTTP_HOST . $phpgw_info [ 'server' ][ 'webserver_url' ];
}
else
{
$server_host = $phpgw_info [ 'server' ][ 'webserver_url' ];
}
$load_from = $server_host . '/calendar/setup' ;
}
2001-05-01 05:26:17 +02:00
// echo 'Loading from: '.$load_from.'/holidays.'.strtoupper($locale)."<br>\n";
$lines = $network -> gethttpsocketfile ( $load_from . '/holidays.' . strtoupper ( $locale ));
if ( ! $lines ) return false ;
2001-05-05 06:14:00 +02:00
$c_lines = count ( $lines );
for ( $i = 10 ; $i < $c_lines ; $i ++ )
2001-05-01 05:26:17 +02:00
{
// echo 'Line #'.$i.' : '.$lines[$i]."<br>\n";
$holiday = explode ( " \t " , $lines [ $i ]);
2001-05-15 01:43:05 +02:00
if ( count ( $holiday ) == 7 )
2001-05-05 06:14:00 +02:00
{
$loc = $holiday [ 0 ];
$name = addslashes ( $holiday [ 1 ]);
$day = intval ( $holiday [ 2 ]);
$month = intval ( $holiday [ 3 ]);
$occurence = intval ( $holiday [ 4 ]);
$dow = intval ( $holiday [ 5 ]);
2001-05-15 06:05:38 +02:00
$observ_rule = intval ( $holiday [ 6 ]);
2001-05-05 06:14:00 +02:00
// echo "Inserting LOCALE='".$loc."' NAME='".$name."' extra=(".$day.'/'.$month.'/'.$occurence.'/'.$dow.'/'.")<br>\n";
2001-05-15 01:43:05 +02:00
$sql = " INSERT INTO phpgw_cal_holidays(locale,name,mday,month_num,occurence,dow,observance_rule) VALUES(' $loc ',' $name ', $day , $month , $occurence , $dow , $observ_rule ) " ;
2001-05-05 06:14:00 +02:00
$this -> db -> query ( $sql , __LINE__ , __FILE__ );
}
2001-05-01 05:26:17 +02:00
}
2001-04-30 05:07:05 +02:00
}
2001-05-03 04:28:26 +02:00
function calculate_date ( $holiday , & $i )
2001-05-03 01:23:48 +02:00
{
global $phpgw ;
2001-05-13 05:55:09 +02:00
if ( $holiday [ 'day' ] == 0 && $holiday [ 'dow' ] != 0 && $holiday [ 'occurence' ] != 0 )
2001-05-03 01:23:48 +02:00
{
if ( $holiday [ 'occurence' ] != 99 )
{
$dow = $phpgw -> calendar -> day_of_week ( $this -> year , $holiday [ 'month' ], 1 );
$day = ( 7 * $holiday [ 'occurence' ] - 6 + ( $holiday [ 'dow' ] - $dow ) % 7 );
}
else
{
$ld = $phpgw -> calendar -> days_in_month ( $holiday [ 'month' ], $this -> year );
$dow = $phpgw -> calendar -> day_of_week ( $this -> year , $holiday [ 'month' ], $ld );
$day = $ld - ( $dow - $holiday [ 'dow' ]) % 7 ;
}
}
else
{
$day = $holiday [ 'day' ];
2001-05-15 01:43:05 +02:00
if ( $holiday [ 'observance_rule' ] == True )
2001-05-03 04:28:26 +02:00
{
2001-05-15 01:43:05 +02:00
$dow = $phpgw -> calendar -> day_of_week ( $this -> year , $holiday [ 'month' ], $day );
// This now calulates Observed holidays and creates a new entry for them.
if ( $dow == 0 )
{
$i ++ ;
$this -> holidays [ $i ][ 'locale' ] = $holiday [ 'locale' ] . ' (Observed)' ;
$this -> holidays [ $i ][ 'name' ] = $holiday [ 'name' ];
$this -> holidays [ $i ][ 'day' ] = $holiday [ 'day' ] + 1 ;
$this -> holidays [ $i ][ 'month' ] = $holiday [ 'month' ];
$this -> holidays [ $i ][ 'occurence' ] = $holiday [ 'occurence' ];
$this -> holidays [ $i ][ 'dow' ] = $holiday [ 'dow' ];
$this -> holidays [ $i ][ 'date' ] = mktime ( 0 , 0 , 0 , $holiday [ 'month' ], $day + 1 , $this -> year ) - $this -> tz_offset ;
$this -> holidays [ $i ][ 'obervance_rule' ] = 0 ;
// echo 'Calculating for year('.$this->year.') month('.$this->holidays[$i]['month'].') dow('.$this->holidays[$i]['dow'].') occurence('.$this->holidays[$i]['occurence'].') datetime('.$this->holidays[$i]['date'].') DATE('.date('Y.m.d H:i:s',$this->holidays[$i]['date']).')<br>'."\n";
}
elseif ( $dow == 6 )
{
$i ++ ;
$this -> holidays [ $i ][ 'locale' ] = $holiday [ 'locale' ] . ' (Observed)' ;
$this -> holidays [ $i ][ 'name' ] = $holiday [ 'name' ];
$this -> holidays [ $i ][ 'day' ] = $holiday [ 'day' ] - 1 ;
$this -> holidays [ $i ][ 'month' ] = $holiday [ 'month' ];
$this -> holidays [ $i ][ 'occurence' ] = $holiday [ 'occurence' ];
$this -> holidays [ $i ][ 'dow' ] = $holiday [ 'dow' ];
$this -> holidays [ $i ][ 'date' ] = mktime ( 0 , 0 , 0 , $holiday [ 'month' ], $day - 1 , $this -> year ) - $this -> tz_offset ;
$this -> holidays [ $i ][ 'obervance_rule' ] = 0 ;
// echo 'Calculating for year('.$this->year.') month('.$this->holidays[$i]['month'].') dow('.$this->holidays[$i]['dow'].') occurence('.$this->holidays[$i]['occurence'].') datetime('.$this->holidays[$i]['date'].') DATE('.date('Y.m.d H:i:s',$this->holidays[$i]['date']).')<br>'."\n";
}
2001-05-03 04:28:26 +02:00
}
2001-05-03 01:23:48 +02:00
}
$datetime = mktime ( 0 , 0 , 0 , $holiday [ 'month' ], $day , $this -> year ) - $this -> tz_offset ;
// echo 'Calculating for year('.$this->year.') month('.$holiday['month'].') dow('.$holiday['dow'].') occurence('.$holiday['occurence'].') datetime('.$datetime.') DATE('.date('Y.m.d H:i:s',$datetime).')<br>'."\n";
return $datetime ;
}
2001-04-30 05:07:05 +02:00
function read_holiday ()
{
global $phpgw ;
2001-05-03 01:23:48 +02:00
2001-05-03 04:28:26 +02:00
$this -> year = intval ( $phpgw -> calendar -> tempyear );
2001-05-03 01:23:48 +02:00
$this -> tz_offset = intval ( $phpgw -> calendar -> tz_offset );
2001-04-30 05:07:05 +02:00
$sql = $this -> build_holiday_query ();
$this -> holidays = Null ;
$this -> db -> query ( $sql , __LINE__ , __FILE__ );
2001-05-03 04:28:26 +02:00
$i = 0 ;
2001-04-30 05:07:05 +02:00
while ( $this -> db -> next_record ())
{
2001-05-15 06:05:38 +02:00
$this -> index [ $this -> db -> f ( 'hol_id' )] = $i ;
2001-04-30 05:07:05 +02:00
$this -> holidays [ $i ][ 'locale' ] = $this -> db -> f ( 'locale' );
2001-05-01 05:26:17 +02:00
$this -> holidays [ $i ][ 'name' ] = $phpgw -> strip_html ( $this -> db -> f ( 'name' ));
2001-05-03 01:23:48 +02:00
$this -> holidays [ $i ][ 'day' ] = intval ( $this -> db -> f ( 'mday' ));
$this -> holidays [ $i ][ 'month' ] = intval ( $this -> db -> f ( 'month_num' ));
$this -> holidays [ $i ][ 'occurence' ] = intval ( $this -> db -> f ( 'occurence' ));
$this -> holidays [ $i ][ 'dow' ] = intval ( $this -> db -> f ( 'dow' ));
2001-05-15 06:05:38 +02:00
$this -> holidays [ $i ][ 'observance_rule' ] = $this -> db -> f ( 'observance_rule' );
2001-05-13 05:55:09 +02:00
if ( count ( $this -> users ) == 2 && $this -> users [ 0 ] != $this -> users [ 1 ])
2001-04-30 05:07:05 +02:00
{
2001-05-13 05:55:09 +02:00
if ( $this -> holidays [ $i ][ 'locale' ] == $this -> users [ 1 ])
2001-04-30 05:07:05 +02:00
{
$this -> holidays [ $i ][ 'owner' ] = 'user' ;
}
else
{
$this -> holidays [ $i ][ 'owner' ] = 'owner' ;
}
}
else
{
$this -> holidays [ $i ][ 'owner' ] = 'user' ;
}
2001-05-03 04:28:26 +02:00
$c = $i ;
$this -> holidays [ $i ][ 'date' ] = $this -> calculate_date ( $this -> holidays [ $i ], $c );
if ( $c != $i )
{
$i = $c ;
}
$i ++ ;
2001-04-30 05:07:05 +02:00
}
2001-05-01 05:26:17 +02:00
$this -> holidays = $this -> sort_by_date ( $this -> holidays );
2001-04-30 05:07:05 +02:00
return $this -> holidays ;
}
function build_holiday_query ()
{
$sql = 'SELECT * FROM phpgw_cal_holidays WHERE locale in (' ;
$find_it = '' ;
reset ( $this -> users );
while ( list ( $key , $value ) = each ( $this -> users ))
{
if ( $find_it )
{
$find_it .= ',' ;
}
$find_it .= " ' " . $value . " ' " ;
}
$sql .= $find_it . ')' ;
return $sql ;
}
2001-05-01 05:26:17 +02:00
function sort_by_date ( $holidays )
{
2001-05-03 01:23:48 +02:00
$c_holidays = count ( $holidays );
2001-05-01 05:26:17 +02:00
for ( $outer_loop = 0 ; $outer_loop < ( $c_holidays - 1 ); $outer_loop ++ )
{
$outer_date = $holidays [ $outer_loop ][ 'date' ];
for ( $inner_loop = $outer_loop ; $inner_loop < $c_holidays ; $inner_loop ++ )
{
$inner_date = $holidays [ $inner_loop ][ 'date' ];
if ( $outer_date > $inner_date )
{
$temp = $holidays [ $inner_loop ];
$holidays [ $inner_loop ] = $holidays [ $outer_loop ];
$holidays [ $outer_loop ] = $temp ;
}
}
}
return $holidays ;
}
function find_date ( $date )
{
global $phpgw ;
2001-05-13 05:55:09 +02:00
2001-05-01 05:26:17 +02:00
$c_holidays = count ( $this -> holidays );
for ( $i = 0 ; $i < $c_holidays ; $i ++ )
{
if ( $this -> holidays [ $i ][ 'date' ] > $date )
{
2001-05-01 21:29:38 +02:00
$i = $c_holidays + 1 ;
2001-05-01 05:26:17 +02:00
}
elseif ( $this -> holidays [ $i ][ 'date' ] == $date )
{
$return_value [] = $i ;
}
}
// echo 'Searching for '.$phpgw->common->show_date($date).' Found = '.count($return_value)."<br>\n";
if ( isset ( $return_value ))
{
return $return_value ;
}
else
{
return False ;
}
}
2001-05-15 06:05:38 +02:00
function get_holiday ( $index )
{
return $this -> holidays [ $index ];
}
2001-05-01 05:26:17 +02:00
function get_name ( $id )
{
return $this -> holidays [ $id ][ 'name' ];
}
2001-04-30 05:07:05 +02:00
}
?>