phpOpenTracker/phpOpenTracker/API/plugins access_statistics.php,1.7,1.8 clickpath_analysis.php,1.46,1.47 plot_access_statistics.php,1.20,1.21 plot_top.php,1.17,1.18 returning_visitors.php,1.35,1.36 top.php,1.50,1.51 visitors_online.php,1.24,1.25

Sebastian Bergmann <[email protected]>
Newsgroups gmane.comp.web.phpopentracker.cvs
Message-ID <[email protected]>
Update of /cvsroot/phpopencounter/phpOpenTracker/phpOpenTracker/API/plugins
In directory sc8-pr-cvs1:/tmp/cvs-serv16743/phpOpenTracker/API/plugins

Modified Files:
	access_statistics.php clickpath_analysis.php 
	plot_access_statistics.php plot_top.php returning_visitors.php 
	top.php visitors_online.php 
Log Message:
HEAD is 2.0.0-dev now.

Index: access_statistics.php
===================================================================
RCS file: /cvsroot/phpopencounter/phpOpenTracker/phpOpenTracker/API/plugins/access_statistics.php,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** access_statistics.php	19 Sep 2003 07:17:26 -0000	1.7
--- access_statistics.php	22 Nov 2003 08:47:43 -0000	1.8
***************
*** 22,210 ****
  * @since    phpOpenTracker 1.2.0
  */
! class phpOpenTracker_API_access_statistics extends phpOpenTracker_API_Plugin {
!   /**
!   * API Calls
!   *
!   * @var array $apiCalls
!   */
!   var $apiCalls = array(
!     'page_impressions',
!     'visits'
!   );
! 
!   /**
!   * API Type
!   *
!   * @var string $apiType
!   */
!   var $apiType = 'get';
! 
!   /**
!   * Runs the phpOpenTracker API call.
!   *
!   * @param  array $parameters
!   * @return mixed
!   * @access public
!   */
!   function run($parameters) {
!     $parameters['interval'] = isset($parameters['interval']) ? $parameters['interval'] : false;
! 
!     $intervalStrings = array();
!     $timestamps      = array();
!     $values          = array();
! 
!     switch ($parameters['result_format']) {
!       case 'csv': {
!         if ($parameters['api_call'] == 'page_impressions') {
!           $csv = "Interval;Page Impressions\n";
!         } else {
!           $csv = "Interval;Visits\n";
!         }
!       }
!       break;
! 
!       case 'xml':
!       case 'xml_object': {
!         $tree = new XML_Tree;
! 
!         if ($parameters['api_call'] == 'page_impressions') {
!           $root = &$tree->addRoot('pageimpressions');
!         } else {
!           $root = &$tree->addRoot('visits');
!         }
!       }
!       break;
! 
!       default: {
!         $result = array();
!       }
!     }
! 
!     if ($parameters['interval'] != false) {
!       $start = $parameters['start'] ? $parameters['start'] : 0;
!       $end   = $parameters['end']   ? $parameters['end']   : time();
! 
!       for ($i = $parameters['start']; $i < $parameters['end']; $i += $parameters['interval']) {
!         $correct = ((mktime(0, 0, 0, date('m', $i), date('d', $i) + 1, date('Y', $i))
!                    - mktime(0, 0, 0, date('m', $i), date('d', $i),     date('Y', $i)))
!                    * ($parameters['interval'] / 86400))
!                    - $parameters['interval'];
! 
!         $intervalStrings[] = sprintf(
!           '%s - %s',
! 
!           date('d-m-Y', $i),
!           date('d-m-Y', $i + $parameters['interval'] + $correct)
!         );
! 
!         $values[] = phpOpenTracker::get(
!           array(
!             'client_id'   => $parameters['client_id'],
!             'api_call'    => $parameters['api_call'],
!             'start'       => $i,
!             'end'         => $i + $parameters['interval'] + $correct,
!             'constraints' => $parameters['constraints']
!           )
!         );
! 
!         $timestamps[] = $i;
! 
!         $i += $correct;
!       }
!     } else {
!       $this->db->query(
!         sprintf(
!           "SELECT %s AS result
!              FROM %s accesslog,
!                   %s visitors
!             WHERE visitors.client_id    = '%d'
!               AND visitors.accesslog_id = accesslog.accesslog_id
!                   %s
!                   %s",
! 
!           ($parameters['api_call'] == 'page_impressions') ? 'COUNT(*)' : 'COUNT(DISTINCT(visitors.accesslog_id))',
!           $this->config['accesslog_table'],
!           $this->config['visitors_table'],
!           $parameters['client_id'],
!           $this->_constraint($parameters['constraints']),
!           $this->_whereTimerange(
!             $parameters['start'],
!             $parameters['end'],
!             'accesslog'
!           )
!         )
!       );
! 
!       if ($row = $this->db->fetchRow()) {
!         $values = array(intval($row['result']));
!       } else {
!         $values = array(0);
!       }
! 
!       if ($parameters['start'] != false &&
!           $parameters['end']   != false) {
!         $intervalStrings = array(
!           sprintf(
!             '%s - %s',
! 
!             date('d-m-Y', $parameters['start']),
!             date('d-m-Y', $parameters['end'])
!           )
!         );
!       } else {
!         $intervalStrings = array('');
!       }
!     }
! 
!     switch ($parameters['result_format']) {
!       case 'csv': {
!         for ($i = 0; $i < sizeof($values); $i++) {
!           $csv .= sprintf(
!             "%s;%d\n",
! 
!             $intervalStrings[$i],
!             $values[$i]
!           );
!         }
! 
!         return $csv;
!       }
!       break;
! 
!       case 'xml':
!       case 'xml_object': {
!         for ($i = 0; $i < sizeof($values); $i++) {
!           $intervalChild = &$root->addChild('interval');
! 
!           $intervalChild->addChild('interval', $intervalStrings[$i]);
!           $intervalChild->addChild('value',    $values[$i]);
!         }
! 
!         if ($parameters['result_format'] == 'xml') {
!           return $root->get();
!         } else {
!           return $root;
!         }
!       }
!       break;
! 
!       default: {
!         if (sizeof($values) == 1) {
!           return $values[0];
!         } else {
!           $result = array();
  
!           for ($i = 0; $i < sizeof($values); $i++) {
!             $result[] = array(
!               'timestamp' => $timestamps[$i],
!               'value'     => $values[$i]
!             );
!           }
!         }
  
!         return $result;
!       }
      }
-   }
  }
  
--- 22,52 ----
  * @since    phpOpenTracker 1.2.0
  */
! class phpOpenTracker_API_Plugin_access_statistics extends phpOpenTracker_API_Plugin {
!     /**
!     * API Calls
!     *
!     * @var array $apiCalls
!     */
!     public $apiCalls = array(
!       'page_impressions',
!       'visits'
!     );
  
!     /**
!     * API Type
!     *
!     * @var string $apiType
!     */
!     public $apiType = 'get';
  
!     /**
!     * Runs the phpOpenTracker API call.
!     *
!     * @param  array $parameters
!     * @return mixed
!     * @access public
!     */
!     public function run($parameters) {
      }
  }
  

Index: plot_access_statistics.php
===================================================================
RCS file: /cvsroot/phpopencounter/phpOpenTracker/phpOpenTracker/API/plugins/plot_access_statistics.php,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** plot_access_statistics.php	19 Sep 2003 07:17:27 -0000	1.20
--- plot_access_statistics.php	22 Nov 2003 08:47:43 -0000	1.21
***************
*** 22,222 ****
  * @since    phpOpenTracker 1.0.0
  */
