<?php

/* 

 * phpMyVisites : website statistics and audience measurements

 * Copyright (C) 2002 - 2006

 * http://www.phpmyvisites.net/ 

 * phpMyVisites is free software (license GNU/GPL)

 * Authors : phpMyVisites team

*/



// $Id: ArchiveDay.class.php 236 2007-11-04 15:04:08Z matthieu_ $



require_once INCLUDE_PATH."/core/include/ArchiveCategory.class.php";

require_once INCLUDE_PATH."/core/include/ArchiveTable.class.php";



/**

 * Class that manages Day archives

 * Used by Archive and used for a simple day archiving

 */

class ArchiveDay extends Archive

{

	/**

	 * @var array objectName => objectValue

	 */

	var $objects;



	/**

	 * constructor

	 * 

	 * @param object $site

	 * @param string $s_date

	 */

	function ArchiveDay($site, $s_date = '')

	{

		parent::Archive($site);

		

		/*print($s_date);

		print("<pre>");

		debug_print_backtrace();

		print("</pre>");

		*/

		$this->setPeriodType(DB_ARCHIVES_PERIOD_DAY);

		

		if(!empty($s_date))

		{

			$this->setDate($s_date);

		}

		

		$this->objects['provider'] = new ArchiveTable('provider');

		

		$this->objects['treeCategory'] = new ArchiveCategory($this->site->getId());

		

		$a_archiveTable = array(

		'provider', 'config', 'resolution', 'vars_name', 'vars_value', 'page', 'file', 'category',

		'search_engine', 'keyword', 'site', 'newsletter', 'partner_name', 'partner_url'

		);

		foreach($a_archiveTable as $name)

		{

			$this->objects[$name] = new ArchiveTable($name);

		}

		

	}

	

	/**

	 * set dates to the object, after reseting the datas to the previous date. 

	 * It also sets the date2 value to current time + 10 min.

	 * Used during the check of archives state, to know if we need to compute again.

	 * 

	 * @param string $s_date

	 * 

	 * @return void

	 */

	function setDate($s_date)

	{

		/*

		 * reset info of the current object

		 */

		$this->reset();

		

		/*

		 * set the date

		 */

		$this->date = $this->offsetDate(new Date($s_date));

		

		if($this->date->isPeriodFinished($this->periodType))

		{

			$this->state = DB_ARCHIVES_DONE;

		}

		else

		{

			$this->state = DB_ARCHIVES_TEMP;

		}

		

		/*

		 * set a date2 only for compatibility with parent::initDb and updateDb

		 */

		// add 15s to keep the same archive for graphics

		$this->date2 = new Str(time() + TIME_BEFORE_NEW_DAY_ARCHIVE + SECURE_TIME_BEFORE_NEW_ARCHIVE); 

		

		

		$this->setLiteralDate();

	}

	

	

	/**

	 * resets current date info

	 * It doesn't reset the objects values because by changing the date, 

	 * we do not want to compute objects values again! 

	 * 

	 * @return void

	 */

	function reset()

	{		

		$this->date = null;

		$this->toRecord = null;

		$this->idArchives = null; 

		$this->state = null;

		$this->archiveOk = null;

	}	

	

	/**

	 * verify if the current day is archived, and if the archive is not too old

	 * 

	 * @return bool

	 */

	function isArchived()

	{

		// case days, be careful to parrallel archiving

		if($this->periodType == DB_ARCHIVES_PERIOD_DAY)

		{			

			$r = query("SELECT idarchives, date2

					FROM ".T_ARCHIVES ."

					WHERE idsite = ".$this->site->getId() ."

						AND date1 = '".$this->date->get()."'

						AND done = ". DB_ARCHIVES_FAIL ."

						AND period = ".$this->periodType."

					ORDER BY idarchives DESC

					LIMIT 1"

					);

			if(mysql_num_rows($r) > 0)

			{

				$l = mysql_fetch_assoc($r);



				$dateToWait =  $l['date2'] + TIME_TO_WAIT_FOR_PARALLEL_ARCHIVE;

				$delta = time() + TIME_BEFORE_NEW_DAY_ARCHIVE + SECURE_TIME_BEFORE_NEW_ARCHIVE - $dateToWait;

				if($delta < 0 )

				{

					print("There is currently an archiving which is being processed (idarchives = ".$l['idarchives']."). Please wait a few minutes (". -$delta ." seconds), and try again (we have to wait for the archive to be totally computed!");

					print("<hr /><a href='http://www.phpmyvisites.us/documentation/Concurrent_archiving'>Help in english</a><br /><a href='http://www.phpmyvisites.net/documentation/Archivages_concurrents'>Help in french (aide en français)</a>");

					exit;

				}

			}

		}

		//print(" OK pas de temps idsite = ".$this->site->getId() ." AND date1 = '".$this->date->get()."'<br>");

		$r = query("SELECT idarchives, date2" .

				" FROM ".T_ARCHIVES .

				" WHERE idsite = ".$this->site->getId() .

				" AND date1 = '".$this->date->get()."'" .

				" AND done = ". $this->state .

				" AND period = ".$this->periodType.

				" ORDER BY idarchives DESC

				  LIMIT 1"

				);

		if(mysql_num_rows($r) > 0)

		{

			$l = mysql_fetch_assoc($r);

			

			// check if we again archive if temp archived yet

			if($this->state === DB_ARCHIVES_TEMP && $l['date2'] < time())

			{

				

				if(!isset($GLOBALS['header_message_tpl_out']))

				{

					$GLOBALS['header_message_tpl'] .= "Temporary Archive is now out of date, archive again. <br />";

				}

				$GLOBALS['header_message_tpl_out'] = true;

				

				return false;

			}

			else if($this->state === DB_ARCHIVES_TEMP)

			{

				if(!isset($GLOBALS['header_message_tpl_temp']))

				{

					$GLOBALS['header_message_tpl'] .= "Temporary archive is less than ".round((TIME_BEFORE_NEW_DAY_ARCHIVE + SECURE_TIME_BEFORE_NEW_ARCHIVE) / 60)."min, it's ok !";

				}

				$GLOBALS['header_message_tpl_temp'] = true;

			}

			else

			{

				//printDebug("<u>Day ".$this->date->get()." archived definitely, it's ok !</u><br>");

			}

			$this->idArchives = $l['idarchives'];

			return true;

		}

		else

		{

			$GLOBALS['header_message_tpl'] .= "Day not archived yet...<br>";

			return false;

		}

	}

	

	/**

	 * compute all current day information, from the logs

	 * Complex processus, and beatiful arithmetic

	 */

	function compute()

