<?php
	/**************************************************************************\
	* phpGroupWare API - Preferences                                           *
	* This file written by Joseph Engo <jengo@phpgroupware.org>                *
	* and Mark Peters <skeeter@phpgroupware.org>                               *
	* Manages user preferences                                                 *
	* Copyright (C) 2000, 2001 Joseph Engo                                     *
	* -------------------------------------------------------------------------*
	* This library is part of the phpGroupWare API                             *
	* http://www.phpgroupware.org/api                                          * 
	* ------------------------------------------------------------------------ *
	* This library is free software; you can redistribute it and/or modify it  *
	* under the terms of the GNU Lesser General Public License as published by *
	* the Free Software Foundation; either version 2.1 of the License,         *
	* or any later version.                                                    *
	* This library is distributed in the hope that it will be useful, but      *
	* WITHOUT ANY WARRANTY; without even the implied warranty of               *
	* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                     *
	* See the GNU Lesser General Public License for more details.              *
	* You should have received a copy of the GNU Lesser General Public License *
	* along with this library; if not, write to the Free Software Foundation,  *
	* Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA            *
	\**************************************************************************/

	/* $Id$ */
	/*!
	@class preferences 
	@abstract preferences class used for setting application preferences
	@discussion Author: none yet
	*/
	class preferences
	{	/*! @var account_id */
		var $account_id;
		/*! @var account_type */
		var $account_type;
		/*! @var data */
		var $data = Array();
		/*! @var db */
		var $db;

		/**************************************************************************\
		* Standard constructor for setting $this->account_id                       *
		\**************************************************************************/
		/*! 
		@function preferences
		@abstract Standard constructor for setting $this->account_id
		@discussion Author:
		*/
		function preferences($account_id = '')
		{
			global $phpgw, $phpgw_info;
			$this->db = $phpgw->db;
			$this->account_id = get_account_id($account_id);
		}

		/**************************************************************************\
		* These are the standard $this->account_id specific functions              *
		\**************************************************************************/
		
		/*! 
		@function read_repository
		@abstract private - read preferences from the repository
		@discussion private function should only be called from within this class
		*/
		
		function read_repository()
		{
			$this->db->lock("phpgw_preferences");
			$this->db->query("SELECT preference_value FROM phpgw_preferences WHERE preference_owner='".$this->account_id."'",__LINE__,__FILE__);
			$this->db->next_record();
			$pref_info = $this->db->f("preference_value");
			$this->data = Array();
			$this->data = unserialize($pref_info);
			$this->db->unlock();
			// This is to supress warnings durring login
			if (gettype($this->data) == "array") {
				 reset ($this->data);
			}
			return $this->data;
		}
		
		/*!
		@function read
		@abstract public - read preferences from repository and stores in an array
		@discussion Syntax array read(); <>
		Example1: preferences->read();
		@result $data array containing user preferences
		*/
		
		function read()
		{
			if (count($this->data) == 0){ $this->read_repository(); }
			reset ($this->data);
			return $this->data;
		}
		
		/*!
		@function add
		@abstract add preference to $app_name a particular app
		@discussion
		@param $app_name name of the app
		@param $var name of preference to be stored
		@param $value value of the preference
		*/
		
		function add($app_name,$var,$value = "")
		{
			if (! $value) {
				global $$var;
				$value = $$var;
			}
 
			$this->data[$app_name][$var] = $value;
			reset($this->data);
			return $this->data;
		}
		
		/*! 
		@function delete
		@abstract delete preference from $app_name
		@discussion
		@param $app_name name of app
		@param $var variable to be deleted
		*/
		
		function delete($app_name, $var = "")
		{
			if ($var == "") {
				$this->data[$app_name] = array();
			} else {
				unset($this->data[$app_name][$var]);
			}
			reset ($this->data);
			return $this->data;
		}
		
		/*!
		@function save_repository
		@abstract save the the preferences to the repository
		@discussion
		*/
		
		function save_repository($update_session_info = False)
		{
			global $phpgw, $phpgw_info;

			if (! $phpgw->acl->check('session_only_preferences',1,'preferences'))
			{
				$this->db->transaction_begin();
				$this->db->query("delete from phpgw_preferences where preference_owner='" . $this->account_id
						. "'",__LINE__,__FILE__);
	 
				if (phpversion() < "4.0.0")
				{
					$pref_info = addslashes(serialize($this->data));
				}
				else
				{
					$pref_info = serialize($this->data);
				}

				$this->db->query("insert into phpgw_preferences (preference_owner,preference_value) values ('"
						. $this->account_id . "','" . $pref_info . "')",__LINE__,__FILE__);

				$this->db->transaction_commit();
			}
			else
			{
				$phpgw_info['user']['preferences'] = $this->data;
				$phpgw->session->save_repositories();
			}

/*			if ($phpgw_info['server']['cache_phpgw_info'])
			{
				$phpgw->session->session_flags = 'U';
				$phpgw->session->update_session_flags();
			} */

			return $this->data;
		}
		
		/*!
		@function update_data
		@abstract update the preferences array
		@discussion 
		@param $data array of preferences
		*/
		
		function update_data($data) {
			reset($data);
			$this->data = Array();
			$this->data = $data;
			reset($this->data);
			return $this->data;
		}

		/* legacy support */
		function change($app_name,$var,$value = "")
		{
			return $this->add($app_name,$var,$value);
		}
		function commit($update_session_info = False)
		{
			return $this->save_repository($update_session_info);
		}

		/**************************************************************************\
		* These are the non-standard $this->account_id specific functions          *
		\**************************************************************************/
		
		/*!
		@function verify_basic_settings
		@abstract verify basic settings
		@discussion
		*/
		
		function verify_basic_settings()
		{
			global $phpgw, $phpgw_info;
			if (gettype($phpgw_info["user"]["preferences"]) != "array") {
				 $phpgw_info["user"]["preferences"] = array();
			}
			/* This takes care of new users who dont have proper default prefs setup */
			if (!isset($phpgw_info['flags']['nocommon_preferences']) || 
			    !$phpgw_info["flags"]["nocommon_preferences"]) {
				$preferences_update = False;
				if (!isset($phpgw_info['user']['preferences']['common']['maxmatchs']) || 
				    !$phpgw_info["user"]["preferences"]["common"]["maxmatchs"]) {
					$this->add("common","maxmatchs",15);
					$preferences_update = True;
				}
				if (!isset($phpgw_info['user']['preferences']['common']['theme']) || 
				    !$phpgw_info["user"]["preferences"]["common"]["theme"]) {
					$this->add("common","theme","default");
					$preferences_update = True;
				}
				if (!isset($phpgw_info['user']['preferences']['common']['template_set']) || 
				    !$phpgw_info["user"]["preferences"]["common"]["template_set"]) {
					$this->add("common","template_set","default");
					$preferences_update = True;
				}
				if (!isset($phpgw_info['user']['preferences']['common']['dateformat']) || 
				    !$phpgw_info["user"]["preferences"]["common"]["dateformat"]) {
					$this->add("common","dateformat","m/d/Y");
					$preferences_update = True;
				}
				if (!isset($phpgw_info['user']['preferences']['common']['timeformat']) || 
				    !$phpgw_info["user"]["preferences"]["common"]["timeformat"]) {
					$this->add("common","timeformat",12);
					$preferences_update = True;
				}
				if (!isset($phpgw_info['user']['preferences']['common']['lang']) || 
				    !$phpgw_info["user"]["preferences"]["common"]["lang"]) {
					$this->add("common","lang",$phpgw->common->getPreferredLanguage());
					$preferences_update = True;
				}
				if ($preferences_update)
				{
					$this->save_repository();
				}
				unset($preferences_update);
			}
		}
	} //end of preferences class
?>