! class phpOpenTracker_API_plot_access_statistics extends phpOpenTracker_API_Plugin {
!   /**
!   * API Calls
!   *
!   * @var array $apiCalls
!   */
!   var $apiCalls = array('access_statistics');
! 
!   /**
!   * API Type
!   *
!   * @var string $apiType
!   */
!   var $apiType = 'plot';
! 
!   /**
!   * Runs the phpOpenTracker API call.
!   *
!   * @param  array $parameters
!   * @return mixed
!   * @access public
!   */
!   function run($parameters) {
!     $parameters['interval']    = isset($parameters['interval'])    ? $parameters['interval']    : false;
!     $parameters['month_names'] = isset($parameters['month_names']) ? $parameters['month_names'] : false;
! 
!     if (!$parameters['month_names']) {
!       $parameters['month_names'] = array(
!         'January',
!         'February',
!         'March',
!         'April',
!         'May',
!         'June',
!         'July',
!         'August',
!         'September',
!         'October',
!         'November',
!         'December'
!       );
!     }
! 
!     $timestamp = time();
! 
!     $steps = array(
!       'hour'  =>     3600,
!       'day'   =>    86400,
!       'month' =>  2592000,
!       'year'  => 31536000
!     );
! 
!     $starttitle = '';
!     $endtitle   = '';
! 
!     switch ($parameters['interval']) {
!       case 'hour': {
!         $starthour   = $hour = date('H', $parameters['start']);
!         $endhour     =         date('H', $parameters['end']);
!         $starttitle .= $starthour . ':00 ';
!         $endtitle   .= $endhour   . ':00 ';
!       }
! 
!       case 'day': {
!         $startday    = $day = date('d', $parameters['start']);
!         $endday      =        date('d', $parameters['end']);
!         $starttitle .= $startday . '. ';
!         $endtitle   .= $endday   . '. ';
!       }
! 
!       case 'month': {
!         $startmonth  = $month = date('m', $parameters['start']);
!         $endmonth    =          date('m', $parameters['end']);
!         $starttitle .= $parameters['month_names'][$startmonth-1] . ' ';
!         $endtitle   .= $parameters['month_names'][$endmonth-1]   . ' ';
!       }
! 
!       case 'year': {
!         $startyear   = $year = date('Y', $parameters['start']);
!         $endyear     =         date('Y', $parameters['end']);
!         $starttitle .= $startyear;
!         $endtitle   .= $endyear;
!       }
!     }
! 
!     $title = $starttitle . ' - ' . $endtitle;
! 
!     for ($start = $parameters['start']; $start < $parameters['end']; $start += $steps[$parameters['interval']]) {
!       if ($parameters['interval'] == 'month') {
!         $steps['month'] = $steps['day'] * date('t', $_start);
!       }
! 
!       $end = $start + $steps[$parameters['interval']] - 1;
! 
!       if ($start <= $timestamp) {
!         $apiCallParameters = array(
!           'client_id'   => $parameters['client_id'],
!           'start'       => $start,
!           'end'         => $end,
!           'constraints' => $parameters['constraints']
!         );
! 
!         $y_pi[] = phpOpenTracker::get(
!           array_merge(
!             array(
!               'api_call' => 'page_impressions'
!             ),
!             $apiCallParameters
!           )
!         );
! 
!         $y_visits[] = phpOpenTracker::get(
!           array_merge(
!             array(
!               'api_call' => 'visits'
!             ),
!             $apiCallParameters
!           )
!         );
!       } else {
!         $y_pi[]     = 0;
!         $y_visits[] = 0;
!       }
! 
!       switch ($parameters['interval']) {
!         case 'hour': {
!           $x_label[] = date('H', mktime($hour, 0, 0, $startmonth, $startday, $startyear)) . ':00';
!           $hour++;
!         }
!         break;
! 
!         case 'day': {
!           $x_label[] = date('d', mktime(0, 0, 0, $startmonth, $day, $startyear));
!           $day++;
!         }
!         break;
! 
!         case 'month': {
!           $x_label[] = date('m', mktime(0, 0, 0, $month, 1, $startyear));
!           $month++;
!         }
!         break;
  
!         case 'year': {
!           $x_label[] = date('Y', mktime(0, 0, 0, 1, 1, $year));
!           $year++;
!         }
!         break;
!       }
!     }
  
!     if ($parameters['interval'] == 'hour') {
!       $angle         = 50;
!       $xasisFontSize = $parameters['font_size'] - 2;
!     } else {
!       $angle         = 0;
!       $xasisFontSize = $parameters['font_size'];
      }
- 
-     $graph = new Graph($parameters['width'], $parameters['height'], 'auto');
- 
-     $graph->img->SetMargin(40, 40, 20, 40);
-     $graph->SetScale('textlin');
-     $graph->SetY2Scale('lin');
-     $graph->SetShadow();
- 
-     $pi_plot = new LinePlot($y_pi);
-     $pi_plot->SetColor($parameters['color1']);
-     $pi_plot->SetLegend('Page Impressions');
-     $pi_plot->SetWeight(2);
- 
-     $visits_plot = new LinePlot($y_visits);
-     $visits_plot->SetColor($parameters['color2']);
-     $visits_plot->SetLegend('Visits');
-     $visits_plot->SetWeight(2);
- 
-     $graph->Add($pi_plot);
-     $graph->AddY2($visits_plot);
- 
-     $graph->xaxis->SetTickLabels($x_label);
-     $graph->xaxis->SetLabelAngle($angle);
-     $graph->xaxis->SetFont($parameters['font'], $parameters['font_style'], $xasisFontSize);
-     $graph->xaxis->title->SetFont($parameters['font'], $parameters['font_style'], $parameters['font_size']);
- 
-     $graph->yaxis->SetColor('black');
-     $graph->yaxis->SetFont($parameters['font'], $parameters['font_style'], $parameters['font_size']);
-     $graph->yaxis->title->SetFont($parameters['font'], $parameters['font_style'], $parameters['font_size']);
- 
-     $graph->y2axis->SetColor('black');
-     $graph->y2axis->SetFont($parameters['font'], $parameters['font_style'], $parameters['font_size']);
-     $graph->y2axis->title->SetFont($parameters['font'], $parameters['font_style'], $parameters['font_size']);
- 
-     $graph->title->Set($title);
-     $graph->title->SetFont($parameters['font'], $parameters['font_style'], $parameters['font_size']);
- 
-     $graph->Stroke();
-   }
  }
  
--- 22,49 ----
  * @since    phpOpenTracker 1.0.0
  */
! class phpOpenTracker_API_Plugin_plot_access_statistics extends phpOpenTracker_API_Plugin {
!     /**
!     * API Calls
!     *
!     * @var array $apiCalls
!     */
!     public $apiCalls = array('access_statistics');
  
!     /**
!     * API Type
!     *
!     * @var string $apiType
!     */
!     public $apiType = 'plot';
  
!     /**
!     * Runs the phpOpenTracker API call.
!     *
!     * @param  array $parameters
!     * @return mixed
!     * @access public
!     */
!     public function run($parameters) {
      }
  }
  

Index: clickpath_analysis.php
===================================================================
RCS file: /cvsroot/phpopencounter/phpOpenTracker/phpOpenTracker/API/plugins/clickpath_analysis.php,v
retrieving revision 1.46
retrieving revision 1.47
diff -C2 -d -r1.46 -r1.47
*** clickpath_analysis.php	19 Sep 2003 07:17:27 -0000	1.46
--- clickpath_analysis.php	22 Nov 2003 08:47:43 -0000	1.47
***************
*** 25,683 ****
  * @since    phpOpenTracker 1.0.0
  */