	{

		// simpler archive for current period because else it's too long to compute, 

		// and too heavy for server

		if(CURRENT_DAY_SIMPLE_ARCHIVE 

				&& $this->state == DB_ARCHIVES_TEMP)

		{

			

			$this->toRecord['simple'] = 1;

		}

		else

		{

			$this->toRecord['simple'] = 0;

		}



		if(!isset($GLOBALS['header_message_tpl_archiving']))

		{

			$GLOBALS['header_message_tpl'] .= "<strong>Archiving ".$this->date->get()."...</strong><br />";

		}

		$GLOBALS['header_message_tpl_archiving'] = true;

		

		$siteUrls = $this->site->getUrls();

		$siteInfo = $this->site->getInfo();

		

		/*

		 * init

		 */

		 

		$this->initDb();

		

		/*

		 * global info

		 */					

		$r = query("SELECT count(distinct idcookie) as nb_uniq_vis, count(*) as nb_vis, 

							 sum(total_pages) as nb_pag, max(total_pages) as nb_max_pag, 

							 sum(total_time) as sum_vis_lth,

							 sum(case total_pages when 1 then 1 else 0 end) as nb_vis_1pag 

					FROM ".T_VISIT."

					WHERE server_date = '".$this->date->get()."'

						AND idsite = ".$this->site->getId()."

					GROUP BY server_date

				 ");

		if(mysql_num_rows($r) == 0)

		{

			$this->toRecord['nb_vis'] = 0;

			$this->toRecord['nb_uniq_vis'] = 0;

			

			$this->saveDb();

			return true;

		}

			

		$r = mysql_fetch_assoc($r);

		//printDebug($r);	

		

		foreach($r as $key => $value)

		{

			$this->toRecord[$key] = $value;

		}

		

		$r = query("SELECT count(distinct l.idpage) as nb_uniq_pag " .

				" FROM ".T_VISIT." as v 

					LEFT JOIN ".T_LINK_VP." as l USING (idvisit)" .

				" WHERE v.server_date = '".$this->date->get()."'" .

				" AND v.idsite = ".$this->site->getId()." " .

				" LIMIT 1");

		$r = mysql_fetch_assoc($r);

		//printDebug($r);	

		$this->toRecord['nb_uniq_pag'] = $r['nb_uniq_pag'];



		/*

		 * returning visitors

		 */

		 $r = query("SELECT count(distinct idcookie) as nb_uniq_vis_returning ".$GLOBALS['test']."

				 	FROM ".T_VISIT."

				 	WHERE server_date = '".$this->date->get()."'

				 	AND idsite = ".$this->site->getId()."

				 	AND returning = 1

				 	GROUP BY returning"

					);

		$l = mysql_fetch_assoc($r);

		

		$this->toRecord['nb_vis_returning'] = $l['s'];

		$this->toRecord['nb_uniq_vis_returning'] = $l['nb_uniq_vis_returning'];

		$this->toRecord['nb_pag_returning'] = $l['sumpage'];

		$this->toRecord['nb_vis_1pag_returning'] = $l['onepage'];

		$this->toRecord['sum_vis_lth_returning'] = $l['sumtime'];



		/*

		printDebug("<br>returning visitor ". $this->toRecord['nb_vis_returning']);		

		printDebug("<br>pag  returning ". $this->toRecord['nb_pag_returning']);		

		printDebug("<br>vis a 1 page returning ". $this->toRecord['nb_vis_1pag_returning']);		

		printDebug("<br>sum vis returnoing ". $this->toRecord['sum_vis_lth_returning']);

		//exit;

		*/

		/**

		 * number of visits per visitor

		 */

		$r = query("SELECT count(*) as s

						FROM ".T_VISIT."

						WHERE idsite = ".$this->site->getId()."

						AND server_date = '".$this->date->get()."'

						GROUP BY idcookie");

		$res = array();

		while($fx = mysql_fetch_assoc($r))

		{

			@$this->toRecord['vis_nb_vis'][(int)$fx['s']]++;

		}

		ksort($this->toRecord['vis_nb_vis']);

		

		/*

		 * server time

		 */

		$r = query("SELECT HOUR(server_time) as h " .$GLOBALS['test'].

				" FROM ".T_VISIT.

				" WHERE server_date = '".$this->date->get()."'" .

				" AND idsite = ".$this->site->getId()." " .

				" GROUP BY h");

		

		while($l = mysql_fetch_assoc($r))

		{

			//printDebug("<hr>server ".$l['h']."h<br>");

			$this->toRecord['vis_st'][$l['h']] = $l['s'];	

			$this->toRecord['pag_st'][$l['h']] = $l['sumpage'];	

			$this->toRecord['int_st'][$l['h']] = array($l['s'],  $l['sumpage'], $l['onepage'], $l['sumtime']); 

		}

		ksort($this->toRecord['vis_st']);

		ksort($this->toRecord['pag_st']);		

		

		/*

		 * local time

		 */

		$r = query("SELECT HOUR(local_time) as h, sum(returning) as returning " .$GLOBALS['test'].

				" FROM ".T_VISIT.

				" WHERE server_date = '".$this->date->get()."'" .

				" AND idsite = ".$this->site->getId()." " .

				" GROUP BY h");

		

		while($l = mysql_fetch_assoc($r))

		{

			$this->toRecord['vis_lt'][$l['h']] = (int)$l['s'];	

			$this->toRecord['pag_lt'][$l['h']] = (int)$l['sumpage'];	

			$this->toRecord['int_lt'][$l['h']] = array($l['s'],  $l['sumpage'], $l['onepage'], $l['sumtime']);

			

			// returning

			$this->toRecord['vis_period'][$l['h']] = array(

						ARRAY_INDEX_PAGES_COUNT  => $l['sumpage'],

						ARRAY_INDEX_RETURNING_COUNT => $l['returning'],

						ARRAY_INDEX_NEW_COUNT => $l['s'] - $l['returning']

						);

		}

		for($i = 0; $i < 24; $i++)

		{

			if(!isset($this->toRecord['vis_period'][$i]))

			{

				$this->toRecord['vis_period'][$i] = array(

						ARRAY_INDEX_PAGES_COUNT  => 0,

						ARRAY_INDEX_RETURNING_COUNT => 0,

						ARRAY_INDEX_NEW_COUNT => 0

						);

			}

		}

		ksort($this->toRecord['vis_lt']);		

		ksort($this->toRecord['pag_lt']);



		

		/*

		 * visit length

		 */



		foreach($GLOBALS['timeGap'] as $value)

		{

			$min = $value[0] * 60;

			$max = $value[1] * 60;

			$r = query("SELECT count(*) as s " .

					" FROM ".T_VISIT. 

					" WHERE total_time >= ".$min." " .

					" AND total_time <= ".$max."" .

					" AND server_date = '".$this->date->get()."'" .

					" AND idsite = ".$this->site->getId()

					);

			$l = mysql_fetch_assoc($r);

			$this->toRecord['vis_lth'][] = $l['s'];

		}

		

		/*

		 * visit per page number

		 */



		foreach($GLOBALS['pagesGap'] as $value)

		{

			$min = $value[0];

			$max = isset($value[1])?$value[1]:'10000';

			

			$r = query("SELECT count(*) as s " .

					" FROM ".T_VISIT. 

					" WHERE total_pages >= ".$min." " .

					" AND total_pages <= ".$max."" .

					" AND server_date = '".$this->date->get()."'" .

					" AND idsite = ".$this->site->getId()." "

					);

			$l = mysql_fetch_assoc($r);

			$this->toRecord['vis_nb_pag'][] = $l['s'];

		}



		if($this->toRecord['simple'] == 1)

		{	

			$this->saveDb();

			return true;

		}

		/*

		 * country

		 */

		$r = query("SELECT country as c " .$GLOBALS['test'].

				" FROM ".T_VISIT. 

				" WHERE server_date = '".$this->date->get()."'" .

				" AND idsite = ".$this->site->getId()." " .

				" GROUP BY c" 

				);

		



		while($l = mysql_fetch_assoc($r))

		{

			$this->toRecord['vis_country'][$l['c']] = $l['s'];

			$this->toRecord['int_country'][$l['c']] = array($l['s'],  $l['sumpage'], $l['onepage'], $l['sumtime']);

		}

		



		/*

		 * continent

		 */

		$r = query("SELECT continent as c " .$GLOBALS['test'].

				" FROM ".T_VISIT. 

				" WHERE server_date = '".$this->date->get()."'" .

				" AND idsite = ".$this->site->getId()." " .

				" GROUP BY c" 

				);

		

		while($l = mysql_fetch_assoc($r))

		{

			$this->toRecord['vis_continent'][$l['c']] = $l['s'];

			$this->toRecord['int_continent'][$l['c']] = array($l['s'],  $l['sumpage'], $l['onepage'], $l['sumtime']);

		}

		

		

		/*

		 * provider

		 */

		$r = query("SELECT hostname_ext as h " .$GLOBALS['test']. // else

				" FROM ".T_VISIT. 

				" WHERE server_date = '".$this->date->get()."'" .

				" AND idsite = ".$this->site->getId()." " .

				" GROUP BY h" );

				

		while($l = mysql_fetch_assoc($r))

		{

			$key = $this->objects['provider']->getId($l['h']);

			$this->toRecord['vis_provider'][$key] = $l['s'];

		}

		

		

		/*

		 * config (os+browser+resolution)

		 */

		$r = query("SELECT CONCAT(os, ';', browser_name, ';', resolution) as c " .$GLOBALS['test'].

				" FROM ".T_VISIT. 

				" WHERE  server_date = '".$this->date->get()."'" .

				" AND idsite = ".$this->site->getId()." " .

				" GROUP BY c");



		while($l = mysql_fetch_assoc($r))

		{

			$key = $this->objects['config']->getId($l['c']);

			$this->toRecord['vis_config'][$key] = $l['s'];	

		}

		

		

		/*

		 * os

		 */

		$r = query("SELECT os as o " .$GLOBALS['test'].

				" FROM ".T_VISIT. 

				" WHERE server_date = '".$this->date->get()."'" .

				" AND idsite = ".$this->site->getId()." " .

				" GROUP BY o");

		

		while($l = mysql_fetch_assoc($r))

		{

			$this->toRecord['vis_os'][$l['o']] = $l['s'];	

			$this->toRecord['int_os'][$l['o']] = array($l['s'],  $l['sumpage'], $l['onepage'], $l['sumtime']);

		}

		

		/*

		 * browser

		 */

		$r = query("SELECT CONCAT(browser_name, ';', browser_version) as b " .$GLOBALS['test'].

				" FROM ".T_VISIT. 

				" WHERE server_date = '".$this->date->get()."'" .

				" AND idsite = ".$this->site->getId()." " .

				" GROUP BY b");

		while($l = mysql_fetch_assoc($r))

		{

			$this->toRecord['vis_browser'][$l['b']] = $l['s'];	

			$this->toRecord['int_browser'][$l['b']] = array($l['s'],  $l['sumpage'], $l['onepage'], $l['sumtime']);

		}

		

		/*

		 * browser families

		 */

		$this->toRecord['vis_browser_type'] = array(

					'ie'=>0,

					'gecko'=>0,

					'khtml'=>0,

					'opera'=>0

					);

		

		foreach($this->toRecord['vis_browser'] as $key => $value)

		{

			foreach($GLOBALS['browserFamilies'] as $familyName => $a_browsers)

			{

				if(in_array(substr($key, 0, 2), $a_browsers))

				{

					$this->toRecord['vis_browser_type'][$familyName] += $value;				

				}

			}

		}

	

		/*

		 * resolution

		 */

		$r = query("SELECT resolution as r " .$GLOBALS['test'].

				" FROM ".T_VISIT. 

				" WHERE server_date = '".$this->date->get()."'" .

				" AND idsite = ".$this->site->getId()." " .

				" GROUP BY r" 

				);



		while($l = mysql_fetch_assoc($r))

		{

			if(strlen($l['r']) > 5)

			{

				$key = $this->objects['resolution']->getId($l['r']);

				$this->toRecord['vis_resolution'][$key] = $l['s'];	

				$this->toRecord['int_resolution'][$key] = array($l['s'],  $l['sumpage'], $l['onepage'], $l['sumtime']);

			}

		}

		

		/*

		 * plugins

		 */

		$r = query("SELECT  sum(case pdf when 1 then 1 else 0 end) as pdf, 

							sum(case flash when 1 then 1 else 0 end) as flash, 

				 			sum(case java when 1 then 1 else 0 end) as java, 

							sum(case javascript when 1 then 1 else 0 end) as javascript, 

							sum(case director when 1 then 1 else 0 end) as director,

				 			sum(case quicktime when 1 then 1 else 0 end) as quicktime, 

							sum(case realplayer when 1 then 1 else 0 end) as realplayer,

							sum(case windowsmedia when 1 then 1 else 0 end) as windowsmedia,

							sum(case cookie when 1 then 1 else 0 end) as cookie

				 FROM ".T_VISIT."

				 WHERE server_date = '".$this->date->get()."'

				 AND idsite = ".$this->site->getId());

		

		$this->toRecord['vis_plugin'] = mysql_fetch_assoc($r);

		

		/*

		 * vis_pag_grp

		 */	 

		$this->computeGroupPageInfo();

		

		/*

		 * referer

		 */

		$this->computeReferer();



		/*

		 * Sort and limit huge arrays

		 */

		$this->sortAndLimitToRecord();

		

		/*

		 * final save, close your eyes and prey 

		 */

		 $this->saveDb();

		 

		 /*

		  * delete link_vp link_vpv and path records for this day

		  */

		 

		 $this->deleteOldRecords();

		 

		 return true;

	}

	

	function deleteOldRecords()

	{

		parent::deleteOldRecords( );

		

		if($this->date->get() != getDateFromTimestamp( time() ))

		{

			if(version_compare(getMysqlVersion(), '4.0') != -1)

			{

				$r = query("DELETE 

							FROM ".T_LINK_VP.", ".T_LINK_VPV."

							USING ".T_VISIT."

								LEFT JOIN ".T_LINK_VP."

								USING ( idvisit )

								LEFT JOIN ".T_LINK_VPV."

								USING ( idlink_vp )

							WHERE ".T_VISIT.".server_date = '".$this->date->get()."'

						 		AND ".T_VISIT.".idsite = ".$this->site->getId()."

						 ");

			}

		

			// mysql < 4.0

			else

			{				

				// delete link_vp records

				print("Your mysql version is less than 4.0, so this process will be very long 

				(a big feature is not implemented in your 3.23 version). 

				<br>You should use mysql 4.0 or mysql 4.1!<br>

				<br>Vous devriez utiliser mysql 4.0 ou supérieure pour plus de performances 

				(une fonctionnalité très importante est manquante à votre version 3.23<br>");

				

				// select all link_vp id

				$r = query("SELECT idlink_vp

							FROM ".T_VISIT."

								LEFT JOIN ".T_LINK_VP."

								USING ( idvisit )

							WHERE ".T_VISIT.".server_date = '".$this->date->get()."'

						 		AND ".T_VISIT.".idsite = ".$this->site->getId()."

						 		");

				

				while($l = mysql_fetch_row($r))

				{

					if(!empty($l[0]))

						$r2 = query("DELETE FROM ".T_LINK_VP."

								WHERE idlink_vp = ".$l[0]);

				}

				

			}

			

			$r3 = query("OPTIMIZE TABLE ".T_LINK_VP.", ".T_LINK_VPV);

		}					

	}

	

	

	/**

	 * Computes all info relative to pages, groups, and files

	 * Arrays computed contain sum by group (and subgroups), for pages and files

	 */

	function computeGroupPageInfo()

	{

		/*

		 * pages and hierarchy

		 */

		// removed in 2.2

		 $r = query("SELECT sum(total_time_page_ref) as s, idpage_ref" .

				" FROM ".T_VISIT." as v LEFT JOIN ".T_LINK_VP." as l USING (idvisit) " .

				" WHERE v.server_date = '".$this->date->get()."'" .

				" AND v.idsite = ".$this->site->getId()."

				GROUP BY idpage_ref"

		);

		while($l = mysql_fetch_assoc($r))

		{

			if($l['idpage_ref'] != 0)

			{

				$vis_pag_grp[$l['idpage_ref']] = array(

						ARRAY_INDEX_TIME_TOTAL => $l['s']

					);

			}	

		}

		

		$r = query("SELECT count(*) as s, p.name as name, p.idpage as idpage,  " .

				" COALESCE(c.idcategory,0) as idcategory, COALESCE(c.level, 1) as level, " .

				" COALESCE(c.idparent,0) as idparent, COALESCE(c.name,0) as namecategory " .

				" FROM (((".T_VISIT." as v LEFT JOIN ".T_LINK_VP." as l USING (idvisit)) " .

				"	LEFT JOIN ".T_PAGE." as p USING (idpage))" .

				"		LEFT JOIN ".T_CATEGORY." as c USING (idcategory))" .

				" WHERE v.server_date = '".$this->date->get()."'" .

				" AND v.idsite = ".$this->site->getId()." " .

				" GROUP BY p.idpage");



		while($l = mysql_fetch_assoc($r))

		{

			// pages names beginning by PREFIX_FILES are files, else there are normal pages

//			if(substr($l['name'], 0, 5) === PREFIX_FILES)

			if(isPrefixTag ($l['name']))

			{

				$type = ARRAY_TYPE_FILE;

//				$l['name'] = substr($l['name'], 5);

//				$l['name'] = deletePrefixTag ($l['name']);

			}

			else

			{

				$type = ARRAY_TYPE_PAGE;

			}

			

			if(!isset($vis_pag_grp[$l['idpage']]))

			{

				$vis_pag_grp[$l['idpage']] = array(

						ARRAY_INDEX_TIME_TOTAL => DEFAULT_TIME_PAGE

					);



			}

			$vis_pag_grp[$l['idpage']] = 

					array(

						ARRAY_INDEX_COUNT => $l['s'],

						ARRAY_INDEX_PAGE_NAME => databaseEscape($l['name']),

						ARRAY_INDEX_IDPAGE => $l['idpage'],

						ARRAY_INDEX_IDCATEGORY => $l['idcategory'],

						ARRAY_INDEX_LEVEL => $l['level'],

						ARRAY_INDEX_IDPARENT => $l['idparent'],

						ARRAY_INDEX_TYPE => $type,

						)

					+ $vis_pag_grp[$l['idpage']]

				;

		

		}

		

		//exit;

		/*

		 * variables and their values

		 */

		$r = query("SELECT count(*) as s, l.idpage as idpage, vv.name as vars_name, 

							IF( varchar_value IS NULL, int_value,varchar_value) as vars_value

				 FROM (((".T_VISIT." as v INNER JOIN ".T_LINK_VP." as l USING (idvisit)) 

					INNER JOIN ".T_LINK_VPV." as ll USING (idlink_vp))

						INNER JOIN ".T_VARS." as vv USING (idvars))

				 WHERE v.server_date = '".$this->date->get()."'

				 AND v.idsite = ".$this->site->getId()." 

				 GROUP BY l.idpage, ll.idvars"

				 );



		while($l = mysql_fetch_assoc($r))

		{

			$vis_pag_grp[$l['idpage']][ARRAY_INDEX_VARS][$l['vars_name']][] = array( 

									ARRAY_INDEX_VAR_COUNT => $l['s'],

									ARRAY_INDEX_VAR_VALUE => $l['vars_value']

									);

		}

		

		/*

		 * entry pages

		 */

		$r = query("SELECT count(*) as s, entry_idpage as c, sum(case total_pages when 1 then 1 else 0 end) as t

				FROM ".T_VISIT."

				WHERE server_date = '".$this->date->get()."'

				AND idsite = ".$this->site->getId()." 

				GROUP BY c");



		while($l = mysql_fetch_assoc($r))

		{

			

			// pages that are only but always "one visit page"

			if($l['t'] > 0)

			{

				$vis_pag_grp[$l['c']][ARRAY_INDEX_PAGES_VISIT_ONEPAGE] = $l['t'];

			}	

			

			$vis_pag_grp[$l['c']][ARRAY_INDEX_ENTRYPAGE] = $l['s'];	

		}

		

		

		/*

		 * exit pages

		 */

		$r = query("SELECT count(*) as s, exit_idpage as c

				FROM ".T_VISIT."

				WHERE server_date = '".$this->date->get()."'

				AND idsite = ".$this->site->getId()." 

				GROUP BY c");



		while($l = mysql_fetch_assoc($r))

		{

			$vis_pag_grp[$l['c']][ARRAY_INDEX_EXITPAGE] = $l['s'];	

		}

			 

		 

		$a_AllpageInfo = $vis_pag_grp;

		

		// sort array ording idLebel ASC

		uasort($a_AllpageInfo, "sortingAllPageInfo");

		

		

		$res=array();

		$res2=array();

		

		foreach($a_AllpageInfo as $key => $a_pageInfo)

		{

			if(!isset($a_pageInfo[ARRAY_INDEX_TYPE]))

			{

				printDebug('<b>There was a problem during archiving...</b>');

				//var_dump($a_pageInfo);

				//var_dump($key);

				//printDebug($a_pageInfo);

				continue;

			}

			// pages

			if(!isset($a_pageInfo[ARRAY_INDEX_TYPE]) 

				|| $a_pageInfo[ARRAY_INDEX_TYPE] === ARRAY_TYPE_PAGE)

			{

				$key = 'p'.$key;

			}

			// files

			else if($a_pageInfo[ARRAY_INDEX_TYPE] === ARRAY_TYPE_FILE)

			{

				$key = 'f'.$key;

			}

			else

			{

				echo "prob";exit;

			}

			

			$a = array($key => $a_pageInfo);

			

			if(isset($a_pageInfo[ARRAY_INDEX_IDCATEGORY]) && $a_pageInfo[ARRAY_INDEX_IDCATEGORY] != 0)

			{

				$res2 = $this->objects['treeCategory']->getTreeCompleted($a_pageInfo[ARRAY_INDEX_IDCATEGORY], $a);

			}

			else

			{

				$res2 = $a;

			}

			

			// merge recursively this page tree with global tree

			$res = array_merge_recursive($res, $res2);

		}	

		if(DEBUG)

		{

			$t = strlen(serialize($res))/1000;

		}

		

		/*

		 * convert page & category id from visit base to archive base

		 * sum for groups, subgroups, etc. of values of

		 * - hits

		 * - entry point

		 * - exit point

		 * - length

		 * - hits for each group varname-varvalue

		 * - [...]

		 */ 

		$this->walkAndSumArray($res);

		if(DEBUG)

		{

			$t = strlen(serialize($res))/1000;

		}

		$this->toRecord['vis_pag_grp'] = $res;

	}

	

	/**

	 * Recursively go through the array of pages/groups/files and sum all values, arrays

	 * 

	 * @param array $array passed by reference

	 * 

	 * @return array array('file' => array_values, 'page' => array_values)

	 */

	function walkAndSumArray(&$array)

	{

		$t = sizeof($array);

		for($i = 0; $i <$t; $i++)

		{

			$a_value =& $array[key($array)];

			

			if(is_array($a_value) && sizeof($a_value) > 0)

			{

				

				// if array is a category recursively calls the function that sums all values

				if(substr(key($array), 0, 1) === 'c')

				{

					$to_sum[] = $this->walkAndSumArray($a_value);

					

					// idcategory base logs To idcategory base archives

					$a_value[ARRAY_INDEX_IDCATEGORY] = 

						$this->objects['category']->getId(

							$this->objects['treeCategory']->getName(substr(key($array), 1))

								);

					

				}

				// else it's a page or a file and we have to sum all these values and return them

				else

				{

					if(!isset($a_value[ARRAY_INDEX_TYPE]) 

						|| $a_value[ARRAY_INDEX_TYPE] === ARRAY_TYPE_PAGE)

					{

						$type = 'page';

					}

					else if($a_value[ARRAY_INDEX_TYPE] === ARRAY_TYPE_FILE)

					{

						$type = 'file';

					}

					// this should not happen

					else

					{

						print("NO TYPE ! Not normal; report it to phpmyvisites forums = ");

						var_dump($a_value);

						//printDebug($a_value);

						$type = 'page';

						//exit();

					}

					

					

					// why this could not be set?

					// for files dude!

					if(isset($a_value[ARRAY_INDEX_PAGE_NAME]))

					{

						// idpage base 1 (logs) to idpage base 2 (archive)

						$a_value[ARRAY_INDEX_IDPAGE] = 

								$this->objects[$type]->getId(@$a_value[ARRAY_INDEX_PAGE_NAME]);

						unset($a_value[ARRAY_INDEX_PAGE_NAME]);

					}

					

					//var_dump($a_value);

					

					$a_value_to_save = array();

					

					//modular variables (see array in javascript code for use)

					if(isset($a_value[ARRAY_INDEX_VARS]) && is_array($a_value[ARRAY_INDEX_VARS]))

					{

						foreach($a_value[ARRAY_INDEX_VARS] as $var_name => $a_vars_value)

						{

							$a_values_to_save = array();

							

							// foreach variable, for each different value

							foreach($a_vars_value as $a_values)

							{

								// base1 (logs) to base2 (archives) for variables values

								$idValue = $this->objects['vars_value']->getId($a_values[ARRAY_INDEX_VAR_VALUE]);

								$a_values_to_save[$idValue] = array(

									ARRAY_INDEX_VAR_COUNT => $a_values[ARRAY_INDEX_VAR_COUNT],

									ARRAY_INDEX_VAR_VALUE => $idValue

									);

							}

							// vars_name base 1 (logs) to id vars_name base 2 (archive)

							$a_value_to_save[$this->objects['vars_name']->getId($var_name)] = 

									$a_values_to_save;

						}

					}

					$a_value[ARRAY_INDEX_VARS] = $a_value_to_save;

	

					// add to the array to sum for the 'pmv_sum'

					$to_sum[][$type] = $a_value;

				}

			}

			next($array);

		}



		// init returned array

		$res['page'] = $res['file'] = array(

				ARRAY_INDEX_COUNT => 0,

				ARRAY_INDEX_TIME_TOTAL => 0,

				ARRAY_INDEX_ENTRYPAGE => 0,

				ARRAY_INDEX_EXITPAGE => 0,

				ARRAY_INDEX_PAGES_VISIT_ONEPAGE => 0,

				ARRAY_INDEX_VARS => array()

				);

		

		//printDebug("dernier noeud, on somme<br>");

		

		// sums all values in $to_sum

		foreach($to_sum as $a_info)

		{

			foreach($a_info as $typePage => $a_page_info)

			{

				$res[$typePage] = $this->sumArray($res[$typePage], $a_page_info);

			}

		}

 

		// pages sum

		$array['p_pmv_sum'] = $res['page'];

		

		// files sum

		$array['f_pmv_sum'] = $res['file'];

 

		$toReturn = array(

					'page' => $res['page'],

					'file' => $res['file'], 

					);

				

		//var_dump($toReturn);	

		return $toReturn;

	}

	

	/**

	 * Computes the arrays sum, considering the very special of arrays to sum

	 * 

	 *  @param array $return array1 containing the previous sum

	 *  @param array $a array2 to sum to array1

	 *  

	 *  @return array two arrays sumed

	 */

	function sumArray($return, $a)

	{

		$a_vars_res = array();

		

		// sum variables values, in the case when it's not a file (no variables for a file)

		if(isset($a[ARRAY_INDEX_VARS]) && is_array($a[ARRAY_INDEX_VARS]))

		{

			// compute vars_sum

			foreach($a[ARRAY_INDEX_VARS] as $var_name => $a_vars_value)

			{

				//printDebug("VAR2HERE : ");

				//printDebug($a_vars_value);

				//printDebug(" + ");

				//printDebug($return[ARRAY_INDEX_VARS]);

				//printDebug("<br>");

				

				foreach($a_vars_value as $key => $a_vars_values)

				{

					//print($a[ARRAY_INDEX_IDCATEGORY]. ", ".$key. ":: ");

					@$return[ARRAY_INDEX_VARS][$var_name][$key][ARRAY_INDEX_VAR_VALUE] = 

								$a_vars_values[ARRAY_INDEX_VAR_VALUE];



					@$return[ARRAY_INDEX_VARS][$var_name][$key][ARRAY_INDEX_VAR_COUNT] = 

								$a_vars_values[ARRAY_INDEX_VAR_COUNT] 

								+ $return[ARRAY_INDEX_VARS][$var_name][$key][ARRAY_INDEX_VAR_COUNT];

				}

			}

			//printDebug("AFTERSUM");

			//printDebug($return);

		}



		return array( 

				ARRAY_INDEX_COUNT => (int)($return[ARRAY_INDEX_COUNT] +  $a[ARRAY_INDEX_COUNT]),

				

				ARRAY_INDEX_IDCATEGORY => @$a[ARRAY_INDEX_IDCATEGORY],

				

				// ARRAY_INDEX_LEVEL => $a[ARRAY_INDEX_LEVEL],

				// ARRAY_INDEX_IDPARENT => $a[ARRAY_INDEX_IDPARENT],

				

				ARRAY_INDEX_TIME_TOTAL => 

							@$return[ARRAY_INDEX_TIME_TOTAL] + @$a[ARRAY_INDEX_TIME_TOTAL],

				

				ARRAY_INDEX_PAGES_VISIT_ONEPAGE => 

							$return[ARRAY_INDEX_PAGES_VISIT_ONEPAGE] + @$a[ARRAY_INDEX_PAGES_VISIT_ONEPAGE],

				

				ARRAY_INDEX_ENTRYPAGE => 

							$return[ARRAY_INDEX_ENTRYPAGE] + @$a[ARRAY_INDEX_ENTRYPAGE],

				

				ARRAY_INDEX_EXITPAGE => 

							$return[ARRAY_INDEX_EXITPAGE] +  @$a[ARRAY_INDEX_EXITPAGE],

				

				ARRAY_INDEX_VARS => $return[ARRAY_INDEX_VARS]

			);					

	}

	



	/**

	 * computes sum of the array a_values and the new values to add

	 * 

	 * @param array $a_values Contains current values

	 * @param int $s Hits

	 * @param int $sumpage Number of pages views

	 * @param int $onepage Number of one page visit

	 * @param int $sumtime Total time spent on all the $s visits

	 * 

	 * @return array $a_values array $a_values with new values sumed

	 */

	function getInterestValuesSum($a_values, $s, $sumpage, $onepage, $sumtime)

	{

		// init

		if(!isset($a_values[0])) $a_values[0] = 0;

		if(!isset($a_values[1])) $a_values[1] = 0;

		if(!isset($a_values[2])) $a_values[2] = 0;

		if(!isset($a_values[3])) $a_values[3] = 0;

		

		$a_values[0] += $s;

		$a_values[1] += $sumpage;

		$a_values[2] += $onepage;

		$a_values[3] += $sumtime;

		

		return $a_values;

	}

	

	/**

	 * Computes all info relative to referer

	 * Detects for each different referer URL (or each entry page, when no referer URLs), the name (and keyword),

	 * the domain, the precise page, the partner, the newsletter

	 * 

	 * Saves in var toRecord all precomputed values. Isn't that great ?

	 */

	function computeReferer()

	{

		// Init

		$hits = 0;

		

		$vis_listing = array(

			'vis_search_engine',

			'vis_keyword',

			'vis_newsletter',

			'vis_partner',

			'vis_site'

			);

		foreach($vis_listing as $value) $this->toRecord[$value] = array();

		

		$resDirect =0;

		

		$int_sum = array();

		$int_sum['search_engine'] = array();

		$int_sum['keyword'] = array();

		$int_sum['site'] = array();

		$int_sum['partner_name'] = array();

		$int_sum['newsletter'] = array();

		$int_sum['type'][REF_TYPE_DIRECT_ENTRY] = array();

		$int_sum['type'][REF_TYPE_NEWSLETTER] = array();

		$int_sum['type'][REF_TYPE_PARTNER] = array();

		$int_sum['type'][REF_TYPE_SEARCH_ENGINE] = array();

		$int_sum['type'][REF_TYPE_SITE] = array();

		

		

		// query that selects all distinct referer URLs

		$r = query("SELECT count(*) as s, referer as r" .$GLOBALS['test'].

				" FROM ".T_VISIT. 

				" WHERE server_date= '".$this->date->get()."' " .

				" AND idsite = ".$this->site->getId()." " .

				" AND referer IS NOT NULL" .

				" GROUP BY r

					");

					

		while($l = mysql_fetch_assoc($r))

		{

			// different types :

			// - partner identified as it is

			// - search engines that give keywords

			// - direct access, url belongs to the site

			// - other misc websites 

			

			$hits = $l['s'];

			

			$refererUrl = $l['r'];

			

			// now... lets go in identifying !

			// and don't go back it's so important !

			$refererUrlParse = parse_url($refererUrl);

			

			// if referer exists (and not 'blockedReferer' or other)

			if(isset($refererUrlParse['host']))

			{

				$refererHost = $refererUrlParse['host'];

				$refererSH = $refererUrlParse['scheme'].'://'.$refererUrlParse['host'];

				//printDebug("<b>".$refererHost." </b> ");

				

				/*

				 * search engine

				 */

				if(array_key_exists($refererHost, $GLOBALS['searchEngines']))

				{

					

					// which search engine ?

					$sname = $GLOBALS['searchEngines'][$refererHost][0];

					$vname = $GLOBALS['searchEngines'][$refererHost][1];

					

					// id base logs to id base archives

					$ids = $this->objects['search_engine']->getId($sname);

					

					// init

					if(!isset($this->toRecord['vis_search_engine'][$ids]))

					{

						$this->toRecord['vis_search_engine'][$ids]['pmv_sum'] = 0; 

						$int_sum['search_engine'][$ids] = array();

					}

					

					$this->toRecord['vis_search_engine'][$ids]['pmv_sum'] += $hits;

					

					// interest for current engine

					$int_sum['search_engine'][$ids] = $this->getInterestValuesSum($int_sum['search_engine'][$ids], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

															

					// interest for the type search_engine

					$int_sum['type'][REF_TYPE_SEARCH_ENGINE] = 

								$this->getInterestValuesSum($int_sum['type'][REF_TYPE_SEARCH_ENGINE], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

															

					// if there is a query, there may be a keyword...

					if(isset($refererUrlParse['query']))

					{

						/*

						 *  keyword ?

						 */

						

						$query = $refererUrlParse['query'];

						

						// for google image take the prev variable 

						// and take the q var in this variable once urldecoded

						

						// but sometimes we have images.google.fr/search which is exactly like www.google.fr/search....

						if(ereg("^images.google.",$refererHost))

						{

							//print("befo = ".$query);

							$query = getUrlParamValue($query, "prev");

							

							// case images.google.com/search we replace in the host images by www

							if($query === false )

							{

								$refererHost = str_replace( "images","www",$refererHost);

								$vname = $GLOBALS['searchEngines'][$refererHost][1];

							}

							else

							{

								$query = urldecode($query);

								// we want the query from "/images?q=+logo+designs&start=360&ndsp=20&svnum=10&hl=en&lr=&sa=N"

								$query = substr($query, strpos( $query, "?") + 1);

								// getUrlParam need htmlentitied

								$query = htmlentities($query);

								//print("<br> after = ".$query);

							}

						}

						

						// search for keywords now &vname=keyword

						$key = strtolower(getUrlParamValue($query, $vname));

						

						// for search engines that don't use utf-8

						if((function_exists('iconv')) && (isset($GLOBALS['searchEngines'][$refererHost][2])))

						{

							$charset = trim($GLOBALS['searchEngines'][$refererHost][2]);

							if(!empty($charset)) {

								$key = urlencode(@iconv($charset, 'utf-8//TRANSLIT', urldecode($key)));

							}

						}

						

						//print($refererUrlParse['query'].",". $vname." : ".$key."<br>");

						

						// base logs => base archives

						$idk = $this->objects['keyword']->getId($key);

						

						/*

						 * init

						 */

						if(!isset($this->toRecord['vis_search_engine'][$ids][$idk]))

						{

							$this->toRecord['vis_search_engine'][$ids][$idk] = 0;

						}

						if(!isset($this->toRecord['vis_keyword'][$idk][$ids]))

						{

							$this->toRecord['vis_keyword'][$idk][$ids] = 0;

							$int_sum['keyword'][$idk] = array();

						}

						if(!isset($this->toRecord['vis_keyword'][$idk]['pmv_sum']))

						{

							$this->toRecord['vis_keyword'][$idk]['pmv_sum'] = 0;

						}

						

						

						$this->toRecord['vis_search_engine'][$ids][$idk] += $hits;

						

						$this->toRecord['vis_keyword'][$idk][$ids] += $hits;

						$this->toRecord['vis_keyword'][$idk]['pmv_sum'] += $hits;

						

						$int_sum['keyword'][$idk] = $this->getInterestValuesSum($int_sum['keyword'][$idk], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

					}

				}

				/*

				 * direct entry

				 */

				else if($this->site->isUrlIn($refererUrl))

				{

					//printDebug("<br>directentry<br>");

					$resDirect += $hits;

					// interest for the type 'direct_entry'

					$int_sum['type'][REF_TYPE_DIRECT_ENTRY] =  

									$this->getInterestValuesSum($int_sum['type'][REF_TYPE_DIRECT_ENTRY], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

				}

				/*

				 * site partner

				 */

				else if($this->site->isPartner($refererUrl))

				{

					//printDebug("<br>partner<br>");

					

					// comments are not necessary here, code is so clear :-D

					$url = array_search( $refererHost,  $this->site->getPartnerUrlsFlat());

					$pname = $this->site->getPartnerName();

					

					$idp = $this->objects['partner_name']->getId($pname);

					$idpu = $this->objects['partner_url']->getId($refererUrl);

					

					// init

					if(!isset($this->toRecord['vis_partner'][$idp]['pmv_sum']))

					{

						$this->toRecord['vis_partner'][$idp]['pmv_sum'] = 0;

						$int_sum['partner_name'][$idp] = array();

					}

					

					$this->toRecord['vis_partner'][$idp][$idpu] = $hits;

					$this->toRecord['vis_partner'][$idp]['pmv_sum']  += $hits;

					

					//printDebug($this->toRecord['vis_partner']);

					

					$int_sum['partner_name'][$idp] = $this->getInterestValuesSum($int_sum['partner_name'][$idp], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

					$int_sum['type'][REF_TYPE_PARTNER] =

								$this->getInterestValuesSum($int_sum['type'][REF_TYPE_PARTNER], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

				}

				/*

				 * other site

				 */

				else

				{

					//printDebug(" misc site | ");

					

					$idmsh = $this->objects['site']->getId($refererHost);

					$idms = $this->objects['site']->getId($refererUrl);

					

					// init

					if(!isset($this->toRecord['vis_site'][$idmsh]['pmv_sum']))

					{

						$this->toRecord['vis_site'][$idmsh]['pmv_sum'] = 0;

						$int_sum['site'][$idmsh] = array();

					}

					

					$this->toRecord['vis_site'][$idmsh]['pmv_sum'] += $hits;

					$this->toRecord['vis_site'][$idmsh][$idms] = $hits;

					

					$int_sum['site'][$idmsh] = $this->getInterestValuesSum($int_sum['site'][$idmsh], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

					$int_sum['type'][REF_TYPE_SITE] =

								$this->getInterestValuesSum($int_sum['type'][REF_TYPE_SITE], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

				}

			}

			else

			{

				// direct entry

				$resDirect += $hits;

				

				//printDebug("<br>directentry<br>");

				

				$int_sum['type'][REF_TYPE_DIRECT_ENTRY] =  

							$this->getInterestValuesSum($int_sum['type'][REF_TYPE_DIRECT_ENTRY], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

			}

		}		

		

		// query that selects entry pages, when there are no referer URls

		// it allows detection of partners, newsletters and direct entries

		$r = query("SELECT count(distinct idvisit) as sp, pu.idpage_url as p, 

							pu.url as u" .$GLOBALS['test'].

				" FROM ".T_VISIT. " as v, ".T_PAGE_URL." as pu 

				  WHERE v.entry_idpageurl = pu.idpage_url 

				  AND v.server_date= '".$this->date->get()."' 

				 AND v.idsite = ".$this->site->getId()." 

				 AND v.referer IS NULL

				 GROUP by entry_idpageurl

					");



		while($l = mysql_fetch_assoc($r))

		{

			// different types :

			// - partner identified by ID in URL

			// - newsletter identified by ID in URL 

			// - direct entries

			$hits = $l['sp'];

			$idPageEntry = $l['p']; // useless

			

			// url parsing can fail when for example its value is "/translate... etc."

			// we count it as a direct entry

			$urlParse = @parse_url($l['u']);

			

			// if referer exists (and not blockedReferer or other)

			if(isset($urlParse['query']))

			{

				//printDebug($l['p']." ");

				$urlQuery = $urlParse['query'];	

				

//				print($urlQuery); exit;

				/*

				 * partner

				 */

				if($pid = getUrlParamValue($urlQuery, PARAM_URL_PARTNER))

				{

					

					//printDebug("<br><b>PID $pid detected !</b>");

					//printDebug("<br>partner</br>");

					

					$pname = $this->site->getPartnerNameFromId($pid);

					

					$idp = $this->objects['partner_name']->getId($pname);

										

					// init

					if(!isset($this->toRecord['vis_partner'][$idp]['pmv_sum']))

					{

						$this->toRecord['vis_partner'][$idp]['pmv_sum'] = 0;

						$int_sum['partner_name'][$idp] = array();

					}

					

					$this->toRecord['vis_partner'][$idp]['pmv_sum']  += $hits;

					

					//printDebug($this->toRecord['vis_partner']);

					

					$int_sum['partner_name'][$idp] = $this->getInterestValuesSum($int_sum['partner_name'][$idp], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

					$int_sum['type'][REF_TYPE_PARTNER] = 

								$this->getInterestValuesSum($int_sum['type'][REF_TYPE_PARTNER], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

				}

				

				/*

				 * newsletter

				 */

				else if($nid = getUrlParamValue($urlQuery, PARAM_URL_NEWSLETTER))

				{

					//print("NID to searc = $nid");

					if ((defined("NEWSLETTER_ID_MAX_AUTO")) && (defined("NEWSLETTER_FORCE_CREATE"))

					&& ((NEWSLETTER_ID_MAX_AUTO == -1) || ($nid <= NEWSLETTER_ID_MAX_AUTO))) {

						$nname = $this->site->getNewsletterName($nid, NEWSLETTER_FORCE_CREATE);

					}

					else {

						$nname = $this->site->getNewsletterName($nid);

					}

					

					// if newsletter exists

					if(!$nname)

					{

						print("Newsletter name not found! Maybe it's an empty name in phpmv_newsletter ? (for ".PARAM_URL_NEWSLETTER." = $nid)");

						//exit;

					}

					else 

					{

			//			print("<br><b>NID $nid detected !</b>");

			//			print("<br>newsletter</br>");

					

						$idn = $this->objects['newsletter']->getId($nname);

						

						// init

						if(!isset($this->toRecord['vis_newsletter'][$idn]))

						{

							$this->toRecord['vis_newsletter'][$idn] = 0;

							$int_sum['newsletter'][$idn] = array();

						}

						

						$this->toRecord['vis_newsletter'][$idn] += $hits;

						

						//printDebug($this->toRecord['vis_newsletter']);

						

						$int_sum['newsletter'][$idn] = $this->getInterestValuesSum($int_sum['newsletter'][$idn], 

																$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

						$int_sum['type'][REF_TYPE_NEWSLETTER] =  

									$this->getInterestValuesSum($int_sum['type'][REF_TYPE_NEWSLETTER], 

																$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

					}

				}

				/*

				 * direct access

				 */

				else

				{

					$resDirect += $hits;



					$int_sum['type'][REF_TYPE_DIRECT_ENTRY] =  

								$this->getInterestValuesSum($int_sum['type'][REF_TYPE_DIRECT_ENTRY], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

				}

			}

			else

			{

				$resDirect += $hits;



				$int_sum['type'][REF_TYPE_DIRECT_ENTRY] =  

								$this->getInterestValuesSum($int_sum['type'][REF_TYPE_DIRECT_ENTRY], 

															$l['s'], $l['sumpage'], $l['onepage'], $l['sumtime']);

			}

			

		}

		



		/*

		 * developed interest average

		 */

		 

		// database-interest-field-name => interestsum-array-keyname

		

		$int_sum_to_avg = array(

		'int_search_engine' => 'search_engine',

		'int_keyword' => 'keyword',

		'int_site' => 'site',

		'int_partner' => 'partner_name',

		'int_newsletter' => 'newsletter',

		'int_referer_type' => 'type'

		);

		

		foreach($int_sum_to_avg as $int_name => $value)

		{

			uasort($int_sum[$value], "sortingInterest");

			$this->toRecord[$int_name] = $int_sum[$value];

		}



		/*

		 * sum by referer type

		 */

		

		$nbSearchEngine = 0;

		foreach($this->toRecord['vis_search_engine'] as $key => $value)

		{

			$nbSearchEngine += $value['pmv_sum'];

		}



		$nbSite = 0;

		foreach($this->toRecord['vis_site'] as $key => $value)

		{

			$nbSite += $value['pmv_sum'];

		}

		$nbUniqSite = sizeof($this->toRecord['vis_site']);

		$nbNewsletter = array_sum($this->toRecord['vis_newsletter']);

		

		$nbPartner = 0;

		foreach($this->toRecord['vis_partner'] as $key => $value)

		{

			$nbPartner += $value['pmv_sum'];

		}

		

		$this->toRecord['nb_direct'] = $resDirect;

		$this->toRecord['nb_search_engine'] = $nbSearchEngine;

		$this->toRecord['nb_site'] = $nbSite;

		$this->toRecord['nb_newsletter'] = $nbNewsletter;

		$this->toRecord['nb_partner'] = $nbPartner;

			

		/*printDebug("<br><br><b>Access types </b><br> Direct : $nbDirect <br>Search engines : $nbSearchEngine " .

				"<br> By site : $nbSite <br> Unique sites : $nbUniqSite <br>" .

				"Partner : $nbPartner <br> Newsletter : $nbNewsletter <br>");

		*/





		foreach($vis_listing as $value)

		{

			if($value != 'vis_newsletter')

			{

				

				if(is_array($this->toRecord[$value]))

				{

					foreach($this->toRecord[$value] as $key2 => $value2)

					{

						if(is_array($this->toRecord[$value][$key2]))

						{

							arsort($this->toRecord[$value][$key2]);

						}

						$this->toRecord[$value][$key2] = getArrayOffsetLimit(

													$this->toRecord[$value][$key2], 

													0, 

													MAX_DISTINCT_DETAILS_ELEMENTS

												);

					}

				}

				else

				{

					arsort($this->toRecord[$value]);

				}

			}

		}

	}



	/**

	 * returns "select *" of the day var date, after being computed if necessary

	 */

	function getArchived()

	{

		//printDebug("<h1>".$this->date->get()."</h1>");

		

		if(empty($this->archiveOk))

		{

			if(empty($this->idArchives) && !$this->isArchived())

			{



				$this->compute();

			}

		}

		

		$this->archiveOk = true;

		//print("here once ".$this->date->get());

		

		$r = query("SELECT * " .

				" FROM ".T_ARCHIVES.

				" WHERE idarchives = ". $this->idArchives .

				" LIMIT 1"

				);

		

		if(mysql_num_rows($r) == 0)

		{

			trigger_error("Error during the archiving process for the date ".$this->date->get().

							" (period = ".$this->periodType .") for the site ". $this->site->getName() ." (id = ".$this->site->getId() .")",

							E_USER_ERROR);

		

		}

		$allValues = mysql_fetch_assoc($r);

		

		$end = sizeof($allValues);

		reset($allValues);

		for($i = 0; $i < $end ; $i ++)

		{

			$data =& $allValues[key($allValues)];

			

			if(is_null($data))

			{

				$data = compress(serialize( array() ), $allValues['compressed']);

			}

			

			next($allValues);

		}

		

		return $allValues;

	}

}

?>