Ignore:
Timestamp:
Apr 13, 2019, 8:05:15 PM (5 years ago)
Author:
roby
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/client/modules/Elezioni/grafici/jpgraph_date.php

    r2 r265  
    11<?php
    22/*=======================================================================
    3 // File:        JPGRAPH_DATE.PHP
    4 // Description: Classes to handle Date scaling
    5 // Created:     2005-05-02
    6 // Ver:         $Id: jpgraph_date.php 1091 2009-01-18 22:57:40Z ljp $
    7 //
    8 // Copyright (c) Aditus Consulting. All rights reserved.
    9 //========================================================================
    10 */
     3 // File:        JPGRAPH_DATE.PHP
     4 // Description: Classes to handle Date scaling
     5 // Created:     2005-05-02
     6 // Ver:         $Id: jpgraph_date.php 1106 2009-02-22 20:16:35Z ljp $
     7 //
     8 // Copyright (c) Asial Corporation. All rights reserved.
     9 //========================================================================
     10 */
    1111
    1212define('HOURADJ_1',0+30);
     
    5252    private $iStartTimeAlign = false, $iEndTimeAlign = false;
    5353
    54 //---------------
    55 // CONSTRUCTOR
    56     function DateScale($aMin=0,$aMax=0,$aType='x') {
    57         assert($aType=="x");
    58         assert($aMin<=$aMax);
    59                
    60         $this->type=$aType;
    61         $this->scale=array($aMin,$aMax);               
    62         $this->world_size=$aMax-$aMin; 
    63         $this->ticks = new LinearTicks();
    64         $this->intscale=true;
    65     }
    66 
    67 
    68 //------------------------------------------------------------------------------------------
    69 // Utility Function AdjDate()
    70 // Description: Will round a given time stamp to an even year, month or day
    71 // argument.
    72 //------------------------------------------------------------------------------------------
     54    //---------------
     55    // CONSTRUCTOR
     56    function __construct($aMin=0,$aMax=0,$aType='x') {
     57        assert($aType=="x");
     58        assert($aMin<=$aMax);
     59
     60        $this->type=$aType;
     61        $this->scale=array($aMin,$aMax);
     62        $this->world_size=$aMax-$aMin;
     63        $this->ticks = new LinearTicks();
     64        $this->intscale=true;
     65    }
     66
     67
     68    //------------------------------------------------------------------------------------------
     69    // Utility Function AdjDate()
     70    // Description: Will round a given time stamp to an even year, month or day
     71    // argument.
     72    //------------------------------------------------------------------------------------------
    7373
    7474    function AdjDate($aTime,$aRound=0,$aYearType=false,$aMonthType=false,$aDayType=false) {
    75         $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
    76         $h=0;$i=0;$s=0;
    77         if( $aYearType !== false ) {
    78             $yearAdj = array(0=>1, 1=>2, 2=>5);
    79             if( $aRound == 0 ) {
    80                 $y = floor($y/$yearAdj[$aYearType])*$yearAdj[$aYearType];
    81             }
    82             else {
    83                 ++$y;
    84                 $y = ceil($y/$yearAdj[$aYearType])*$yearAdj[$aYearType];
    85             }
    86             $m=1;$d=1;
    87         }
    88         elseif( $aMonthType !== false ) {
    89             $monthAdj = array(0=>1, 1=>6);
    90             if( $aRound == 0 ) {
    91                 $m = floor($m/$monthAdj[$aMonthType])*$monthAdj[$aMonthType];
    92                 $d=1;
    93             }
    94             else {
    95                 ++$m;
    96                 $m = ceil($m/$monthAdj[$aMonthType])*$monthAdj[$aMonthType];
    97                 $d=1;
    98             }
    99         }
    100         elseif( $aDayType !== false ) {
    101             if( $aDayType == 0 ) {
    102                 if( $aRound == 1 ) {
    103                     //++$d;
    104                     $h=23;$i=59;$s=59;
    105                 }
    106             }
    107             else {
    108                 // Adjust to an even week boundary.
    109                 $w = (int)date('w',$aTime); // Day of week 0=Sun, 6=Sat
    110                 if( true ) { // Adjust to start on Mon
    111                     if( $w==0 ) $w=6;
    112                     else --$w;
    113                 }
    114                 if( $aRound == 0 ) {
    115                     $d -= $w;
    116                 }
    117                 else {
    118                     $d += (7-$w);
    119                     $h=23;$i=59;$s=59;
    120                 }
    121             }
    122         }
    123         return mktime($h,$i,$s,$m,$d,$y);
    124        
    125     }
    126 
    127 //------------------------------------------------------------------------------------------
    128 // Wrapper for AdjDate that will round a timestamp to an even date rounding
    129 // it downwards.
    130 //------------------------------------------------------------------------------------------
     75        $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
     76        $h=0;$i=0;$s=0;
     77        if( $aYearType !== false ) {
     78            $yearAdj = array(0=>1, 1=>2, 2=>5);
     79            if( $aRound == 0 ) {
     80                $y = floor($y/$yearAdj[$aYearType])*$yearAdj[$aYearType];
     81            }
     82            else {
     83                ++$y;
     84                $y = ceil($y/$yearAdj[$aYearType])*$yearAdj[$aYearType];
     85            }
     86            $m=1;$d=1;
     87        }
     88        elseif( $aMonthType !== false ) {
     89            $monthAdj = array(0=>1, 1=>6);
     90            if( $aRound == 0 ) {
     91                $m = floor($m/$monthAdj[$aMonthType])*$monthAdj[$aMonthType];
     92                $d=1;
     93            }
     94            else {
     95                ++$m;
     96                $m = ceil($m/$monthAdj[$aMonthType])*$monthAdj[$aMonthType];
     97                $d=1;
     98            }
     99        }
     100        elseif( $aDayType !== false ) {
     101            if( $aDayType == 0 ) {
     102                if( $aRound == 1 ) {
     103                    //++$d;
     104                    $h=23;$i=59;$s=59;
     105                }
     106            }
     107            else {
     108                // Adjust to an even week boundary.
     109                $w = (int)date('w',$aTime); // Day of week 0=Sun, 6=Sat
     110                if( true ) { // Adjust to start on Mon
     111                    if( $w==0 ) $w=6;
     112                    else --$w;
     113                }
     114                if( $aRound == 0 ) {
     115                    $d -= $w;
     116                }
     117                else {
     118                    $d += (7-$w);
     119                    $h=23;$i=59;$s=59;
     120                }
     121            }
     122        }
     123        return mktime($h,$i,$s,$m,$d,$y);
     124
     125    }
     126
     127    //------------------------------------------------------------------------------------------
     128    // Wrapper for AdjDate that will round a timestamp to an even date rounding
     129    // it downwards.
     130    //------------------------------------------------------------------------------------------
    131131    function AdjStartDate($aTime,$aYearType=false,$aMonthType=false,$aDayType=false) {
    132         return $this->AdjDate($aTime,0,$aYearType,$aMonthType,$aDayType);
    133     }
    134 
    135 //------------------------------------------------------------------------------------------
    136 // Wrapper for AdjDate that will round a timestamp to an even date rounding
    137 // it upwards
    138 //------------------------------------------------------------------------------------------
     132        return $this->AdjDate($aTime,0,$aYearType,$aMonthType,$aDayType);
     133    }
     134
     135    //------------------------------------------------------------------------------------------
     136    // Wrapper for AdjDate that will round a timestamp to an even date rounding
     137    // it upwards
     138    //------------------------------------------------------------------------------------------
    139139    function AdjEndDate($aTime,$aYearType=false,$aMonthType=false,$aDayType=false) {
    140         return $this->AdjDate($aTime,1,$aYearType,$aMonthType,$aDayType);
    141     }
    142 
    143 //------------------------------------------------------------------------------------------
    144 // Utility Function AdjTime()
    145 // Description: Will round a given time stamp to an even time according to
    146 // argument.
    147 //------------------------------------------------------------------------------------------
     140        return $this->AdjDate($aTime,1,$aYearType,$aMonthType,$aDayType);
     141    }
     142
     143    //------------------------------------------------------------------------------------------
     144    // Utility Function AdjTime()
     145    // Description: Will round a given time stamp to an even time according to
     146    // argument.
     147    //------------------------------------------------------------------------------------------
    148148
    149149    function AdjTime($aTime,$aRound=0,$aHourType=false,$aMinType=false,$aSecType=false) {
    150         $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
    151         $h = (int)date('H',$aTime); $i = (int)date('i',$aTime); $s = (int)date('s',$aTime);
    152         if( $aHourType !== false ) {
    153             $aHourType %= 6;
    154             $hourAdj = array(0=>1, 1=>2, 2=>3, 3=>4, 4=>6, 5=>12);
    155             if( $aRound == 0 )
    156                 $h = floor($h/$hourAdj[$aHourType])*$hourAdj[$aHourType];
    157             else {
    158                 if( ($h % $hourAdj[$aHourType]==0) && ($i > 0 || $s > 0) ) {
    159                     $h++;
    160                 }
    161                 $h = ceil($h/$hourAdj[$aHourType])*$hourAdj[$aHourType];
    162                 if( $h >= 24 ) {
    163                     $aTime += 86400;
    164                     $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
    165                     $h -= 24;
    166                 }
    167             }
    168             $i=0;$s=0;
    169         }
    170         elseif( $aMinType !== false ) {
    171             $aMinType %= 5;
    172             $minAdj = array(0=>1, 1=>5, 2=>10, 3=>15, 4=>30);
    173             if( $aRound == 0 ) {
    174                 $i = floor($i/$minAdj[$aMinType])*$minAdj[$aMinType];
    175             }
    176             else {
    177                 if( ($i % $minAdj[$aMinType]==0) && $s > 0 ) {
    178                     $i++;
    179                 }
    180                 $i = ceil($i/$minAdj[$aMinType])*$minAdj[$aMinType];
    181                 if( $i >= 60) {
    182                     $aTime += 3600;
    183                     $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
    184                     $h = (int)date('H',$aTime); $i = 0;
    185                 }
    186             }
    187             $s=0;
    188         }
    189         elseif( $aSecType !== false ) {
    190             $aSecType %= 5;
    191             $secAdj = array(0=>1, 1=>5, 2=>10, 3=>15, 4=>30);
    192             if( $aRound == 0 ) {
    193                 $s = floor($s/$secAdj[$aSecType])*$secAdj[$aSecType];
    194             }
    195             else {
    196                 $s = ceil($s/$secAdj[$aSecType]*1.0)*$secAdj[$aSecType];
    197                 if( $s >= 60) {
    198                     $s=0;
    199                     $aTime += 60;
    200                     $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
    201                     $h = (int)date('H',$aTime); $i = (int)date('i',$aTime);
    202                 }
    203             }
    204         }
    205         return mktime($h,$i,$s,$m,$d,$y);
    206     }
    207 
    208 //------------------------------------------------------------------------------------------
    209 // Wrapper for AdjTime that will round a timestamp to an even time rounding
    210 // it downwards.
    211 // Example: AdjStartTime(mktime(18,27,13,2,22,2005),false,2) => 18:20
    212 //------------------------------------------------------------------------------------------
     150        $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
     151        $h = (int)date('H',$aTime); $i = (int)date('i',$aTime); $s = (int)date('s',$aTime);
     152        if( $aHourType !== false ) {
     153            $aHourType %= 6;
     154            $hourAdj = array(0=>1, 1=>2, 2=>3, 3=>4, 4=>6, 5=>12);
     155            if( $aRound == 0 )
     156            $h = floor($h/$hourAdj[$aHourType])*$hourAdj[$aHourType];
     157            else {
     158                if( ($h % $hourAdj[$aHourType]==0) && ($i > 0 || $s > 0) ) {
     159                    $h++;
     160                }
     161                $h = ceil($h/$hourAdj[$aHourType])*$hourAdj[$aHourType];
     162                if( $h >= 24 ) {
     163                    $aTime += 86400;
     164                    $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
     165                    $h -= 24;
     166                }
     167            }
     168            $i=0;$s=0;
     169        }
     170        elseif( $aMinType !== false ) {
     171            $aMinType %= 5;
     172            $minAdj = array(0=>1, 1=>5, 2=>10, 3=>15, 4=>30);
     173            if( $aRound == 0 ) {
     174                $i = floor($i/$minAdj[$aMinType])*$minAdj[$aMinType];
     175            }
     176            else {
     177                if( ($i % $minAdj[$aMinType]==0) && $s > 0 ) {
     178                    $i++;
     179                }
     180                $i = ceil($i/$minAdj[$aMinType])*$minAdj[$aMinType];
     181                if( $i >= 60) {
     182                    $aTime += 3600;
     183                    $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
     184                    $h = (int)date('H',$aTime); $i = 0;
     185                }
     186            }
     187            $s=0;
     188        }
     189        elseif( $aSecType !== false ) {
     190            $aSecType %= 5;
     191            $secAdj = array(0=>1, 1=>5, 2=>10, 3=>15, 4=>30);
     192            if( $aRound == 0 ) {
     193                $s = floor($s/$secAdj[$aSecType])*$secAdj[$aSecType];
     194            }
     195            else {
     196                $s = ceil($s/$secAdj[$aSecType]*1.0)*$secAdj[$aSecType];
     197                if( $s >= 60) {
     198                    $s=0;
     199                    $aTime += 60;
     200                    $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
     201                    $h = (int)date('H',$aTime); $i = (int)date('i',$aTime);
     202                }
     203            }
     204        }
     205        return mktime($h,$i,$s,$m,$d,$y);
     206    }
     207
     208    //------------------------------------------------------------------------------------------
     209    // Wrapper for AdjTime that will round a timestamp to an even time rounding
     210    // it downwards.
     211    // Example: AdjStartTime(mktime(18,27,13,2,22,2005),false,2) => 18:20
     212    //------------------------------------------------------------------------------------------
    213213    function AdjStartTime($aTime,$aHourType=false,$aMinType=false,$aSecType=false) {
    214         return $this->AdjTime($aTime,0,$aHourType,$aMinType,$aSecType);
    215     }
    216 
    217 //------------------------------------------------------------------------------------------
    218 // Wrapper for AdjTime that will round a timestamp to an even time rounding
    219 // it upwards
    220 // Example: AdjEndTime(mktime(18,27,13,2,22,2005),false,2) => 18:30
    221 //------------------------------------------------------------------------------------------
     214        return $this->AdjTime($aTime,0,$aHourType,$aMinType,$aSecType);
     215    }
     216
     217    //------------------------------------------------------------------------------------------
     218    // Wrapper for AdjTime that will round a timestamp to an even time rounding
     219    // it upwards
     220    // Example: AdjEndTime(mktime(18,27,13,2,22,2005),false,2) => 18:30
     221    //------------------------------------------------------------------------------------------
    222222    function AdjEndTime($aTime,$aHourType=false,$aMinType=false,$aSecType=false) {
    223         return $this->AdjTime($aTime,1,$aHourType,$aMinType,$aSecType);
    224     }
    225 
    226 //------------------------------------------------------------------------------------------
    227 // DateAutoScale
    228 // Autoscale a date axis given start and end time
    229 // Returns an array ($start,$end,$major,$minor,$format)
    230 //------------------------------------------------------------------------------------------
     223        return $this->AdjTime($aTime,1,$aHourType,$aMinType,$aSecType);
     224    }
     225
     226    //------------------------------------------------------------------------------------------
     227    // DateAutoScale
     228    // Autoscale a date axis given start and end time
     229    // Returns an array ($start,$end,$major,$minor,$format)
     230    //------------------------------------------------------------------------------------------
    231231    function DoDateAutoScale($aStartTime,$aEndTime,$aDensity=0,$aAdjust=true) {
    232         // Format of array
    233         // array ( Decision point,  array( array( Major-scale-step-array ), 
    234         //                          array( Minor-scale-step-array ),
    235         //                          array( 0=date-adjust, 1=time-adjust, adjustment-alignment) )
    236         //
    237         $scalePoints =
    238             array(
    239                 /* Intervall larger than 10 years */
    240                 SECPERYEAR*10,array(array(SECPERYEAR*5,SECPERYEAR*2),
    241                                     array(SECPERYEAR),
    242                                     array(0,YEARADJ_1, 0,YEARADJ_1) ),
    243 
    244                 /* Intervall larger than 2 years */
    245                 SECPERYEAR*2,array(array(SECPERYEAR),array(SECPERYEAR),
    246                                    array(0,YEARADJ_1) ),
    247 
    248                 /* Intervall larger than 90 days (approx 3 month) */
    249                 SECPERDAY*90,array(array(SECPERDAY*30,SECPERDAY*14,SECPERDAY*7,SECPERDAY),
    250                                    array(SECPERDAY*5,SECPERDAY*7,SECPERDAY,SECPERDAY),
    251                                    array(0,MONTHADJ_1, 0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1)),
    252 
    253                 /* Intervall larger than 30 days (approx 1 month) */
    254                 SECPERDAY*30,array(array(SECPERDAY*14,SECPERDAY*7,SECPERDAY*2, SECPERDAY),
    255                                    array(SECPERDAY,SECPERDAY,SECPERDAY,SECPERDAY),
    256                                    array(0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1, 0,DAYADJ_1)),
    257 
    258                 /* Intervall larger than 7 days */
    259                 SECPERDAY*7,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2),
    260                                   array(SECPERHOUR*6,SECPERHOUR*3,SECPERHOUR,SECPERHOUR),
    261                                   array(0,DAYADJ_1, 1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1)),
    262 
    263                 /* Intervall larger than 1 day */
    264                 SECPERDAY,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR),
    265                                 array(SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR,SECPERHOUR,SECPERHOUR),
    266                                 array(1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1, 1,HOURADJ_1)),
    267 
    268                 /* Intervall larger than 12 hours */
    269                 SECPERHOUR*12,array(array(SECPERHOUR*2,SECPERHOUR,SECPERMIN*30,900,600),
    270                                     array(1800,1800,900,300,300),
    271                                     array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ),
    272 
    273                 /* Intervall larger than 2 hours */
    274                 SECPERHOUR*2,array(array(SECPERHOUR,SECPERMIN*30,900,600,300),
    275                                    array(1800,900,300,120,60),
    276                                    array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ),
    277 
    278                 /* Intervall larger than 1 hours */
    279                 SECPERHOUR,array(array(SECPERMIN*30,900,600,300),array(900,300,120,60),
    280                                 array(1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ),
    281 
    282                 /* Intervall larger than 30 min */
    283                 SECPERMIN*30,array(array(SECPERMIN*15,SECPERMIN*10,SECPERMIN*5,SECPERMIN),
    284                                    array(300,300,60,10),
    285                                    array(1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5, 1,MINADJ_1)),
    286 
    287                 /* Intervall larger than 1 min */
    288                 SECPERMIN,array(array(SECPERMIN,15,10,5),
    289                                 array(15,5,2,1),
    290                                 array(1,MINADJ_1, 1,SECADJ_15, 1,SECADJ_10, 1,SECADJ_5)),
    291 
    292                 /* Intervall larger than 10 sec */
    293                 10,array(array(5,2),
    294                         array(1,1),
    295                         array(1,SECADJ_5, 1,SECADJ_1)),
    296 
    297                 /* Intervall larger than 1 sec */
    298                 1,array(array(1),
    299                         array(1),
    300                         array(1,SECADJ_1)),
    301                 );
    302 
    303         $ns = count($scalePoints);
    304         // Establish major and minor scale units for the date scale
    305         $diff = $aEndTime - $aStartTime;
    306         if( $diff < 1 ) return false;
    307         $done=false;
    308         $i=0;
    309         while( ! $done ) {
    310             if( $diff > $scalePoints[2*$i] ) {
    311                 // Get major and minor scale for this intervall
    312                 $scaleSteps = $scalePoints[2*$i+1];
    313                 $major = $scaleSteps[0][min($aDensity,count($scaleSteps[0])-1)];
    314                 // Try to find out which minor step looks best
    315                 $minor = $scaleSteps[1][min($aDensity,count($scaleSteps[1])-1)];
    316                 if( $aAdjust ) {
    317                     // Find out how we should align the start and end timestamps
    318                     $idx = 2*min($aDensity,floor(count($scaleSteps[2])/2)-1);
    319                     if( $scaleSteps[2][$idx] === 0 ) {
    320                         // Use date adjustment
    321                         $adj = $scaleSteps[2][$idx+1];
    322                         if( $adj >= 30 ) {
    323                             $start = $this->AdjStartDate($aStartTime,$adj-30);
    324                             $end   = $this->AdjEndDate($aEndTime,$adj-30);
    325                         }
    326                         elseif( $adj >= 20 ) {
    327                             $start = $this->AdjStartDate($aStartTime,false,$adj-20);
    328                             $end   = $this->AdjEndDate($aEndTime,false,$adj-20);
    329                         }
    330                         else {
    331                             $start = $this->AdjStartDate($aStartTime,false,false,$adj);
    332                             $end   = $this->AdjEndDate($aEndTime,false,false,$adj);
    333                             // We add 1 second for date adjustment to make sure we end on 00:00 the following day
    334                             // This makes the final major tick be srawn when we step day-by-day instead of ending
    335                             // on xx:59:59 which would not draw the final major tick
    336                             $end++;     
    337                         }
    338                     }
    339                     else {
    340                         // Use time adjustment
    341                         $adj = $scaleSteps[2][$idx+1];
    342                         if( $adj >= 30 ) {
    343                             $start = $this->AdjStartTime($aStartTime,$adj-30);
    344                             $end   = $this->AdjEndTime($aEndTime,$adj-30);
    345                         }
    346                         elseif( $adj >= 20 ) {
    347                             $start = $this->AdjStartTime($aStartTime,false,$adj-20);
    348                             $end   = $this->AdjEndTime($aEndTime,false,$adj-20);
    349                         }
    350                         else {
    351                             $start = $this->AdjStartTime($aStartTime,false,false,$adj);
    352                             $end   = $this->AdjEndTime($aEndTime,false,false,$adj);                 
    353                         }
    354                     }
    355                 }
    356                 // If the overall date span is larger than 1 day ten we show date
    357                 $format = '';
    358                 if( ($end-$start) > SECPERDAY ) {
    359                     $format = 'Y-m-d ';
    360                 }
    361                 // If the major step is less than 1 day we need to whow hours + min
    362                 if( $major < SECPERDAY ) {
    363                     $format .= 'H:i';
    364                 }
    365                 // If the major step is less than 1 min we need to show sec
    366                 if( $major < 60 ) {
    367                     $format .= ':s';
    368                 }
    369                 $done=true;
    370             }
    371             ++$i;
    372         }
    373         return array($start,$end,$major,$minor,$format);
     232        // Format of array
     233        // array ( Decision point,  array( array( Major-scale-step-array ),
     234        //       array( Minor-scale-step-array ),
     235        //       array( 0=date-adjust, 1=time-adjust, adjustment-alignment) )
     236        //
     237        $scalePoints =
     238        array(
     239        /* Intervall larger than 10 years */
     240        SECPERYEAR*10,array(array(SECPERYEAR*5,SECPERYEAR*2),
     241        array(SECPERYEAR),
     242        array(0,YEARADJ_1, 0,YEARADJ_1) ),
     243
     244        /* Intervall larger than 2 years */
     245        SECPERYEAR*2,array(array(SECPERYEAR),array(SECPERYEAR),
     246        array(0,YEARADJ_1) ),
     247
     248        /* Intervall larger than 90 days (approx 3 month) */
     249        SECPERDAY*90,array(array(SECPERDAY*30,SECPERDAY*14,SECPERDAY*7,SECPERDAY),
     250        array(SECPERDAY*5,SECPERDAY*7,SECPERDAY,SECPERDAY),
     251        array(0,MONTHADJ_1, 0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1)),
     252
     253        /* Intervall larger than 30 days (approx 1 month) */
     254        SECPERDAY*30,array(array(SECPERDAY*14,SECPERDAY*7,SECPERDAY*2, SECPERDAY),
     255        array(SECPERDAY,SECPERDAY,SECPERDAY,SECPERDAY),
     256        array(0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1, 0,DAYADJ_1)),
     257
     258        /* Intervall larger than 7 days */
     259        SECPERDAY*7,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2),
     260        array(SECPERHOUR*6,SECPERHOUR*3,SECPERHOUR,SECPERHOUR),
     261        array(0,DAYADJ_1, 1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1)),
     262
     263        /* Intervall larger than 1 day */
     264        SECPERDAY,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR),
     265        array(SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR,SECPERHOUR,SECPERHOUR),
     266        array(1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1, 1,HOURADJ_1)),
     267
     268        /* Intervall larger than 12 hours */
     269        SECPERHOUR*12,array(array(SECPERHOUR*2,SECPERHOUR,SECPERMIN*30,900,600),
     270        array(1800,1800,900,300,300),
     271        array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ),
     272
     273        /* Intervall larger than 2 hours */
     274        SECPERHOUR*2,array(array(SECPERHOUR,SECPERMIN*30,900,600,300),
     275        array(1800,900,300,120,60),
     276        array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ),
     277
     278        /* Intervall larger than 1 hours */
     279        SECPERHOUR,array(array(SECPERMIN*30,900,600,300),array(900,300,120,60),
     280        array(1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ),
     281
     282        /* Intervall larger than 30 min */
     283        SECPERMIN*30,array(array(SECPERMIN*15,SECPERMIN*10,SECPERMIN*5,SECPERMIN),
     284        array(300,300,60,10),
     285        array(1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5, 1,MINADJ_1)),
     286
     287        /* Intervall larger than 1 min */
     288        SECPERMIN,array(array(SECPERMIN,15,10,5),
     289        array(15,5,2,1),
     290        array(1,MINADJ_1, 1,SECADJ_15, 1,SECADJ_10, 1,SECADJ_5)),
     291
     292        /* Intervall larger than 10 sec */
     293        10,array(array(5,2),
     294        array(1,1),
     295        array(1,SECADJ_5, 1,SECADJ_1)),
     296
     297        /* Intervall larger than 1 sec */
     298        1,array(array(1),
     299        array(1),
     300        array(1,SECADJ_1)),
     301        );
     302
     303        $ns = count($scalePoints);
     304        // Establish major and minor scale units for the date scale
     305        $diff = $aEndTime - $aStartTime;
     306        if( $diff < 1 ) return false;
     307        $done=false;
     308        $i=0;
     309        while( ! $done ) {
     310            if( $diff > $scalePoints[2*$i] ) {
     311                // Get major and minor scale for this intervall
     312                $scaleSteps = $scalePoints[2*$i+1];
     313                $major = $scaleSteps[0][min($aDensity,count($scaleSteps[0])-1)];
     314                // Try to find out which minor step looks best
     315                $minor = $scaleSteps[1][min($aDensity,count($scaleSteps[1])-1)];
     316                if( $aAdjust ) {
     317                    // Find out how we should align the start and end timestamps
     318                    $idx = 2*min($aDensity,floor(count($scaleSteps[2])/2)-1);
     319                    if( $scaleSteps[2][$idx] === 0 ) {
     320                        // Use date adjustment
     321                        $adj = $scaleSteps[2][$idx+1];
     322                        if( $adj >= 30 ) {
     323                            $start = $this->AdjStartDate($aStartTime,$adj-30);
     324                            $end   = $this->AdjEndDate($aEndTime,$adj-30);
     325                        }
     326                        elseif( $adj >= 20 ) {
     327                            $start = $this->AdjStartDate($aStartTime,false,$adj-20);
     328                            $end   = $this->AdjEndDate($aEndTime,false,$adj-20);
     329                        }
     330                        else {
     331                            $start = $this->AdjStartDate($aStartTime,false,false,$adj);
     332                            $end   = $this->AdjEndDate($aEndTime,false,false,$adj);
     333                            // We add 1 second for date adjustment to make sure we end on 00:00 the following day
     334                            // This makes the final major tick be srawn when we step day-by-day instead of ending
     335                            // on xx:59:59 which would not draw the final major tick
     336                            $end++;
     337                        }
     338                    }
     339                    else {
     340                        // Use time adjustment
     341                        $adj = $scaleSteps[2][$idx+1];
     342                        if( $adj >= 30 ) {
     343                            $start = $this->AdjStartTime($aStartTime,$adj-30);
     344                            $end   = $this->AdjEndTime($aEndTime,$adj-30);
     345                        }
     346                        elseif( $adj >= 20 ) {
     347                            $start = $this->AdjStartTime($aStartTime,false,$adj-20);
     348                            $end   = $this->AdjEndTime($aEndTime,false,$adj-20);
     349                        }
     350                        else {
     351                            $start = $this->AdjStartTime($aStartTime,false,false,$adj);
     352                            $end   = $this->AdjEndTime($aEndTime,false,false,$adj);
     353                        }
     354                    }
     355                }
     356                // If the overall date span is larger than 1 day ten we show date
     357                $format = '';
     358                if( ($end-$start) > SECPERDAY ) {
     359                    $format = 'Y-m-d ';
     360                }
     361                // If the major step is less than 1 day we need to whow hours + min
     362                if( $major < SECPERDAY ) {
     363                    $format .= 'H:i';
     364                }
     365                // If the major step is less than 1 min we need to show sec
     366                if( $major < 60 ) {
     367                    $format .= ':s';
     368                }
     369                $done=true;
     370            }
     371            ++$i;
     372        }
     373        return array($start,$end,$major,$minor,$format);
    374374    }
    375375
    376376    // Overrides the automatic determined date format. Must be a valid date() format string
    377377    function SetDateFormat($aFormat) {
    378         $this->date_format = $aFormat;
    379         $this->ticks->SetLabelDateFormat($this->date_format);
     378        $this->date_format = $aFormat;
     379        $this->ticks->SetLabelDateFormat($this->date_format);
    380380    }
    381381
    382382    function AdjustForDST($aFlg=true) {
    383         $this->ticks->AdjustForDST($aFlg);
     383        $this->ticks->AdjustForDST($aFlg);
    384384    }
    385385
    386386
    387387    function SetDateAlign($aStartAlign,$aEndAlign=false) {
    388         if( $aEndAlign === false ) {
    389             $aEndAlign=$aStartAlign;
    390         }
    391         $this->iStartAlign = $aStartAlign;
    392         $this->iEndAlign = $aEndAlign;
     388        if( $aEndAlign === false ) {
     389            $aEndAlign=$aStartAlign;
     390        }
     391        $this->iStartAlign = $aStartAlign;
     392        $this->iEndAlign = $aEndAlign;
    393393    }
    394394
    395395    function SetTimeAlign($aStartAlign,$aEndAlign=false) {
    396         if( $aEndAlign === false ) {
    397             $aEndAlign=$aStartAlign;
    398         }
    399         $this->iStartTimeAlign = $aStartAlign;
    400         $this->iEndTimeAlign = $aEndAlign;
     396        if( $aEndAlign === false ) {
     397            $aEndAlign=$aStartAlign;
     398        }
     399        $this->iStartTimeAlign = $aStartAlign;
     400        $this->iEndTimeAlign = $aEndAlign;
    401401    }
    402402
    403403
    404404    function AutoScale($img,$aStartTime,$aEndTime,$aNumSteps,$_adummy=false) {
    405         // We need to have one dummy argument to make the signature of AutoScale()
    406         // identical to LinearScale::AutoScale
    407         if( $aStartTime == $aEndTime ) {
    408             // Special case when we only have one data point.
    409             // Create a small artifical intervall to do the autoscaling
    410             $aStartTime -= 10;
    411             $aEndTime += 10;
    412         }
    413         $done=false;
    414         $i=0;
    415         while( ! $done && $i < 5) {
    416             list($adjstart,$adjend,$maj,$min,$format) = $this->DoDateAutoScale($aStartTime,$aEndTime,$i);
    417             $n = floor(($adjend-$adjstart)/$maj);
    418             if( $n * 1.7 > $aNumSteps ) {
    419                 $done=true;
    420             }
    421             $i++;
    422         }
    423        
    424         /*
    425         if( 0 ) { // DEBUG
    426             echo "    Start =".date("Y-m-d H:i:s",$aStartTime)."<br>";
    427             echo "    End   =".date("Y-m-d H:i:s",$aEndTime)."<br>";
    428             echo "Adj Start =".date("Y-m-d H:i:s",$adjstart)."<br>";
    429             echo "Adj End   =".date("Y-m-d H:i:s",$adjend)."<p>";
    430             echo "Major = $maj s, ".floor($maj/60)."min, ".floor($maj/3600)."h, ".floor($maj/86400)."day<br>";
    431             echo "Min = $min s, ".floor($min/60)."min, ".floor($min/3600)."h, ".floor($min/86400)."day<br>";
    432             echo "Format=$format<p>";
    433         }
    434         */
    435        
    436         if( $this->iStartTimeAlign !== false && $this->iStartAlign !== false ) {
    437             JpGraphError::RaiseL(3001);
    438 //('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both');
    439         }
    440 
    441         if( $this->iStartTimeAlign !== false ) {
    442             if( $this->iStartTimeAlign >= 30 ) {
    443                 $adjstart = $this->AdjStartTime($aStartTime,$this->iStartTimeAlign-30);
    444             }
    445             elseif(  $this->iStartTimeAlign >= 20 ) {
    446                 $adjstart = $this->AdjStartTime($aStartTime,false,$this->iStartTimeAlign-20);
    447             }
    448             else {
    449                 $adjstart = $this->AdjStartTime($aStartTime,false,false,$this->iStartTimeAlign);
    450             }
    451         }
    452         if( $this->iEndTimeAlign !== false ) {
    453             if( $this->iEndTimeAlign >= 30 ) {
    454                 $adjend = $this->AdjEndTime($aEndTime,$this->iEndTimeAlign-30);
    455             }
    456             elseif(  $this->iEndTimeAlign >= 20 ) {
    457                 $adjend = $this->AdjEndTime($aEndTime,false,$this->iEndTimeAlign-20);
    458             }
    459             else {
    460                 $adjend = $this->AdjEndTime($aEndTime,false,false,$this->iEndTimeAlign);
    461             }
    462         }
    463 
    464 
    465        
    466         if( $this->iStartAlign !== false ) {
    467             if( $this->iStartAlign >= 30 ) {
    468                 $adjstart = $this->AdjStartDate($aStartTime,$this->iStartAlign-30);
    469             }
    470             elseif(  $this->iStartAlign >= 20 ) {
    471                 $adjstart = $this->AdjStartDate($aStartTime,false,$this->iStartAlign-20);
    472             }
    473             else {
    474                 $adjstart = $this->AdjStartDate($aStartTime,false,false,$this->iStartAlign);
    475             }
    476         }
    477         if( $this->iEndAlign !== false ) {
    478             if( $this->iEndAlign >= 30 ) {
    479                 $adjend = $this->AdjEndDate($aEndTime,$this->iEndAlign-30);
    480             }
    481             elseif(  $this->iEndAlign >= 20 ) {
    482                 $adjend = $this->AdjEndDate($aEndTime,false,$this->iEndAlign-20);
    483             }
    484             else {
    485                 $adjend = $this->AdjEndDate($aEndTime,false,false,$this->iEndAlign);
    486             }
    487         }
    488         $this->Update($img,$adjstart,$adjend);
    489         if( ! $this->ticks->IsSpecified() )
    490             $this->ticks->Set($maj,$min);
    491         if( $this->date_format == '' )
    492             $this->ticks->SetLabelDateFormat($format);
    493         else
    494             $this->ticks->SetLabelDateFormat($this->date_format);
     405        // We need to have one dummy argument to make the signature of AutoScale()
     406        // identical to LinearScale::AutoScale
     407        if( $aStartTime == $aEndTime ) {
     408            // Special case when we only have one data point.
     409            // Create a small artifical intervall to do the autoscaling
     410            $aStartTime -= 10;
     411            $aEndTime += 10;
     412        }
     413        $done=false;
     414        $i=0;
     415        while( ! $done && $i < 5) {
     416            list($adjstart,$adjend,$maj,$min,$format) = $this->DoDateAutoScale($aStartTime,$aEndTime,$i);
     417            $n = floor(($adjend-$adjstart)/$maj);
     418            if( $n * 1.7 > $aNumSteps ) {
     419                $done=true;
     420            }
     421            $i++;
     422        }
     423
     424        /*
     425         if( 0 ) { // DEBUG
     426         echo "    Start =".date("Y-m-d H:i:s",$aStartTime)."<br>";
     427         echo "    End   =".date("Y-m-d H:i:s",$aEndTime)."<br>";
     428         echo "Adj Start =".date("Y-m-d H:i:s",$adjstart)."<br>";
     429         echo "Adj End   =".date("Y-m-d H:i:s",$adjend)."<p>";
     430         echo "Major = $maj s, ".floor($maj/60)."min, ".floor($maj/3600)."h, ".floor($maj/86400)."day<br>";
     431         echo "Min = $min s, ".floor($min/60)."min, ".floor($min/3600)."h, ".floor($min/86400)."day<br>";
     432         echo "Format=$format<p>";
     433         }
     434         */
     435
     436        if( $this->iStartTimeAlign !== false && $this->iStartAlign !== false ) {
     437            JpGraphError::RaiseL(3001);
     438            //('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both');
     439        }
     440
     441        if( $this->iStartTimeAlign !== false ) {
     442            if( $this->iStartTimeAlign >= 30 ) {
     443                $adjstart = $this->AdjStartTime($aStartTime,$this->iStartTimeAlign-30);
     444            }
     445            elseif(  $this->iStartTimeAlign >= 20 ) {
     446                $adjstart = $this->AdjStartTime($aStartTime,false,$this->iStartTimeAlign-20);
     447            }
     448            else {
     449                $adjstart = $this->AdjStartTime($aStartTime,false,false,$this->iStartTimeAlign);
     450            }
     451        }
     452        if( $this->iEndTimeAlign !== false ) {
     453            if( $this->iEndTimeAlign >= 30 ) {
     454                $adjend = $this->AdjEndTime($aEndTime,$this->iEndTimeAlign-30);
     455            }
     456            elseif(  $this->iEndTimeAlign >= 20 ) {
     457                $adjend = $this->AdjEndTime($aEndTime,false,$this->iEndTimeAlign-20);
     458            }
     459            else {
     460                $adjend = $this->AdjEndTime($aEndTime,false,false,$this->iEndTimeAlign);
     461            }
     462        }
     463
     464
     465
     466        if( $this->iStartAlign !== false ) {
     467            if( $this->iStartAlign >= 30 ) {
     468                $adjstart = $this->AdjStartDate($aStartTime,$this->iStartAlign-30);
     469            }
     470            elseif(  $this->iStartAlign >= 20 ) {
     471                $adjstart = $this->AdjStartDate($aStartTime,false,$this->iStartAlign-20);
     472            }
     473            else {
     474                $adjstart = $this->AdjStartDate($aStartTime,false,false,$this->iStartAlign);
     475            }
     476        }
     477        if( $this->iEndAlign !== false ) {
     478            if( $this->iEndAlign >= 30 ) {
     479                $adjend = $this->AdjEndDate($aEndTime,$this->iEndAlign-30);
     480            }
     481            elseif(  $this->iEndAlign >= 20 ) {
     482                $adjend = $this->AdjEndDate($aEndTime,false,$this->iEndAlign-20);
     483            }
     484            else {
     485                $adjend = $this->AdjEndDate($aEndTime,false,false,$this->iEndAlign);
     486            }
     487        }
     488        $this->Update($img,$adjstart,$adjend);
     489        if( ! $this->ticks->IsSpecified() )
     490        $this->ticks->Set($maj,$min);
     491        if( $this->date_format == '' )
     492        $this->ticks->SetLabelDateFormat($format);
     493        else
     494        $this->ticks->SetLabelDateFormat($this->date_format);
    495495    }
    496496}
Note: See TracChangeset for help on using the changeset viewer.