! class phpOpenTracker_API_clickpath_analysis extends phpOpenTracker_API_Plugin {
!   /**
!   * API Calls
!   *
!   * @var array $apiCalls
!   */
!   var $apiCalls = array(
!     'all_paths',
!     'average_clickpath_length',
!     'individual_clickpath',
!     'top_paths',
!     'longest_paths',
!     'shortest_paths'
!   );
! 
!   /**
!   * API Type
!   *
!   * @var string $apiType
!   */
!   var $apiType = 'get';
! 
!   /**
!   * Runs the phpOpenTracker API call.
!   *
!   * @param  array $parameters
!   * @return mixed
!   * @access public
!   */
!   function run($parameters) {
!     switch ($parameters['api_call']) {
!       case 'average_clickpath_length': {
!         return $this->_averageClickpathLength($parameters);
!       }
!       break;
! 
!       case 'individual_clickpath': {
!         return $this->_individualClickpath($parameters);
!       }
!       break;
! 
!       case 'all_paths':
!       case 'top_paths':
!       case 'longest_paths':
!       case 'shortest_paths': {
!         return $this->_clickpathAnalysis($parameters);
!       }
!       break;
!     }
!   }
! 
!   /**
!   * @param  array $parameters
!   * @return mixed
!   * @access private
!   * @since  phpOpenTracker 1.3.0
!   */
!   function _clickpathAnalysis($parameters) {
!     if (!@include_once('Image/GraphViz.php')) {
!       phpOpenTracker::handleError(
!         'Could not find PEAR Image_GraphViz package, exiting.',
!         E_USER_ERROR
!       );
!     }
! 
!     $parameters['document_color']    = isset($parameters['document_color'])    ? $parameters['document_color']    : 'black';
!     $parameters['exit_targets']      = isset($parameters['exit_targets'])      ? $parameters['exit_targets']      : false;
!     $parameters['exit_target_color'] = isset($parameters['exit_target_color']) ? $parameters['exit_target_color'] : 'red';
!     $parameters['from']              = isset($parameters['from'])              ? crc32($parameters['from'])       : 0;
!     $parameters['length']            = isset($parameters['length'])            ? $parameters['length']            : false;
!     $parameters['referers']          = isset($parameters['referers'])          ? $parameters['referers']          : false;
!     $parameters['referer_color']     = isset($parameters['referer_color'])     ? $parameters['referer_color']     : 'green';
!     $parameters['result_format']     = isset($parameters['result_format'])     ? $parameters['result_format']     : 'graphviz';
!     $parameters['subpaths']          = isset($parameters['subpaths'])          ? $parameters['subpaths']          : false;
!     $parameters['to']                = isset($parameters['to'])                ? crc32($parameters['to'])         : 0;
! 
!     if ($parameters['api_call'] == 'all_paths') {
!       $parameters['subpaths'] = true;
!     }
! 
!     $data['documents']         = array();
!     $data['paths']             = array();
!     $data['subpathStatistics'] = array();
! 
!     switch ($parameters['result_format']) {
!       case 'graphviz':
!       case 'graphviz_object': {
!         $result = new Image_GraphViz;
! 
!         if ($parameters['exit_targets']) {
!           $result->addCluster('exit_targets', 'Exit Targets');
!         }
! 
!         if ($parameters['referers']) {
!           $result->addCluster('referers', 'Referers');
!         }
!       }
!       break;
! 
!       default: {
!         $result = array();
!       }
!     }
! 
!     $accesslogID =  0;
!     $visitor     = -1;
! 
!     $this->db->query(
!       sprintf(
!         "SELECT accesslog.accesslog_id AS accesslog_id,
!                 accesslog.document_id  AS document_id,
!                 accesslog.timestamp    AS timestamp,
!                 documents.string       AS document,
!                 documents.document_url AS document_url
!            FROM %s accesslog,
!                 %s visitors,
!                 %s documents
!           WHERE visitors.client_id    = '%d'
!             AND visitors.accesslog_id = accesslog.accesslog_id
!             AND accesslog.document_id = documents.data_id
!                 %s
!                 %s
!           ORDER BY accesslog.accesslog_id,
!                    accesslog.timestamp",
! 
!         $this->config['accesslog_table'],
!         $this->config['visitors_table'],
!         $this->config['documents_table'],
!         $parameters['client_id'],
!         $this->_constraint($parameters['constraints']),
!         $this->_whereTimerange(
!           $parameters['start'],
!           $parameters['end'],
!           'accesslog'
!         )
!       )
      );
  
!     while ($row = $this->db->fetchRow()) {
!       if (!isset($data['documents'][$row['document_id']])) {
!         $data['documents'][$row['document_id']] = array(
!           $row['document'],
!           $row['document_url'],
!           'document'
!         );
!       }
! 
!       if ($accesslogID != $row['accesslog_id']) {
!         $accesslogID = $row['accesslog_id'];
!         $node        = 0;
!         $visitor++;
! 
!         unset($previousTimestamp);
! 
!         $accesslog_ids[$visitor] = $row['accesslog_id'];
!       }
! 
!       $clickpaths[$visitor][$node]['document']   = $row['document_id'];
!       $clickpaths[$visitor][$node]['time_spent'] = 1;
! 
!       if (isset($previousTimestamp)) {
!         $clickpaths[$visitor][$node-1]['time_spent'] = $row['timestamp'] - $previousTimestamp;
!       }
! 
!       $previousTimestamp = $row['timestamp'];
!       $node++;
!     }
! 
!     if (!isset($clickpaths)) {
!       return $result;
!     }
! 
!     $numClickpaths = sizeof($clickpaths) - 1;
! 
!     if ($parameters['exit_targets']) {
!       for ($i = 0; $i <= $numClickpaths; $i++) {
!         $this->db->query(
!           sprintf(
!             "SELECT accesslog.document_id    AS document_id,
!                     accesslog.exit_target_id AS exit_target_id,
!                     exit_targets.string      AS exit_target
!                FROM %s accesslog,
!                     %s exit_targets
!               WHERE accesslog.accesslog_id   = '%d'
!                 AND accesslog.exit_target_id = exit_targets.data_id",
! 
!             $this->config['accesslog_table'],
!             $this->config['exit_targets_table'],
!             $accesslog_ids[$i]
!           )
!         );
! 
!         while ($row = $this->db->fetchRow()) {
!           $data['documents'][$row['exit_target_id']] = array(
!             $row['exit_target'],
!             'http://' . $row['exit_target'],
!             'exit_target'
!           );
! 
!           $visitor = sizeof($clickpaths);
! 
!           $clickpaths[$visitor][0]['document']   = $row['document_id'];
!           $clickpaths[$visitor][0]['time_spent'] = 0;
! 
!           $clickpaths[$visitor][1]['document']   = $row['exit_target_id'];
!           $clickpaths[$visitor][1]['time_spent'] = 0;
!         }
!       }
!     }
! 
!     for ($i = 0; $i < sizeof($clickpaths) - 1; $i++) {
!       $pathLength = sizeof($clickpaths[$i]);
! 
!       if ($parameters['referers'] && $i <= $numClickpaths) {
!         $this->db->query(
!           sprintf(
!             "SELECT referers.string     AS referer,
!                     visitors.referer_id AS referer_id
!                FROM %s visitors,
!                     %s referers
!               WHERE visitors.accesslog_id = '%d'
!                 AND visitors.referer_id   = referers.data_id",
! 
!             $this->config['visitors_table'],
!             $this->config['referers_table'],
!             $accesslog_ids[$i]
!           )
!         );
! 
!         if ($row = $this->db->fetchRow()) {
!           $data['documents'][$row['referer_id']] = array(
!             $row['referer'],
!             'http://' . $row['referer'],
!             'referer'
!           );
! 
!           array_unshift(
!             $clickpaths[$i],
!             array(
!               'document'   => $row['referer_id'],
!               'time_spent' => 0,
!             )
!           );
!         }
!       }
! 
!       if (!$parameters['subpaths']) {
!         $this->_processPath(
!           $data,
!           $clickpaths[$i],
!           $parameters['from'],
!           $parameters['to'],
!           $parameters['length']
!         );
!       } else {
!         for ($j = 2; $j <= $pathLength; $j++) {
!           $subpath       = array_slice($clickpaths[$i], 0, $j);
!           $subpathLength = sizeof($subpath);
! 
!           for ($k = 2; $k <= $subpathLength; $k++) {
!             $this->_processPath(
!               $data,
!               array_slice($subpath, (0 - $k)),
!               $parameters['from'],
!               $parameters['to'],
!               $parameters['length']
!             );
!           }
!         }
!       }
!     }
! 
!     if (empty($data['paths'])) {
!       return $result;
!     }
! 
!     foreach ($data['subpathStatistics'] as $fromNode => $toNodes) {
!       foreach ($toNodes as $toNode => $data) {
!         if ($parameters['api_call'] == 'all_paths') {
!           $fromColor = $parameters['document_color'];
!           $fromGroup = 'default';
!           $fromID    = $data['documents'][$fromNode][0];
!           $fromRank  = 'same';
! 
!           $toColor   = $parameters['document_color'];
!           $toGroup   = 'default';
!           $toID      = $data['documents'][$toNode][0];
!           $toRank    = 'same';
! 
!           $edgeColor = $parameters['document_color'];
! 
!           if ($data['documents'][$toNode][2] == 'exit_target') {
!             $toColor   = $parameters['exit_target_color'];
!             $toGroup   = 'exit_targets';
!             $toID      = 'exit_target_' . $toID;
!             $toRank    = 'sink';
! 
!             $edgeColor = $parameters['exit_target_color'];
!           }
! 
!           if ($data['documents'][$fromNode][2] == 'referer') {
!             $fromColor = $parameters['referer_color'];
!             $fromGroup = 'referers';
!             $fromID    = 'referer_' . $fromID;
!             $fromRank  = 'source';
! 
!             $edgeColor = $parameters['referer_color'];
!           }
! 
!           $result->addNode(
!             $fromID,
!             array(
!               'label' => $data['documents'][$fromNode][0],
!               'url'   => $data['documents'][$fromNode][1],
!               'color' => $fromColor,
!               'rank'  => $fromRank,
!               'shape' => 'box'
!             ),
!             $fromGroup
!           );
! 
!           $result->addNode(
!             $toID,
!             array(
!               'label' => $data['documents'][$toNode][0],
!               'url'   => $data['documents'][$toNode][1],
!               'color' => $toColor,
!               'rank'  => $toRank,
!               'shape' => 'box'
!             ),
!             $toGroup
!           );
! 
!           $result->addEdge(
!             array(
!               $fromID => $toID
!             ),
!             array(
!               'color' => $edgeColor,
!               'label' => $data['count']
!             )
!           );
!         }
! 
!         else if (isset($data['count'])) {
!           $data['subpathStatistics'][$fromNode][$toNode]['time_spent'] = floor($data['time_spent'] / $data['count']);
!         }
!       }
!     }
! 
!     if ($parameters['api_call'] != 'all_paths') {
!       switch ($parameters['api_call']) {
!         case 'shortest_paths': {
!           $field = 'length';
!           $sort  = SORT_ASC;
!         }
!         break;
! 
!         case 'longest_paths': {
!           $field = 'length';
!           $sort  = SORT_DESC;
!         }
!         break;
! 
!         case 'top_paths': {
!           $field = 'count';
!           $sort  = SORT_DESC;
!         }
!         break;
!       }
! 
!       foreach($data['paths'] as $path) $tmp[] = $path[$field];
!       array_multisort($tmp, $sort, $data['paths']);
! 
!       if ($parameters['limit'] && sizeof($data['paths']) > $parameters['limit']) {
!         $data['paths'] = array_slice($data['paths'], 0, $parameters['limit']);
!       }
! 
!       $rank = 1;
! 
!       foreach ($data['paths'] as $path => $statistics) {
!         $documents    = array();
!         $documentURLs = array();
!         $path         = explode(':', $path);
!         $pathLength   = sizeof($path);
!         $where        = '';
! 
!         if ($parameters['subpaths']) {
!           $subpathStatistics = array();
! 
!           for ($i = 0; $i < $pathLength - 1; $i++) {
!             $subpathStatistics[] = array(
!               'count'      => intval($data['subpathStatistics'][$path[$i]][$path[$i+1]]['count']),
!               'time_spent' => intval($data['subpathStatistics'][$path[$i]][$path[$i+1]]['time_spent'])
!             );
!           }
!         } else {
!           $subpathStatistics = false;
!         }
! 
!         for ($i = 0; $i < $pathLength; $i++) {
!           $documents[$i]    = $data['documents'][$path[$i]][0];
!           $documentURLs[$i] = $data['documents'][$path[$i]][1];
!         }
! 
!         if ($parameters['result_format'] == 'array') {
!           $result[] = new phpOpenTracker_Clickpath(
!             $documents,
!             $documentURLs,
!             $subpathStatistics,
!             intval($statistics['count'])
!           );
!         } else {
!           $result->addCluster(
!             $rank,
!             sprintf(
!               '%s. Taken by %s visitors.',
! 
!               $rank,
!               $statistics['count']
!             )
!           );
! 
!           for ($i = 0; $i < $pathLength - 1; $i++) {
!             $fromID = $rank . '_' . $documents[$i];
!             $toID   = $rank . '_' . $documents[$i+1];
  
!             $result->addNode(
!               $fromID,
!               array(
!                 'label' => $documents[$i],
!                 'url'   => $documentURLs[$i],
!                 'color' => $parameters['document_color'],
!                 'shape' => 'box'
!               ),
!               $rank
!             );
  
!             $result->addNode(
!               $toID,
!               array(
!                 'label' => $documents[$i+1],
!                 'url'   => $documentURLs[$i+1],
!                 'color' => $parameters['document_color'],
!                 'shape' => 'box'
!               ),
!               $rank
!             );
  
!             $result->addEdge(
!               array(
!                 $fromID => $toID
!               ),
!               array(
!                 'color' => $parameters['document_color']
!               )
!             );
!           }
          }
- 
-         $rank++;
-       }
-     }
- 
-     if ($parameters['result_format'] == 'graphviz') {
-       return $result->parse();
-     } else {
-       return $result;
      }
-   }
- 
-   /**
-   * Returns the average clickpath length.
-   *
-   * @param  array $parameters
-   * @return integer
-   * @access private
-   * @author Sven Weih <[email protected]>
-   * @since  phpOpenTracker 1.3.0
-   */
-   function _averageClickpathLength($parameters) {
-     $pageImpressionsParameters             = $parameters;
-     $pageImpressionsParameters['api_call'] = 'page_impressions';
  
!     $visitsParameters             = $parameters;
!     $visitsParameters['api_call'] = 'visits';
! 
!     $pageImpressions = phpOpenTracker::get($pageImpressionsParameters);
!     $visits          = phpOpenTracker::get($visitsParameters);
!     
!     if (is_array($pageImpressions)) {
!       for ($i = 0; $i < sizeof($pageImpressions); $i++) {
!         $result[$i] = array(
!           'timestamp' => $pageImpressions[$i]['timestamp'],
!           'value'     => ($pageImpressions[$i]['value'] / (($visits[$i]['value'] ==0 ) ? 1 : $visits[$i]['value']))
!         );
!       }
!     } else {
!       if ($visits != 0) { 
!       	return $pageImpressions / $visits;	
!       } else {
!         return 0;	
!       }
!     }
! 
!     return $result; 
!   }
! 
!   /**
!   * Returns an individual clickpath.
!   *
!   * @param  array $parameters
!   * @return mixed
!   * @access private
!   * @since  phpOpenTracker 1.3.0
!   */
!   function _individualClickpath($parameters) {
!     if (!isset($parameters['accesslog_id'])) {
!       return phpOpenTracker::handleError(
!         'Required parameter "accesslog_id" missing.'
!       );
!     }
! 
!     $parameters['resolve_ids'] = isset($parameters['resolve_ids']) ? $parameters['resolve_ids'] : true;
! 
!     if ($parameters['resolve_ids']) {
!       $this->db->query(
!         sprintf(
!           "SELECT data_values.string       AS document,
!                   data_values.document_url AS document_url,
!                   accesslog.timestamp      AS timestamp
!              FROM %s accesslog,
!                   %s data_values
!             WHERE accesslog.accesslog_id = '%d'
!               AND accesslog.document_id  = data_values.data_id
!             ORDER BY timestamp",
! 
!           $this->config['accesslog_table'],
!           $this->config['documents_table'],
!           $parameters['accesslog_id']
!         )
!       );
!     } else {
!       $this->db->query(
!         sprintf(
!           "SELECT accesslog.document_id AS document,
!                   accesslog.timestamp
!              FROM %s accesslog
!             WHERE accesslog.accesslog_id = '%d'
!             ORDER BY timestamp",
! 
!           $this->config['accesslog_table'],
!           $parameters['accesslog_id']
!         )
!       );
!     }
! 
!     $i = 0;
! 
!     while ($row = $this->db->fetchRow()) {
!       $documents[$i]    = $row['document'];
!       $documentURLs[$i] = $row['document_url'];
! 
!       if (isset($previousTimestamp)) {
!         $timeSpent[$i-1] = $row['timestamp'] - $previousTimestamp;
!       }
! 
!       $previousTimestamp = $row['timestamp'];
!       $i++;
!     }
! 
!     if (!isset($documents)) {
!       return new phpOpenTracker_Clickpath(array());
      }
  
!     $timeSpent[sizeof($documents)-1] = 1;
! 
!     $clickpath = new phpOpenTracker_Clickpath(
!       $documents,
!       $documentURLs,
!       $timeSpent
!     );
! 
!     switch ($parameters['result_format']) {
!       case 'graphviz': {
!         return $clickpath->toGraph();
!       }
!       break;
! 
!       case 'graphviz_object': {
!         return $clickpath->toGraph(true);
!       }
!       break;
! 
!       case 'xml': {
!         return $clickpath->toXML();
!       }
!       break;
! 
!       case 'xml_object': {
!         return $clickpath->toXML(true);
!       }
!       break;
! 
!       default: {
!         return $clickpath;
!       }
      }
-   }
- 
-   /**
-   * @param  array   $data
-   * @param  string  $path
-   * @param  integer $from
-   * @param  integer $to
-   * @param  integer $length
-   * @access private
-   */
-   function _processPath(&$data, $path, $from, $to, $length) {
-     $pathLength = sizeof($path);
- 
-     $first = $path[0]['document'];
-     $last  = $path[$pathLength - 1]['document'];
- 
-     if ($pathLength > 1 &&
-         ((  $from == false && $to     == false) ||
-          (  $from != false && $from   == $first && $to == false) ||
-          (  $from == false && $to     != false  && $to == $last) ||
-          (  $from != false && $from   == $first && $to != false && $to == $last)) &&
-          ($length == false || $length == $pathLength)) {
-       $id = '';
- 
-       for ($i = 0; $i < $pathLength; $i++) {
-         $separator = empty($id) ? '' : ':';
-         $id .= $separator . $path[$i]['document'];
-       }
- 
-       if (!isset($data['paths'][$id])) {
-         $data['paths'][$id]['count']  = 1;
-         $data['paths'][$id]['length'] = $pathLength;
  
!         if ($pathLength == 2) {
!           $data['subpathStatistics'][$first][$last]['count']      = 1;
!           $data['subpathStatistics'][$first][$last]['time_spent'] = $path[0]['time_spent'];
!         }
!       } else {
!         $data['paths'][$id]['count']++;
! 
!         if ($pathLength == 2) {
!           $data['subpathStatistics'][$first][$last]['count']++;
!           $data['subpathStatistics'][$first][$last]['time_spent'] += $path[0]['time_spent'];
!         }
!       }
      }
-   }
  }
  
--- 25,110 ----
  * @since    phpOpenTracker 1.0.0
  */
! class phpOpenTracker_API_Plugin_clickpath_analysis extends phpOpenTracker_API_Plugin {
!     /**
!     * API Calls
!     *
!     * @var array $apiCalls
!     */
!     public $apiCalls = array(
!       'all_paths',
!       'average_clickpath_length',
!       'individual_clickpath',
!       'top_paths',
!       'longest_paths',
!       'shortest_paths'
      );
  
!     /**
!     * API Type
!     *
!     * @var string $apiType
!     */
!     public $apiType = 'get';
  
!     /**
!     * Runs the phpOpenTracker API call.
!     *
!     * @param  array $parameters
!     * @return mixed
!     * @access public
!     */
!     public function run($parameters) {
!         switch ($parameters['api_call']) {
!             case 'average_clickpath_length': {
!                 return $this->averageClickpathLength($parameters);
!             }
!             break;
  
!             case 'individual_clickpath': {
!                 return $this->individualClickpath($parameters);
!             }
!             break;
  
!             case 'all_paths':
!             case 'top_paths':
!             case 'longest_paths':
!             case 'shortest_paths': {
!                 return $this->clickpathAnalysis($parameters);
!             }
!             break;
          }
      }
  
!     /**
!     * @param  array $parameters
!     * @return mixed
!     * @access private
!     * @since  phpOpenTracker 1.3.0
!     */
!     private function clickpathAnalysis($parameters) {
      }
  
!     /**
!     * Returns the average clickpath length.
!     *
!     * @param  array $parameters
!     * @return integer
!     * @access private
!     * @author Sven Weih <[email protected]>
!     * @since  phpOpenTracker 1.3.0
!     */
!     private function averageClickpathLength($parameters) {
      }
  
!     /**
!     * Returns an individual clickpath.
!     *
!     * @param  array $parameters
!     * @return mixed
!     * @access private
!     * @since  phpOpenTracker 1.3.0
!     */
!     private function individualClickpath($parameters) {
      }
  }
  

Index: top.php
===================================================================
RCS file: /cvsroot/phpopencounter/phpOpenTracker/phpOpenTracker/API/plugins/top.php,v
retrieving revision 1.50
retrieving revision 1.51
diff -C2 -d -r1.50 -r1.51
*** top.php	12 Oct 2003 17:25:51 -0000	1.50
--- top.php	22 Nov 2003 08:47:43 -0000	1.51
***************
*** 22,414 ****
  * @since    phpOpenTracker 1.0.0
  */
! class phpOpenTracker_API_top extends phpOpenTracker_API_Plugin {
!   /**
!   * API Calls
!   *
!   * @var array $apiCalls
!   */
!   var $apiCalls = array('top');
! 
!   /**
!   * API Type
!   *
!   * @var string $apiType
!   */
!   var $apiType = 'get';
! 
!   /**
!   * Runs the phpOpenTracker API call.
!   *
!   * @param  array $parameters
!   * @return mixed
!   * @access public
!   */
!   function run($parameters) {
!     if (!isset($parameters['what'])) {
!       return phpOpenTracker::handleError(
!         'Required parameter "what" missing.'
!       );
!     }
! 
!     list($constraint, $selfJoin) = $this->_constraint(
!       $parameters['constraints'],
!       true
!     );
! 
!     if ($selfJoin) {
!       $selfJoinConstraint = 'AND accesslog.accesslog_id = accesslog2.accesslog_id';
! 
!       $selfJoinTable = sprintf(
!         '%s accesslog2,',
! 
!         $this->config['accesslog_table']
!       );
!     } else {
!       $selfJoinConstraint = '';
!       $selfJoinTable      = '';
!     }
! 
!     $timerange = $this->_whereTimerange(
!       $parameters['start'],
!       $parameters['end']
!     );
! 
!     switch ($parameters['result_format']) {
!       case 'csv': {
!         $csv = "Rank;Item;Count;Percent\n";
!       }
!       break;
! 
!       case 'xml':
!       case 'xml_object': {
!         $tree = new XML_Tree;
!         $root = &$tree->addRoot('top');
!       }
!       break;
! 
!       case 'separate_result_arrays': {
!         $names   = array();
!         $values  = array();
!         $percent = array();
!       }
!       break;
! 
!       default: {
!         $topItems = array();
!       }
!     }
! 
!     switch ($parameters['what']) {
!       case 'document':
!       case 'exit_target':
!       case 'host':
!       case 'operating_system':
!       case 'referer':
!       case 'user_agent':
!       case 'entry_document':
!       case 'exit_document': {
!         $dataConstraint = '';
! 
!         switch ($parameters['what']) {
!           case 'document': {
!             $column    = 'accesslog.document_id';
!             $dataTable = $this->config['documents_table'];
!           }
!           break;
! 
!           case 'entry_document': {
!             $column         = 'accesslog.document_id';
!             $dataConstraint = "AND accesslog.entry_document = '1'";
!             $dataTable      = $this->config['documents_table'];
!           }
!           break;
! 
!           case 'exit_document': {
!             $column         = 'accesslog.document_id';
!             $dataConstraint = "AND accesslog.exit_target_id <> '0'";
!             $dataTable      = $this->config['documents_table'];
!           }
!           break;
! 
!           case 'exit_target': {
!             $column         = 'accesslog.exit_target_id';
!             $dataConstraint = "AND accesslog.exit_target_id <> '0'";
!             $dataTable      = $this->config['exit_targets_table'];
!           }
!           break;
! 
!           case 'host': {
!             $column    = 'visitors.host_id';
!             $dataTable = $this->config['hostnames_table'];
!           }
!           break;
! 
!           case 'operating_system': {
!             $column    = 'visitors.operating_system_id';
!             $dataTable = $this->config['operating_systems_table'];
!           }
!           break;
! 
!           case 'referer': {
!             $column    = 'visitors.referer_id';
!             $dataTable = $this->config['referers_table'];
!           }
!           break;
! 
!           case 'user_agent': {
!             $column    = 'visitors.user_agent_id';
!             $dataTable = $this->config['user_agents_table'];
!           }
!           break;
!         }
! 
!         $nestedQuery = sprintf(
!           "SELECT data_table.string AS item
!              FROM %s accesslog,
!                   %s
!                   %s visitors,
!                   %s data_table
!             WHERE visitors.client_id    = '%d'
!               AND visitors.accesslog_id = accesslog.accesslog_id
!               AND data_table.data_id    = %s
!                   %s
!                   %s
!                   %s
!                   %s
!             GROUP BY visitors.accesslog_id,
!                      data_table.string",
! 
!           $this->config['accesslog_table'],
!           $selfJoinTable,
!           $this->config['visitors_table'],
!           $dataTable,
!           $parameters['client_id'],
!           $column,
!           $selfJoinConstraint,
!           $dataConstraint,
!           $constraint,
!           $timerange
!         );
!       }
!       break;
! 
!       default: {
!         $nestedQuery = sprintf(
!           "SELECT add_data.data_value AS item
!              FROM %s accesslog,
!                   %s
!                   %s visitors,
!                   %s add_data
!             WHERE visitors.client_id     = '%d'
!               AND visitors.accesslog_id  = accesslog.accesslog_id
!               AND accesslog.accesslog_id = add_data.accesslog_id
!               AND add_data.data_field    = '%s'
!                   %s
!                   %s
!                   %s
!             GROUP BY visitors.accesslog_id,
!                      add_data.data_value",
! 
!           $this->config['accesslog_table'],
!           $selfJoinTable,
!           $this->config['visitors_table'],
!           $this->config['additional_data_table'],
!           $parameters['client_id'],
!           $parameters['what'],
!           $selfJoinConstraint,
!           $constraint,
!           $timerange
!         );
!       }
!     }
! 
!     if ($this->db->supportsNestedQueries()) {
!       $queryTotalUnique = sprintf(
!         'SELECT COUNT(item)           AS total_items,
!                 COUNT(DISTINCT(item)) AS unique_items
!            FROM (%s) items',
! 
!         $nestedQuery
!       );
! 
!       $queryItems = sprintf(
!         'SELECT COUNT(item) AS item_count,
!                 item
!            FROM (%s) items
!           GROUP BY item
!           ORDER BY item_count %s,
!                    item',
! 
!         $nestedQuery,
!         $parameters['order']
!       );
! 
!       if ($parameters['result_format'] == 'sql') {
!         return $queryItems;
!       }
!     } else {
!       if ($this->config['db_type'] == 'mysql' ||
!           $this->config['db_type'] == 'mysql_merge') {
!         $queryCreateTemporaryTable = sprintf(
!           'CREATE TEMPORARY TABLE pot_temporary_table %s',
! 
!           $nestedQuery
!         );
! 
!         $queryTotalUnique = sprintf(
!           'SELECT COUNT(item)           AS total_items,
!                   COUNT(DISTINCT(item)) AS unique_items
!              FROM pot_temporary_table',
! 
!           $nestedQuery
!         );
! 
!         $queryItems = sprintf(
!           'SELECT COUNT(item) AS item_count,
!                   item
!              FROM pot_temporary_table
!             GROUP BY item
!             ORDER BY item_count %s,
!                      item',
! 
!           $parameters['order']
!         );
! 
!         if ($parameters['result_format'] != 'sql') {
!           $dropTemporaryTable = true;
! 
!           $this->db->query($queryCreateTemporaryTable);
!         } else {
!           return $queryCreateTemporaryTable . ';' . $queryItems;
!         }
!       } else {
!         return phpOpenTracker::handleError(
!           'You need a database system capable of nested queries.',
!           E_USER_ERROR
!         );
!       }
!     }
! 
!     $this->db->query($queryTotalUnique);
! 
!     if ($row = $this->db->fetchRow()) {
!       $totalItems  = intval($row['total_items']);
!       $uniqueItems = intval($row['unique_items']);
!     } else {
!       return phpOpenTracker::handleError(
!         'Database query failed.'
!       );
!     }
! 
!     if ($totalItems > 0) {
!       $this->db->query($queryItems, $parameters['limit']);
! 
!       $i = 0;
! 
!       while ($row = $this->db->fetchRow()) {
!         $percentValue = doubleval(
!           number_format(
!             ((100 * $row['item_count']) / $totalItems),
!             2
!           )
!         );
! 
!         switch ($parameters['result_format']) {
!           case 'csv': {
!             $csv .= sprintf(
!               "%d;%s;%d;%d\n",
! 
!               $i+1,
!               $row['item'],
!               intval($row['item_count']),
!               $percentValue
!             );
!           }
!           break;
! 
!           case 'xml':
!           case 'xml_object': {
!             $itemChild = &$root->addChild('item');
! 
!             $itemChild->addChild('rank',    $i+1);
!             $itemChild->addChild('string',  $row['item']);
!             $itemChild->addChild('count',   intval($row['item_count']));
!             $itemChild->addChild('percent', $percentValue);
! 
!             if (isset($row['document_url'])) {
!               $itemChild->addChild('url',  $row['document_url']);
!             }
!           }
!           break;
! 
!           case 'separate_result_arrays': {
!             $names[$i]   = $row['item'];
!             $values[$i]  = intval($row['item_count']);
!             $percent[$i] = $percentValue;
!           }
!           break;
! 
!           default: {
!             $topItems[$i]['count'  ] = intval($row['item_count']);
!             $topItems[$i]['string' ] = $row['item'];
!             $topItems[$i]['percent'] = $percentValue;
! 
!             if (isset($row['document_url'])) {
!               $topItems[$i]['url' ] = $row['document_url'];
!             }
!           }
!         }
! 
!         $i++;
!       }
!     }
! 
!     if (isset($dropTemporaryTable)) {
!       $this->db->query('DROP TABLE pot_temporary_table');
!     }
! 
!     switch ($parameters['result_format']) {
!       case 'csv': {
!         return $csv;
!       }
!       break;
! 
!       case 'xml':
!       case 'xml_object': {
!         $root->addChild('total',  $totalItems);
!         $root->addChild('unique', $uniqueItems);
! 
!         switch ($parameters['result_format']) {
!           case 'xml': {
!             return $root->get();
!           }
!           break;
! 
!           case 'xml_object': {
!             return $root;
!           }
!           break;
!         }
!       }
!       break;
  
!       case 'separate_result_arrays': {
!         return array(
!           $names,
!           $values,
!           $percent,
!           $uniqueItems
!         );
!       }
!       break;
  
!       default: {
!         return array(
!           'top_items'    => $topItems,
!           'unique_items' => $uniqueItems
!         );
!       }
      }
-   }
  }
  
--- 22,49 ----
  * @since    phpOpenTracker 1.0.0
  */
! class phpOpenTracker_API_Plugin_top extends phpOpenTracker_API_Plugin {
!     /**
!     * API Calls
!     *
!     * @var array $apiCalls
!     */
!     public $apiCalls = array('top');
  
!     /**
!     * API Type
!     *
!     * @var string $apiType
!     */
!     public $apiType = 'get';
  
!     /**
!     * Runs the phpOpenTracker API call.
!     *
!     * @param  array $parameters
!     * @return mixed
!     * @access public
!     */
!     public function run($parameters) {
      }
  }
  

Index: visitors_online.php
===================================================================
RCS file: /cvsroot/phpopencounter/phpOpenTracker/phpOpenTracker/API/plugins/visitors_online.php,v
retrieving revision 1.24
retrieving revision 1.25
diff -C2 -d -r1.24 -r1.25
*** visitors_online.php	22 Oct 2003 18:18:06 -0000	1.24
--- visitors_online.php	22 Nov 2003 08:47:43 -0000	1.25
***************
*** 22,291 ****
  * @since    phpOpenTracker 1.0.0
  */
! class phpOpenTracker_API_visitors_online extends phpOpenTracker_API_Plugin {
!   /**
!   * API Calls
!   *
!   * @var array $apiCalls
!   */
!   var $apiCalls = array(
!     'num_visitors_online',
!     'visitors_online'
!   );
! 
!   /**
!   * API Type
!   *
!   * @var string $apiType
!   */
!   var $apiType = 'get';
! 
!   /**
!   * Runs the phpOpenTracker API call.
!   *
!   * @param  array $parameters
!   * @return mixed
!   * @access public
!   */
!   function run($parameters) {
!     $parameters['session_lifetime'] = isset($parameters['session_lifetime']) ? $parameters['session_lifetime'] : 3;
! 
!     switch ($parameters['api_call']) {
!       case 'num_visitors_online': {
!         return $this->_numVisitorsOnline($parameters);
!       }
!       break;
! 
!       case 'visitors_online': {
!         return $this->_visitorsOnline($parameters);
!       }
!       break;
!     }
!   }
! 
!   /**
!   * Returns the number of visitors currently online.
!   *
!   * @param  array $parameters
!   * @return integer
!   * @access private
!   * @since  phpOpenTracker 1.3.0
!   */
!   function _numVisitorsOnline($parameters) {
!     $this->db->query(
!       sprintf(
!         "SELECT COUNT(DISTINCT(accesslog.accesslog_id)) AS num_visitors_online
!            FROM %s accesslog,
!                 %s visitors
!           WHERE visitors.client_id    = '%d'
!             AND visitors.accesslog_id = accesslog.accesslog_id
!             AND accesslog.timestamp   >= '%d'
!                 %s",
! 
!         $this->config['accesslog_table'],
!         $this->config['visitors_table'],
!         $parameters['client_id'],
!         time() - ($parameters['session_lifetime'] * 60),
!         $this->_constraint($parameters['constraints'])
!       )
!     );
! 
!     if ($row = $this->db->fetchRow()) {
!       return intval($row['num_visitors_online']);
!     } else {
!       return 0;
!     }
!   }
! 
!   /**
!   * Returns information about the visitors currently online.
!   *
!   * @param  array $parameters
!   * @return mixed
!   * @access private
!   * @since  phpOpenTracker 1.3.0
!   */
!   function _visitorsOnline($parameters) {
!     switch ($parameters['result_format']) {
!       case 'xml':
!       case 'xml_object': {
!         $tree     = new XML_Tree;
!         $root     = &$tree->addRoot('visitorsonline');
!         $children = array();
!       }
!       break;
! 
!       default: {
!         $result = array();
!       }
!     }
! 
!     $accesslogIDs = array();
! 
!     $this->db->query(
!       sprintf(
!         "SELECT DISTINCT(accesslog.accesslog_id) AS accesslog_id
!            FROM %s accesslog,
!                 %s visitors
!           WHERE visitors.client_id    = '%d'
!             AND visitors.accesslog_id = accesslog.accesslog_id
!             AND accesslog.timestamp  >= '%d'",
! 
!         $this->config['accesslog_table'],
!         $this->config['visitors_table'],
!         $parameters['client_id'],
!         time() - ($parameters['session_lifetime'] * 60)
!       )
      );
  
!     while ($row = $this->db->fetchRow()) {
!       $accesslogIDs[] = $row['accesslog_id'];
!     }
! 
!     for ($i = 0, $max = sizeof($accesslogIDs); $i < $max; $i++) {
!       switch ($parameters['result_format']) {
!         case 'xml':
!         case 'xml_object': {
!           $visitorNode = &$root->addChild('visitor');
! 
!           $visitorNode->addChild(
!             phpOpenTracker::get(
!               array(
!                 'client_id'     => $parameters['client_id'],
!                 'api_call'      => 'individual_clickpath',
!                 'accesslog_id'  => $accesslogIDs[$i],
!                 'result_format' => 'xml_object'
!               )
!             )
!           );
!         }
!         break;
! 
!         default: {
!           $result[$i]['clickpath'] = phpOpenTracker::get(
!             array(
!               'client_id'    => $parameters['client_id'],
!               'api_call'     => 'individual_clickpath',
!               'accesslog_id' => $accesslogIDs[$i]
!             )
!           );
!         }
!       }
! 
!       $this->db->query(
!         sprintf(
!           "SELECT MAX(timestamp) as last_access
!              FROM %s
!             WHERE accesslog_id = '%s'",
  
!           $this->config['accesslog_table'],
!           $accesslogIDs[$i]
!         )
!       );
  
!       if ($row = $this->db->fetchRow()) {
!         switch ($parameters['result_format']) {
!           case 'xml':
!           case 'xml_object': {
!             $visitorNode->addChild('last_access', $row['last_access']);
            }
            break;
  
!           default: {
!             $result[$i]['last_access'] = $row['last_access'];
!           }
!         }
!       } else {
!         return phpOpenTracker::handleError(
!           'Database query failed.'
!         );
!       }
! 
!       $this->db->query(
!         sprintf(
!           "SELECT hosts.string       AS host,
!                   user_agents.string AS user_agent
!              FROM %s visitors,
!                   %s hosts,
!                   %s user_agents
!             WHERE visitors.accesslog_id  = '%d'
!               AND visitors.host_id       = hosts.data_id
!               AND visitors.user_agent_id = user_agents.data_id",
! 
!           $this->config['visitors_table'],
!           $this->config['hostnames_table'],
!           $this->config['user_agents_table'],
!           $accesslogIDs[$i]
!         )
!       );
! 
!       if ($row = $this->db->fetchRow()) {
!         switch ($parameters['result_format']) {
!           case 'xml':
!           case 'xml_object': {
!             $visitorNode->addChild('host',       $row['host']);
!             $visitorNode->addChild('user_agent', $row['user_agent']);
            }
            break;
- 
-           default: {
-             $result[$i]['host']       = $row['host'];
-             $result[$i]['user_agent'] = $row['user_agent'];
-           }
-         }
-       } else {
-         return phpOpenTracker::handleError(
-           'Database query failed.'
-         );
-       }
- 
-       $this->db->query(
-         sprintf(
-           "SELECT referers.string AS referer
-              FROM %s visitors,
-                   %s referers
-             WHERE visitors.accesslog_id = '%d'
-               AND visitors.referer_id   = referers.data_id",
- 
-           $this->config['visitors_table'],
-           $this->config['referers_table'],
-           $accesslogIDs[$i]
-         )
-       );
- 
-       if ($row = $this->db->fetchRow()) {
-         $referer = $row['referer'];
-       } else {
-         $referer = '';
        }
  
!       switch ($parameters['result_format']) {
!         case 'xml':
!         case 'xml_object': {
!           $visitorNode->addChild('referer', $referer);
!         }
!         break;
! 
!         default: {
!           $result[$i]['referer'] = $referer;
!         }
!       }
      }
  
!     switch ($parameters['result_format']) {
!       case 'xml': {
!         return $root->get();
!       }
!       break;
! 
!       case 'xml_object': {
!         return $root;
!       }
!       break;
! 
!       default: {
!         return $result;
!       }
      }
-   }
  }
  
--- 22,87 ----
  * @since    phpOpenTracker 1.0.0
  */
! class phpOpenTracker_API_Plugin_visitors_online extends phpOpenTracker_API_Plugin {
!     /**
!     * API Calls
!     *
!     * @var array $apiCalls
!     */
!     public $apiCalls = array(
!       'num_visitors_online',
!       'visitors_online'
      );
  
!     /**
!     * API Type
!     *
!     * @var string $apiType
!     */
!     public $apiType = 'get';
  
!     /**
!     * Runs the phpOpenTracker API call.
!     *
!     * @param  array $parameters
!     * @return mixed
!     * @access public
!     */
!     public function run($parameters) {
!       $parameters['session_lifetime'] = isset($parameters['session_lifetime']) ? $parameters['session_lifetime'] : 3;
  
!       switch ($parameters['api_call']) {
!           case 'num_visitors_online': {
!               return $this->numVisitorsOnline($parameters);
            }
            break;
  
!           case 'visitors_online': {
!               return $this->visitorsOnline($parameters);
            }
            break;
        }
+   }
  
!     /**
!     * Returns the number of visitors currently online.
!     *
!     * @param  array $parameters
!     * @return integer
!     * @access private
!     * @since  phpOpenTracker 1.3.0
!     */
!     private function numVisitorsOnline($parameters) {
      }
  
!     /**
!     * Returns information about the visitors currently online.
!     *
!     * @param  array $parameters
!     * @return mixed
!     * @access private
!     * @since  phpOpenTracker 1.3.0
!     */
!     private function visitorsOnline($parameters) {
      }
  }
  

Index: plot_top.php
===================================================================
RCS file: /cvsroot/phpopencounter/phpOpenTracker/phpOpenTracker/API/plugins/plot_top.php,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** plot_top.php	19 Sep 2003 07:17:27 -0000	1.17
--- plot_top.php	22 Nov 2003 08:47:43 -0000	1.18
***************
*** 22,129 ****
  * @since    phpOpenTracker 1.0.0
  */
! class phpOpenTracker_API_plot_top extends phpOpenTracker_API_Plugin {
!   /**
!   * API Calls
!   *
!   * @var array $apiCalls
!   */
!   var $apiCalls = array('top');
! 
!   /**
!   * API Type
!   *
!   * @var string $apiType
!   */
!   var $apiType = 'plot';
! 
!   /**
!   * Runs the phpOpenTracker API call.
!   *
!   * @param  array $parameters
!   * @return mixed
!   * @access public
!   */
!   function run($parameters) {
!     $parameters['api_call']      = 'top';
!     $parameters['result_format'] = 'separate_result_arrays';
! 
!     list($names, $values, $percent, $total) = phpOpenTracker::get(
!       $parameters
!     );
! 
!     $title = 'Top ' . $parameters['limit'] . ' ';
! 
!     switch ($parameters['what']) {
!       case 'document': {
!         $title .= 'Pages';
!       }
!       break;
! 
!       case 'entry_document': {
!         $title .= 'Entry Pages';
!       }
!       break;
! 
!       case 'exit_document': {
!         $title .= 'Exit Pages';
!       }
!       break;
! 
!       case 'exit_target': {
!         $title .= 'Exit Targets';
!       }
!       break;
! 
!       case 'host': {
!         $title .= 'Hosts';
!       }
!       break;
! 
!       case 'operating_system': {
!         $title .= 'Operating Systems';
!       }
!       break;
! 
!       case 'referer': {
!         $title .= 'Referers';
!       }
!       break;
! 
!       case 'user_agent': {
!         $title .= 'User Agents';
!       }
!       break;
!     }
! 
!     $title .= " (Total: $total)";
  
!     for ($i = 0, $numValues = sizeof($values); $i < $numValues; $i++) {
!       $legend[$i] = sprintf(
!         '%s (%s, %s%%%%)',
  
!         $names[$i],
!         $values[$i],
!         $percent[$i]
!       );
      }
- 
-     $graph = new PieGraph($parameters['width'], $parameters['height'], 'auto');
-     $graph->SetShadow();
- 
-     $graph->title->Set($title);
-     $graph->title->SetFont($parameters['font'], $parameters['font_style'], $parameters['font_size']);
-     $graph->title->SetColor('black');
-     $graph->legend->Pos(0.1, 0.2);
- 
-     $plot = new PiePlot3d($values);
-     $plot->SetTheme('sand');
-     $plot->SetCenter(0.4);
-     $plot->SetAngle(30);
-     $plot->value->SetFont($parameters['font'], $parameters['font_style'], $parameters['font_size'] - 2);
-     $plot->SetLegends($legend);
- 
-     $graph->Add($plot);
-     $graph->Stroke();
-   }
  }
  
--- 22,49 ----
  * @since    phpOpenTracker 1.0.0
  */
! class phpOpenTracker_API_Plugin_plot_top extends phpOpenTracker_API_Plugin {
!     /**
!     * API Calls
!     *
!     * @var array $apiCalls
!     */
!     public $apiCalls = array('top');
  
!     /**
!     * API Type
!     *
!     * @var string $apiType
!     */
!     public $apiType = 'plot';
  
!     /**
!     * Runs the phpOpenTracker API call.
!     *
!     * @param  array $parameters
!     * @return mixed
!     * @access public
!     */
!     public function run($parameters) {
      }
  }
  

Index: returning_visitors.php
===================================================================
RCS file: /cvsroot/phpopencounter/phpOpenTracker/phpOpenTracker/API/plugins/returning_visitors.php,v
retrieving revision 1.35
retrieving revision 1.36
diff -C2 -d -r1.35 -r1.36
*** returning_visitors.php	19 Sep 2003 07:17:27 -0000	1.35
--- returning_visitors.php	22 Nov 2003 08:47:43 -0000	1.36
***************
*** 23,383 ****
  * @since    phpOpenTracker 1.0.5
  */
! class phpOpenTracker_API_returning_visitors extends phpOpenTracker_API_Plugin {
!   /**
!   * API Calls
!   *
!   * @var array $apiCalls
!   */
!   var $apiCalls = array(
!     'average_time_between_visits',
!     'average_visits',
!     'num_one_time_visitors',
!     'num_return_visits',
!     'num_returning_visitors',
!     'num_unique_visitors',
!     'returning_visitors'
!   );
! 
!   /**
!   * API Type
!   *
!   * @var string $apiType
!   */
!   var $apiType = 'get';
! 
!   /**
!   * Runs the phpOpenTracker API call.
!   *
!   * @param  array $parameters
!   * @return mixed
!   * @access public
!   */
!   function run($parameters) {
!       switch ($parameters['api_call']) {
!         case 'average_time_between_visits': {
!           return $this->_averageTimeBetweenVisits($parameters);
!         }
!         break;
! 
!         case 'average_visits': {
!           return $this->_averageVisits($parameters);
!         }
!         break;
  
!         case 'num_one_time_visitors': {
!           return $this->_numOneTimeVisitors($parameters);
!         }
!         break;
  
!         case 'num_return_visits': {
!           return $this->_numReturnVisits($parameters);
!         }
!         break;
  
!         case 'num_returning_visitors': {
!           return $this->_numReturningVisitors($parameters);
!         }
!         break;
  
!         case 'num_unique_visitors': {
!           return $this->_numUniqueVisitors($parameters);
!         }
!         break;
  
!         case 'returning_visitors': {
!           return $this->_returningVisitors($parameters);
!         }
!         break;
!       }
!   }
  
!   /**
!   * Returns the average time between visits of
!   * returning visitors.
!   *
!   * @param  array $parameters
!   * @return integer
!   * @access private
!   * @author Sven Weih <[email protected]>
!   * @since  phpOpenTracker 1.3.0
!   */
!   function _averageTimeBetweenVisits($parameters) {
!     $timeCount  = 0;
!     $visitCount = 0;
!     $visitors   = $this->_queryReturningVisitors($parameters);
  
!     if (!empty($visitors)) {
!       $keys    = array_keys($visitors);
!       $numKeys = sizeof($keys);
  
!       for ($i = 0; $i < $numKeys; $i++) {
!         $visitors[$keys[$i]]['num_visits'] = sizeof($visitors[$keys[$i]]['accesslog_ids']);
!         $visitors[$keys[$i]]['visitor_id'] = $keys[$i];
!         
!         if ($visitors[$keys[$i]]['num_visits'] > 1) {
!           for ($j = 0; $j < $visitors[$keys[$i]]['num_visits'] - 1; $j++) {
!             $timeCount += ($visitors[$keys[$i]]['timestamps'][$j + 1] -
!             $visitors[$keys[$i]]['timestamps'][$j]);
!             $visitCount++;
            }
          }
-       }
- 
-       return ($visitCount == 0) ? 0 : floor($timeCount / $visitCount);
      }
  
!     return 0;
!   }
! 
!   /**
!   * Returns the average number of visits of
!   * returning visitors.
!   *
!   * @param  array $parameters
!   * @return integer
!   * @access private
!   * @since  phpOpenTracker 1.3.0
!   */
!   function _averageVisits($parameters) {
!     $returnVisitsParameters             = $parameters;
!     $returnVisitsParameters['api_call'] = 'num_return_visits';
! 
!     $returningVisitorsParameters             = $parameters;
!     $returningVisitorsParameters['api_call'] = 'num_returning_visitors';
! 
!     $returnVisits      = phpOpenTracker::get($returnVisitsParameters);
!     $returningVisitors = phpOpenTracker::get($returningVisitorsParameters);
! 
!     return ($returningVisitors == 0) ? 0 : floor($returnVisits / $returningVisitors);
!   }
! 
!   /**
!   * Returns the number of one time visitors.
!   *
!   * @param  array $parameters
!   * @return integer
!   * @access private
!   * @author Sven Weih <[email protected]>
!   * @since  phpOpenTracker 1.3.0
!   */
!   function _numOneTimeVisitors($parameters) {
!     $returningVisitorsParameters             = $parameters;
!     $returningVisitorsParameters['api_call'] = 'num_returning_visitors';
! 
!     $visitorsParameters             = $parameters;
!     $visitorsParameters['api_call'] = 'num_unique_visitors';
! 
!     $returningVisitors = phpOpenTracker::get($returningVisitorsParameters);
!     $visitors          = phpOpenTracker::get($visitorsParameters);
! 
!     return $visitors - $returningVisitors;
!   }
! 
!   /**
!   * Returns the number of return visits.
!   *
!   * @param  array $parameters
!   * @return integer
!   * @access private
!   * @since  phpOpenTracker 1.3.0
!   */
!   function _numReturnVisits($parameters) {
!     $oneTimeVisitorsParameters             = $parameters;
!     $oneTimeVisitorsParameters['api_call'] = 'num_one_time_visitors';
! 
!     $visitsParameters             = $parameters;
!     $visitsParameters['api_call'] = 'visits';
! 
!     return phpOpenTracker::get($visitsParameters) -
!            phpOpenTracker::get($oneTimeVisitorsParameters);
!   }
! 
!   /**
!   * Returns the number of returning visitors.
!   *
!   * @param  array $parameters
!   * @return integer
!   * @access private
!   * @since  phpOpenTracker 1.3.0
!   */
!   function _numReturningVisitors($parameters) {
!     $this->db->query(
!       sprintf(
!         "SELECT COUNT(visitors.visitor_id) AS returning_visitors
!            FROM %s accesslog,
!                 %s visitors
!           WHERE visitors.client_id         = '%d'
!             AND visitors.accesslog_id      = accesslog.accesslog_id
!             AND visitors.returning_visitor = '1'
!                 %s
!                 %s",
! 
!         $this->config['accesslog_table'],
!         $this->config['visitors_table'],
!         $parameters['client_id'],
!         $this->_constraint($parameters['constraints']),
!         $this->_whereTimerange(
!           $parameters['start'],
!           $parameters['end']
!         )
!       )
!     );
! 
!     if ($row = $this->db->fetchRow()) {
!       return $row['returning_visitors'];
!     } else {
!       return 0;
      }
-   }
  
!   /**
!   * Returns the number of unique visitors.
!   *
!   * @param  array $parameters
!   * @return integer
!   * @access private
!   * @since  phpOpenTracker 1.3.0
!   */
!   function _numUniqueVisitors($parameters) {
!     $this->db->query(
!       sprintf(
!         "SELECT COUNT(DISTINCT(visitors.visitor_id)) AS unique_visitors
!            FROM %s accesslog,
!                 %s visitors
!           WHERE visitors.client_id    = '%d'
!             AND visitors.accesslog_id = accesslog.accesslog_id
!                 %s
!                 %s",
! 
!         $this->config['accesslog_table'],
!         $this->config['visitors_table'],
!         $parameters['client_id'],
!         $this->_constraint($parameters['constraints']),
!         $this->_whereTimerange(
!           $parameters['start'],
!           $parameters['end']
!         )
!       )
!     );
! 
!     if ($row = $this->db->fetchRow()) {
!       return $row['unique_visitors'];
!     } else {
!       return 0;
      }
-   }
- 
-   /**
-   * Returns information for the returning visitors.
-   *
-   * @param  array $parameters
-   * @return array
-   * @access private
-   */
-   function _returningVisitors($parameters) {
-     $visitors = $this->_queryReturningVisitors($parameters);
  
!     if (!empty($visitors)) {
!       $keys    = array_keys($visitors);
!       $numKeys = sizeof($keys);
! 
!       for ($i = 0; $i < $numKeys; $i++) {
!         $visitors[$keys[$i]]['num_visits'] = sizeof($visitors[$keys[$i]]['accesslog_ids']);
!         $visitors[$keys[$i]]['visitor_id'] = $keys[$i];
! 
!         if ($visitors[$keys[$i]]['num_visits'] > 1) {
!           $time = 0;
! 
!           for ($j = 0; $j < $visitors[$keys[$i]]['num_visits'] - 1; $j++) {
!             $time += ($visitors[$keys[$i]]['timestamps'][$j+1] -
!                       $visitors[$keys[$i]]['timestamps'][$j]);
!           }
! 
!           $visitors[$keys[$i]]['average_time_between_visits'] = floor($time / ($visitors[$keys[$i]]['num_visits'] - 1));
!         } else {
!           unset ($visitors[$keys[$i]]);
!         }
!       }
! 
!       if (!empty($visitors)) {
!         foreach($visitors as $visitor) $tmp[] = $visitor['num_visits'];
!         array_multisort($tmp, SORT_DESC, $visitors);
!       }
      }
  
!     switch ($parameters['result_format']) {
!       case 'xml':
!       case 'xml_object': {
!         $tree = new XML_Tree;
!         $root = &$tree->addRoot('returningVisitors');
! 
!         $numVisitors = sizeof($visitors);
! 
!         for ($i = 0; $i < $numVisitors; $i++) {
!           $visitorChild = &$root->addChild('visitor');
!           $visitsChild  = &$visitorChild->addChild('visits');
! 
!           $numVisits = sizeof($visitors[$i]['accesslog_ids']);
! 
!           for ($j = 0; $j < $numVisits; $j++) {
!             $visitChild = &$visitsChild->addChild('visit');
! 
!             $visitChild->addChild('accesslogID', $visitors[$i]['accesslog_ids'][$j]);
!             $visitChild->addChild('timestamp',   $visitors[$i]['timestamps'][$j]);
!           }
! 
!           $visitorChild->addChild('numVisits', $visitors[$i]['num_visits']);
!           $visitorChild->addChild('visitorID', $visitors[$i]['visitor_id']);
!         }
! 
!         if ($parameters['result_format'] == 'xml') {
!           return $root->get();
!         } else {
!           return $root;
!         }
!       }
!       break;
! 
!       default: {
!         return $visitors;
!       }
      }
-   }
- 
-   function _queryReturningVisitors($parameters) {
-     $visitors = array();
  
!     $this->db->query(
!       sprintf(
!         "SELECT visitors.accesslog_id AS accesslog_id,
!                 visitors.visitor_id   AS visitor_id,
!                 visitors.timestamp    AS timestamp
!            FROM %s accesslog,
!                 %s visitors
!           WHERE visitors.client_id    = '%d'
!             AND visitors.accesslog_id = accesslog.accesslog_id
!                 %s
!                 %s
!           ORDER BY visitors.visitor_id,
!                    visitors.timestamp",
! 
!         $this->config['accesslog_table'],
!         $this->config['visitors_table'],
!         $parameters['client_id'],
!         $this->_constraint($parameters['constraints']),
!         $this->_whereTimerange(
!           $parameters['start'],
!           $parameters['end']
!         )
!       )
!     );
  
!     while ($row = $this->db->fetchRow()) {
!       $visitors[$row['visitor_id']]['accesslog_ids'][] = $row['accesslog_id'];
!       $visitors[$row['visitor_id']]['timestamps'][]    = $row['timestamp'];
      }
  
!     return $visitors;
!   }
  }
  
--- 23,174 ----
  * @since    phpOpenTracker 1.0.5
  */
! class phpOpenTracker_API_Plugin_returning_visitors extends phpOpenTracker_API_Plugin {
!     /**
!     * API Calls
!     *
!     * @var array $apiCalls
!     */
!     public $apiCalls = array(
!       'average_time_between_visits',
!       'average_visits',
!       'num_one_time_visitors',
!       'num_return_visits',
!       'num_returning_visitors',
!       'num_unique_visitors',
!       'returning_visitors'
!     );
  
!     /**
!     * API Type
!     *
!     * @var string $apiType
!     */
!     public $apiType = 'get';
  
!     /**
!     * Runs the phpOpenTracker API call.
!     *
!     * @param  array $parameters
!     * @return mixed
!     * @access public
!     */
!     public function run($parameters) {
!         switch ($parameters['api_call']) {
!           case 'average_time_between_visits': {
!               return $this->averageTimeBetweenVisits($parameters);
!           }
!           break;
  
!           case 'average_visits': {
!               return $this->averageVisits($parameters);
!           }
!           break;
  
!           case 'num_one_time_visitors': {
!               return $this->numOneTimeVisitors($parameters);
!           }
!           break;
  
!           case 'num_return_visits': {
!               return $this->numReturnVisits($parameters);
!           }
!           break;
  
!           case 'num_returning_visitors': {
!               return $this->numReturningVisitors($parameters);
!           }
!           break;
  
!           case 'num_unique_visitors': {
!               return $this->numUniqueVisitors($parameters);
!           }
!           break;
  
!           case 'returning_visitors': {
!               return $this->returningVisitors($parameters);
            }
+           break;
          }
      }
  
!     /**
!     * Returns the average time between visits of
!     * returning visitors.
!     *
!     * @param  array $parameters
!     * @return integer
!     * @access private
!     * @author Sven Weih <[email protected]>
!     * @since  phpOpenTracker 1.3.0
!     */
!     private function averageTimeBetweenVisits($parameters) {
      }
  
!     /**
!     * Returns the average number of visits of
!     * returning visitors.
!     *
!     * @param  array $parameters
!     * @return integer
!     * @access private
!     * @since  phpOpenTracker 1.3.0
!     */
!     private function averageVisits($parameters) {
      }
  
!     /**
!     * Returns the number of one time visitors.
!     *
!     * @param  array $parameters
!     * @return integer
!     * @access private
!     * @author Sven Weih <[email protected]>
!     * @since  phpOpenTracker 1.3.0
!     */
!     private function numOneTimeVisitors($parameters) {
      }
  
!     /**
!     * Returns the number of return visits.
!     *
!     * @param  array $parameters
!     * @return integer
!     * @access private
!     * @since  phpOpenTracker 1.3.0
!     */
!     private function numReturnVisits($parameters) {
      }
  
!     /**
!     * Returns the number of returning visitors.
!     *
!     * @param  array $parameters
!     * @return integer
!     * @access private
!     * @since  phpOpenTracker 1.3.0
!     */
!     private function numReturningVisitors($parameters) {
!     }
  
!     /**
!     * Returns the number of unique visitors.
!     *
!     * @param  array $parameters
!     * @return integer
!     * @access private
!     * @since  phpOpenTracker 1.3.0
!     */
!     private function numUniqueVisitors($parameters) {
      }
  
!     /**
!     * Returns information for the returning visitors.
!     *
!     * @param  array $parameters
!     * @return array
!     * @access private
!     */
!     private function returningVisitors($parameters) {
!     }
  }
  




-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.