phpgroupware-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Phpgroupware-cvs] phpgwapi/inc/class.contacts_sql.inc.php, 1.25


From: nomail
Subject: [Phpgroupware-cvs] phpgwapi/inc/class.contacts_sql.inc.php, 1.25
Date: Thu, 30 Dec 2004 07:47:30 +0100

Update of /phpgwapi/inc
Added Files:
        Branch: 
          class.contacts_sql.inc.php

date: 2004/12/30 06:47:30;  author: skwashd;  state: Exp;  lines: +4278 -521

Log Message:
new HEAD
=====================================================================
<?php
        /**
        * View and manipulate contact records using SQL
        * @author Jonathan Alberto Rivera Gomez <address@hidden>
        * @copyright Copyright (C) 2003,2004 Free Software Foundation, Inc. 
http://www.fsf.org/
        * @license http://www.gnu.org/licenses/gpl.html GNU General Public 
License
        * @package phpgwapi
        * @subpackage contacts
        * @version $Id: class.contacts_sql.inc.php,v 1.25 2004/12/30 06:47:30 
skwashd Exp $
        * @internal Development of this application was funded by 
http://www.sogrp.com
        */

        /**
        * Include SQL Builder
        */
        include_once(PHPGW_API_INC . '/class.sql_builder.inc.php');
        /**
        * Include SQL criteria
        */
        include_once(PHPGW_API_INC . '/class.sql_criteria.inc.php');
        /**
        * Include SQL entity
        */
        include_once(PHPGW_API_INC . '/class.sql_entity.inc.php');

        define(PHPGW_CONTACTS_CATEGORIES_ALL, -3);
        define(PHPGW_CONTACTS_ALL, 1);
        define(PHPGW_CONTACTS_MINE, 2);
        define(PHPGW_CONTACTS_PRIVATE, 3);

        /**
        * Contact Management System
        *
        * This class provides a contact database scheme.
        * It attempts to be based on the vcard 2.1 standard,
        * with mods as needed to make for more reasonable sql storage.
        * Note that changes here must also work in the LDAP version.
        * @package phpgwapi
        * @subpackage contacts
        * @internal example: $contacts = CreateObject('phpgwapi.contacts');
        */
        class contacts_ extends sql_builder
        {
                var $db = '';
                var $account_id = 0;
                var $total_records = 0;
                var $grants;
                /**
                * All exporteds fields
                *
                * We used to have a simple array that told us what the false 
fields were.
                * this used to be its name.
                * Now, what this holds is a reference to the 
$contact_fields['showable'] array that
                * tells us what false fields can we show and their translation 
to english
                * @deprecated New Apps must use new api
                */
                var $stock_contact_fields;

                /**
                * This is an array of three elements that are arrays themselves.
                *
                * The purpose of the whole thing is to give us all the fields 
we can manage.
                * This includes old false fields (deprecated), and all of the 
new data we can manage.
                * Most importantly, this tree categorizes the said elements 
this way:
                * 1. contact_fields['showable'] are fields we can show in the 
index page, selectable
                * from the preferences page...etc.
                * 2. contact_fields['retreivable'] the rest of the fields that 
we generaly dont show in
                * the addressbook ui.
                * 3. contact_fields['catalogs'] fields that belong to catalogs 
and, as such, we never
                * show in raw form as they correspond to the database but we 
need to query for them.
                *
                * All of the array data points to the english translation of 
the field that should then
                * be langed to get a label for the field
                * @access private
                */
                var $contact_fields = array('showable' =>
                                                array(
                                                        'per_full_name'         
=> 'full name',
                                                        'per_first_name'        
=> 'first name',
                                                        'per_last_name'         
=> 'last name',
                                                        'per_middle_name'       
=> 'middle name',
                                                        'per_initials'          
=> 'initials',
                                                        'per_prefix'            
=> 'prefix',
                                                        'per_suffix'            
=> 'suffix',
                                                        'per_birthday'          
=> 'birthday',
                                                        'per_pubkey'            
=> 'public key', 
                                                        'per_title'             
=> 'title', 
                                                        'per_department'        
=> 'department', 
                                                        'per_sound'             
=> 'sound', 
                                                        'per_active'            
=> 'active',                                    
                                        //              'per_name'              
=> 'full name',
                                        //              'sel_cat_id'            
=> 'categories',
                                                        'org_name'              
=> 'company name',
                                                        'org_active'            
=> 'active company',
                                                        'org_parent'            
=> 'parent organization',
                                                        'addr_type'             
=> 'address type',
                                                        'addr_add1'             
=> 'street first',
                                                        'addr_add2'             
=> 'street second',
                                                        'addr_city'             
=> 'city',
                                                        'addr_state'            
=> 'state',
                                                        'addr_postal_code'      
=> 'postal code',
                                                        'addr_country'          
=> 'country'
                                                        ),
                                        //              'addr_address'          
=> 'street address',
                                        'retrievable' =>
                                        array(
                                        //deprecated start
                                                        'adr_one_street'      
=> 'business street',
                                                        'adr_one_locality'    
=> 'business city',
                                                        'adr_one_region'      
=> 'business state',
                                                        'adr_one_postalcode'  
=> 'business zip code',
                                                        'adr_one_countryname' 
=> 'business country',
                                                        'adr_one_type'        
=> 'business address type',
                                                        'adr_two_street'      
=> 'home street',
                                                        'adr_two_locality'    
=> 'home city',
                                                        'adr_two_region'      
=> 'home state',
                                                        'adr_two_postalcode'  
=> 'home zip code',
                                                        'adr_two_countryname' 
=> 'home country',
                                                        'adr_two_type'        
=> 'home address type',
                                                        'tz'                  
=> 'time zone',
                                                        'geo'                 
=> 'geo',
                                                        'fn'                  
=> 'full name',
                                                        'sound'               
=> 'Sound',
                                                        'org_name'            
=> 'company name',
                                                        'org_unit'            
=> 'department',
                                                        'title'               
=> 'title',
                                                        'n_prefix'            
=> 'prefix',
                                                        'n_given'             
=> 'first name',
                                                        'n_middle'            
=> 'middle name',
                                                        'n_family'            
=> 'last name',
                                                        'n_suffix'            
=> 'suffix',
                                                        'label'               
=> 'label',
                                                        'note'                
=> 'notes',
                                                        'email'               
=> 'business email',
                                                        'email_type'          
=> 'business email type',
                                                        'email_home'          
=> 'home email',
                                                        'email_home_type'     
=> 'home email type',
                                                        'address2'            
=> 'address line 2',
                                                        'address3'            
=> 'address line 3',
                                                        'tel_home'            
=> 'home phone',
                                                        'tel_voice'           
=> 'voice phone',
                                                        'tel_msg'             
=> 'message phone',
                                                        'tel_fax'             
=> 'fax',
                                                        'tel_pager'           
=> 'pager',
                                                        'tel_cell'            
=> 'mobile phone',
                                                        'tel_bbs'             
=> 'bbs phone',
                                                        'tel_modem'           
=> 'modem phone',
                                                        'tel_isdn'            
=> 'isdn phone',
                                                        'tel_car'             
=> 'car phone',
                                                        'tel_video'           
=> 'video phone',
                                                        'tel_prefer'          
=> 'preferred phone',
                                                        'ophone'              
=> 'Other Phone',
                                                        'bday'                
=> 'birthday',
                                                        'url'                 
=> 'url',
                                                        'pubkey'              
=> 'public key',
                                                        'tel_work'            
=> 'business phone',

                                                        //deprecated end

                                                        'addr_preferred'        
=> 'preffered address',
                                                        'owner'                 
=> 'owner',
                                                        'access'                
=> 'access',
                                                        'addr_pref_val'         
=> 'preferred address value',
                                                        'other_name'            
=> 'custom name',
                                                        'other_value'           
=> 'custom value',
                                                        'other_owner'           
=> 'custom owner',
                                                        'other_count_row'       
=> 'custom number',
                                                        'org_creaton'           
=> 'created on',
                                                        'org_creatby'           
=> 'created by',
                                                        'org_modon'             
=> 'modified on',
                                                        'org_modby'             
=> 'modified by',
                                                        'count_orgs'            
=> 'number of organizations',
                                                        //'account_id'          
=> 'account id',
                                                        'count_persons'         
=> 'number of persons',



                                                        'contact_id'            
=> 'contact id',
                                                        'cat_id'                
=> 'category id',
                                                        'count_contacts'        
=> 'number of contacts',
                                                        'org_id'                
=> 'organization id',
                                                        'person_id'             
=> 'person id',
                                                        'my_org_id'             
=> 'private organization id',
                                                        'my_person_id'          
=> 'private person id',
                                                        'my_addr_id'            
=> 'private address id',
                                                        'my_preferred'          
=> 'private preferred address',
                                                        'my_creaton'            
=> 'private created on',
                                                        'my_creatby'            
=> 'private created by',
                                                        'key_addr_id'           
=> 'address id',
                                                        'addr_creaton'          
=> 'created on',
                                                        'addr_creatby'          
=> 'created by',
                                                        'addr_modon'            
=> 'modified on',
                                                        'addr_modby'            
=> 'modified by',
                                                        'addr_contact_id'       
=> 'address contact id',
                                                        'key_other_id'          
=> 'custom id',
                                                        'other_contact_id'      
=> 'custom contact id',
                                                        'addr_type_id'          
=> 'address type id',
//                                                      'account_id'            
=> 'account id',
//                                                      'account_person_id'     
=> 'account person id',
                                                        'person_only'           
=> 'only persons',
                                                        'per_active'            
=> 'active person',
                                                        'per_creaton'           
=> 'created on',
                                                        'per_creatby'           
=> 'created by',
                                                        'per_modon'             
=> 'modified on',
                                                        'per_modby'             
=> 'modified by',

                                                        'key_cat_id'            
=> 'category id'




                                                ),
                                        'catalogs' =>
                                        array(
                                                        'comm_descr'            
=> 'communication type description',
                                                        'comm_preferred'        
=> 'communication type preferred',
                                                        'comm_data'             
=> 'communication type data',


                                                        'contact_type_descr'    
=> 'contact type description',
                                                        'contact_type_table'    
=> 'contact type table',

                                                        'comm_description'      
=> 'communication media description',
                                                        'comm_type'             
=> 'communication media type',
                                                        'comm_find_descr'       
=> 'find communication media description',

                                                        
'comm_type_description'=> 'communication media type description',
                                                        'comm_active'           
=> 'active communication media type',
                                                        'comm_class'            
=> 'communication media class',

                                                        'addr_description'      
=> 'address type description',
                                                        'comm_creaton'          
=> 'created on',
                                                        'comm_creatby'          
=> 'created by',
                                                        'comm_modon'            
=> 'modified on',
                                                        'comm_modby'            
=> 'modified by',
                                                        'contact_type_id'       
=> 'contact type id',
                                                        'comm_descr_id' => 
'communication media description id',

                                                        'comm_contact_id'       
=> 'communication type contact id',
                                                        'comm_type_id'          
=> 'communication media type id',
                                                        'key_comm_id'           
=> 'communication type id',

                                                        'note_type_id'          
=> 'note type id',
                                                        'note_type'             
=> 'note type',
                                                        'note_text'             
=> 'note text',

                                                        'note_description'      
=> 'note type description',
                                                        'key_note_id'           
=> 'note id',
                                                        'note_contact_id'       
=> 'note contact id',
                                                        'note_creaton'          
=> 'created on',
                                                        'note_creatby'          
=> 'created by',
                                                        'note_modon'            
=> 'modified on',
                                                        'note_modby'            
=> 'modified by',
                                                        'contact_type'          
=> 'contact type'



                                                        )
                                );

                /**
                * Maps database columns to contact classes
                * @access private
                */
                var $map = array('contact_id'           => 
array('phpgwapi.contact_central', '0'),
                                 'owner'                => 
array('phpgwapi.contact_central', '0'),
                                 'access'               => 
array('phpgwapi.contact_central', '0'),
                                 'cat_id'               => 
array('phpgwapi.contact_central', '0'),
                                 'contact_type'         => 
array('phpgwapi.contact_central', '0'),
                                 'count_contacts'       => 
array('phpgwapi.contact_central', '0'),
                                 'max_contacts'         => 
array('phpgwapi.contact_central', '0'),
                                 'sel_cat_id'           => 
array('phpgwapi.contact_central', '0'),
                                 'organizations_contact'=> 
array('phpgwapi.contact_central', '0'),
                                 'people_contact'       => 
array('phpgwapi.contact_central', '0'),

                                 'org_id'               => 
array('phpgwapi.contact_org', '1'),
                                 'org_name'             => 
array('phpgwapi.contact_org', '1'),
                                 'org_active'           => 
array('phpgwapi.contact_org', '1'),
                                 'org_parent'           => 
array('phpgwapi.contact_org', '1'),
                                 'org_creaton'          => 
array('phpgwapi.contact_org', '1'),
                                 'org_creatby'          => 
array('phpgwapi.contact_org', '1'),
                                 'org_modon'            => 
array('phpgwapi.contact_org', '1'),
                                 'org_modby'            => 
array('phpgwapi.contact_org', '1'),
                                 'name'                 => 
array('phpgwapi.contact_org', '1'),
                                 'count_orgs'           => 
array('phpgwapi.contact_org', '1'),
                                 'organizations'        => 
array('phpgwapi.contact_org', '1', array('organizations_person', 
'organizations_org_person', 'organizations_contact')),
                                 'orgs_local'           => 
array('phpgwapi.contact_org', '1'),
                                 'people_org'           => 
array('phpgwapi.contact_org', '1', '', 3),

                                 'person_id'            => 
array('phpgwapi.contact_person', '1'),
                                 'per_full_name'        => 
array('phpgwapi.contact_person', '1'),
                                 'per_first_name'       => 
array('phpgwapi.contact_person', '1'),
                                 'per_last_name'        => 
array('phpgwapi.contact_person', '1'),
                                 'per_middle_name'      => 
array('phpgwapi.contact_person', '1'),
                                 'per_prefix'           => 
array('phpgwapi.contact_person', '1'),
                                 'per_suffix'           => 
array('phpgwapi.contact_person', '1'),
                                 'per_birthday'         => 
array('phpgwapi.contact_person', '1'),
                                 'per_pubkey'           => 
array('phpgwapi.contact_person', '1'),
                                 'per_title'            => 
array('phpgwapi.contact_person', '1'),
                                 'per_department'       => 
array('phpgwapi.contact_person', '1'),
                                 'per_initials'         => 
array('phpgwapi.contact_person', '1'),
                                 'per_sound'            => 
array('phpgwapi.contact_person', '1'),
                                 'per_active'           => 
array('phpgwapi.contact_person', '1'),
                                 'per_creaton'          => 
array('phpgwapi.contact_person', '1'),
                                 'per_creatby'          => 
array('phpgwapi.contact_person', '1'),
                                 'per_modon'            => 
array('phpgwapi.contact_person', '1'),
                                 'per_modby'            => 
array('phpgwapi.contact_person', '1'),
                                 'per_name'             => 
array('phpgwapi.contact_person', '1'),
                                 //'account_id'         => 
array('phpgwapi.contact_person', '1'),
                                 'count_persons'        => 
array('phpgwapi.contact_person', '1'),
                                 'people'               => 
array('phpgwapi.contact_person', '1', array('people_org', 'people_org_person', 
'people_contact')),
                                 'people_local'         => 
array('phpgwapi.contact_person', '1'),
                                 'organizations_person' => 
array('phpgwapi.contact_person', '1', '', 3),

                                 //deprecated start
                                 'fn'                   => 
array('phpgwapi.contact_person', '1'),
                                 'n_given'              => 
array('phpgwapi.contact_person', '1'),
                                 'n_family'             => 
array('phpgwapi.contact_person', '1'),
                                 'n_middle'             => 
array('phpgwapi.contact_person', '1'),
                                 'n_prefix'             => 
array('phpgwapi.contact_person', '1'),
                                 'n_suffix'             => 
array('phpgwapi.contact_person', '1'),
                                 'sound'                => 
array('phpgwapi.contact_person', '1'),
                                 'bday'                 => 
array('phpgwapi.contact_person', '1'),
                                 'note'                 => 
array('phpgwapi.contact_person', '1'),
                                 'tz'                   => 
array('phpgwapi.contact_person', '1'),
                                 'geo'                  => 
array('phpgwapi.contact_person', '1'),
                                 'url'                  => 
array('phpgwapi.contact_person', '1'),
                                 'pubkey'               => 
array('phpgwapi.contact_person', '1'),
                                 'org_unit'             => 
array('phpgwapi.contact_person', '1'),
                                 'title'                => 
array('phpgwapi.contact_person', '1'),
                                 //deprecated end

                                 'my_org_id'            => 
array('phpgwapi.contact_org_person', '2'),
                                 'my_person_id'         => 
array('phpgwapi.contact_org_person', '2'),
                                 'my_addr_id'           => 
array('phpgwapi.contact_org_person', '2'),
                                 'my_preferred'         => 
array('phpgwapi.contact_org_person', '2'),
                                 'my_creaton'           => 
array('phpgwapi.contact_org_person', '2'),
                                 'my_creatby'           => 
array('phpgwapi.contact_org_person', '2'),
                                 'people_org_person'    => 
array('phpgwapi.contact_org_person', '2'),
                        'organizations_org_person'      => 
array('phpgwapi.contact_org_person', '2'),

                                 'key_addr_id'          => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_contact_id'      => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_type'            => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_add1'            => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_add2'            => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_add3'            => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_city'            => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_state'           => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_postal_code'     => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_country'         => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_preferred'       => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_creaton'         => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_creatby'         => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_modon'           => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_modby'           => 
array('phpgwapi.contact_addr', '3'),
                                 'addr_address'         => 
array('phpgwapi.contact_addr', '3'),
                                 //deprecated start
                                 'adr_one_street'       => 
array('phpgwapi.contact_addr', '3'),
                                 'adr_one_locality'     => 
array('phpgwapi.contact_addr', '3'),
                                 'adr_one_region'       => 
array('phpgwapi.contact_addr', '3'),
                                 'adr_one_postalcode'   => 
array('phpgwapi.contact_addr', '3'),
                                 'adr_one_countryname'  => 
array('phpgwapi.contact_addr', '3'),
                                 'adr_one_type'         => 
array('phpgwapi.contact_addr', '3'),
                                 'adr_two_street'       => 
array('phpgwapi.contact_addr', '3'),
                                 'adr_two_locality'     => 
array('phpgwapi.contact_addr', '3'),
                                 'adr_two_region'       => 
array('phpgwapi.contact_addr', '3'),
                                 'adr_two_postalcode'   => 
array('phpgwapi.contact_addr', '3'),
                                 'adr_two_countryname'  => 
array('phpgwapi.contact_addr', '3'),
                                 'adr_two_type'         => 
array('phpgwapi.contact_addr', '3'),
                                 //deprecated end
                                 'addr_pref_val'        => 
array('phpgwapi.contact_addr', '3'),

                                 'key_note_id'          => 
array('phpgwapi.contact_note', '4'),
                                 'note_contact_id'      => 
array('phpgwapi.contact_note', '4'),
                                 'note_type'            => 
array('phpgwapi.contact_note', '4'),
                                 'note_text'            => 
array('phpgwapi.contact_note', '4'),
                                 'note_creaton'         => 
array('phpgwapi.contact_note', '4'),
                                 'note_creatby'         => 
array('phpgwapi.contact_note', '4'),
                                 'note_modon'           => 
array('phpgwapi.contact_note', '4'),
                                 'note_modby'           => 
array('phpgwapi.contact_note', '4'),
                                 //deprecated start
                                 'note'                 => 
array('phpgwapi.contact_note', '4'),
                                 //deprecated end

                                 'key_other_id'         => 
array('phpgwapi.contact_others', '5'),
                                 'other_contact_id'     => 
array('phpgwapi.contact_others', '5'),
                                 'other_name'           => 
array('phpgwapi.contact_others', '5'),
                                 'other_value'          => 
array('phpgwapi.contact_others', '5'),
                                 'other_owner'          => 
array('phpgwapi.contact_others', '5'),
                                 'other_count_row'      => 
array('phpgwapi.contact_others', '5'),
                                 //deprecated start
                                 'label'               => 
array('phpgwapi.contact_others', '5'),
                                 'email_type'          => 
array('phpgwapi.contact_others', '5'),
                                 'email_home_type'     => 
array('phpgwapi.contact_others', '5'),
                                 'adr_one_type'        => 
array('phpgwapi.contact_others', '5'),
                                 'adr_two_type'        => 
array('phpgwapi.contact_others', '5'),
                                 //deprecated end

                                 'key_comm_id'          => 
array('phpgwapi.contact_comm', '6'),
                                 'comm_contact_id'      => 
array('phpgwapi.contact_comm', '6'),
                                 'comm_descr'           => 
array('phpgwapi.contact_comm', '6'),
                                 'comm_preferred'       => 
array('phpgwapi.contact_comm', '6'),
                                 'comm_data'            => 
array('phpgwapi.contact_comm', '6'),
                                 'comm_creaton'         => 
array('phpgwapi.contact_comm', '6'),
                                 'comm_creatby'         => 
array('phpgwapi.contact_comm', '6'),
                                 'comm_modon'           => 
array('phpgwapi.contact_comm', '6'),
                                 'comm_modby'           => 
array('phpgwapi.contact_comm', '6'),
                                 //deprecated start
                                 'tel_work'             => 
array('phpgwapi.contact_comm', '6'),
                                 'tel_home'             => 
array('phpgwapi.contact_comm', '6'),
                                 'tel_voice'            => 
array('phpgwapi.contact_comm', '6'),
                                 'tel_fax'              => 
array('phpgwapi.contact_comm', '6'),
                                 'tel_msg'              => 
array('phpgwapi.contact_comm', '6'),
                                 'tel_cell'             => 
array('phpgwapi.contact_comm', '6'),
                                 'tel_pager'            => 
array('phpgwapi.contact_comm', '6'),
                                 'tel_bbs'              => 
array('phpgwapi.contact_comm', '6'),
                                 'tel_modem'            => 
array('phpgwapi.contact_comm', '6'),
                                 'tel_car'              => 
array('phpgwapi.contact_comm', '6'),
                                 'tel_isdn'             => 
array('phpgwapi.contact_comm', '6'),
                                 'tel_video'            => 
array('phpgwapi.contact_comm', '6'),
                                 'tel_prefer'           => 
array('phpgwapi.contact_comm', '6'),
                                 'email'                => 
array('phpgwapi.contact_comm', '6'),
                                 'email_type'           => 
array('phpgwapi.contact_comm', '6'),
                                 'email_home'           => 
array('phpgwapi.contact_comm', '6'),
                                 'email_home_type'      => 
array('phpgwapi.contact_comm', '6'),
                                 'url'                  => 
array('phpgwapi.contact_comm', '6'),
                                 //deprecated end

                                 'contact_type_id'      => 
array('phpgwapi.contact_types', '9'),
                                 'contact_type_descr'   => 
array('phpgwapi.contact_types', '9'),
                                 'contact_type_table'   => 
array('phpgwapi.contact_types', '9'),

                                 'comm_descr_id'        => 
array('phpgwapi.contact_comm_descr', '7'),
                                 'comm_description'     => 
array('phpgwapi.contact_comm_descr', '7'),
                                 'comm_type'            => 
array('phpgwapi.contact_comm_descr', '7'),
                                 'comm_find_descr'      => 
array('phpgwapi.contact_comm_descr', '7'),

                                 'comm_type_id'         => 
array('phpgwapi.contact_comm_type', '8'),
                                 'comm_type_description'=> 
array('phpgwapi.contact_comm_type', '8'),
                                 'comm_active'          => 
array('phpgwapi.contact_comm_type', '8'),
                                 'comm_class'           => 
array('phpgwapi.contact_comm_type', '8'),

                                 'addr_type_id'         => 
array('phpgwapi.contact_addr_type', '10'),
                                 'addr_description'     => 
array('phpgwapi.contact_addr_type', '10'),

                                 'note_type_id'         => 
array('phpgwapi.contact_note_type', '11'),
                                 'note_description'     => 
array('phpgwapi.contact_note_type', '11'),

                                 'account_id'           => 
array('phpgwapi.contact_accounts', '12'),
                                 'account_person_id'    => 
array('phpgwapi.contact_accounts', '12'),
                                 'person_only'          => 
array('phpgwapi.contact_accounts', '12'),

                                 'key_cat_id'           => 
array('phpgwapi.contact_categories', '13'));
                /**
                * Database columns for import/export
                * @access private
                */
                var $import_export_fields = array('contact_id',
                                                'access',
                                                'owner',
                                                'per_full_name',
                                                'per_first_name',
                                                'per_middle_name',
                                                'org_name',
                                                'people',
                                                'per_last_name',
                                                'per_suffix',
                                                'per_prefix',
                                                'per_birthday',
                                                'per_pubkey',
                                                'per_title',
                                                'per_department',
                                                'per_initials',
                                                'per_sound',
                                                'per_active',
                                                'per_createon',
                                                'per_createby',
                                                'per_modby',
                                                'per_modon',
                                                'key_addr_id',
                                                'addr_description',
                                                'addr_add1',
                                                'addr_add2',
                                                'addr_add3',
                                                'addr_address',
                                                'addr_postal_code',
                                                'addr_city',
                                                'addr_state',
                                                'addr_country',
                                                'addr_preferred',
                                                'comm_description',
                                                'comm_type_description',
                                                'comm_data',
                                                'key_note_id',
                                                'note_text',
                                                'note_description',
                                                'other_value',
                                                'other_name');

                /**
                * Database columns for import
                * @access private
                */
                var $import_fields = array('contact_id' => 'contact id',
                                           'first_name' => 'first name',
                                           'last_name'  => 'last name',
                                           'middle_name'=> 'middle name',
                                           'sufix'      => 'sufix',
                                           'prefix'     => 'prefix',
                                           'birthday'   => 'birthday',
                                           'pubkey'     => 'public key',
                                           'title'      => 'title',
                                           'department' => 'department',
                                           'initials'   => 'initials',
                                           'sound'      => 'sound',
                                           'active'     => 'active',
                                           'organizations' => 'organizations',
                                           'categories' => 'Categories',
                                           'locations'  => array('add1' => 
'Address 1',
                                                                 'add2' => 
'Address 2',
                                                                 'add3' => 
'Address 3',
                                                                 'city' => 
'City',
                                                                 'state'=> 
'State',
                                                                 'postal_code' 
=> 'Postal code',
                                                                 'country'      
=> 'Country',
                                                                 'preferred' => 
'Preferred'));


                //'parent_id'           => array('categories_parent', '14'));

                /**
                * Adresses fields array for mantain backward compatibility.
                *
                * As soon as csv and vcard import/export, had been fixed, this 
could be removed.
                * @access private
                * @deprecated Just for old add function.
                */
                var $adr_old = array(array('adr_one_street',
                                       'adr_one_locality',
                                       'adr_one_region',
                                       'adr_one_postalcode',
                                       'adr_one_countryname'),
                                 array('adr_two_street',
                                       'adr_two_locality',
                                       'adr_two_region',
                                       'adr_two_postalcode',
                                       'adr_two_countryname'));
                /**
                * Phone/Emails fields array for mantain backward compatibility.
                *
                * As soon as csv and vcard import/export, had been fixed, this 
could be removed.
                * @access private
                * @deprecated Just for old add function.
                */
                var $comm_old = array('tel_work'=> array('Bussiness Phone', 
'phone'),
                                  'tel_home'    => array('Home Phone', 'phone'),
                                  'tel_voice'   => array('Voice', 'phone'),
                                  'tel_fax'     => array('Fax', 'fax'),
                                  'tel_msg'     => array('Message Service', 
'phone'),
                                  'tel_cell'    => array('Mobille Phone', 
'mobil'),
                                  'tel_pager'   => array('Pager', 'phone'),
                                  'tel_bbs'     => array('BBS', 'phone'),
                                  'tel_modem'   => array('Modem', 'phone'),
                                  'tel_car'     => array('Car', 'phone'),
                                  'tel_isdn'    => array('ISDN', 'phone'),
                                  'tel_video'   => array('Video', 'phone'),
                                  'email'       => array('Bussiness', 'email'),
                                  'email_home'  => array('Home', 'email'));
                /**
                * Describe the type of contact, this var know the type of 
contact.
                * @access private
                */
                var $_contact_person;
                var $_contact_org;

                function contacts_($session=True)
                {
                        $this->db = &$GLOBALS['phpgw']->db;
                        if(!is_object($GLOBALS['phpgw']->session))
                        {
                                $GLOBALS['phpgw']->session = 
CreateObject('phpgwapi.sessions');
                        }

                        
$this->stock_contact_fields=&$this->contact_fields['showable'];
                        $this->account_id = 
$GLOBALS['phpgw_info']['user']['account_id'];
                        if($session)
                        {
                                $this->read_sessiondata();
                                $this->save_sessiondata();
                        }

                        if 
($GLOBALS['phpgw_info']['server']['contact_repository'] == 'ldap')
                        {
                                $this->LDAPSyncEnabled = true;
                                $this->LDAPResource = 
$GLOBALS['phpgw']->common->ldapConnect($GLOBALS['phpgw_info']['server']['ldap_contact_host'],
 $GLOBALS['phpgw_info']['server']['ldap_contact_dn'], 
$GLOBALS['phpgw_info']['server']['ldap_contact_pw']);
                        }
                }

                /**
                * Read data from session into this object
                *
                * @access private
                */
                function read_sessiondata()
                {
                        $data = 
$GLOBALS['phpgw']->session->appsession('session_data','phpgwapi');

                        if ($data['comm_descr_flag']=='cache')
                        {
                                $this->comm_descr = $data['comm_descr'];
                                $this->comm_descr_flag = 'cache';
                        }
                        else
                        {
                                $this->comm_descr = 
$this->get_contact_comm_descr();
                                $this->comm_descr_flag = 'cache';
                        }

                        if ($data['comm_type_flag']=='cache')
                        {
                                $this->comm_type = $data['comm_type'];
                                $this->comm_type_flag = 'cache';
                        }
                        else
                        {
                                $this->comm_type = 
$this->get_contact_comm_type();
                                $this->comm_type_flag = 'cache';
                        }

                        if ($data['addr_type_flag']=='cache')
                        {
                                $this->addr_type = $data['addr_type'];
                                $this->addr_type_flag = 'cache';
                        }
                        else
                        {
                                $this->addr_type = 
$this->get_contact_addr_type();
                                $this->addr_type_flag = 'cache';
                        }

                        if ($data['note_type_flag']=='cache')
                        {
                                $this->note_type = $data['note_type'];
                                $this->note_type_flag = 'cache';
                        }
                        else
                        {
                                $this->note_type = 
$this->get_contact_note_type();
                                $this->note_type_flag = 'cache';
                        }

                        if ($data['contact_type_flag']=='cache')
                        {
                                $this->contact_type = $data['contact_type'];
                                $this->contact_type_flag = 'cache';
                        }
                        else
                        {
                                $this->contact_type = 
$this->get_contact_types();
                                $this->contact_type_flag = 'cache';
                        }
                        $this->_contact_person = 'Persons';
                        $this->_contact_org = 'Organizations';
                }

                /**
                * Save this object into session
                *
                * @access private
                */
                function save_sessiondata()
                {
                        $data = array(
                                'comm_descr'=> $this->comm_descr,
                                'comm_type' => $this->comm_type,
                                'addr_type' => $this->addr_type,
                                'note_type' => $this->note_type,
                                'contact_type' => $this->contact_type,
                                'comm_descr_flag'=> $this->comm_descr_flag,
                                'comm_type_flag' => $this->comm_type_flag,
                                'addr_type_flag' => $this->addr_type_flag,
                                'note_type_flag' => $this->note_type_flag,
                                'contact_type_flag' => $this->contact_type_flag
                        );
                        
$GLOBALS['phpgw']->session->appsession('session_data','phpgwapi',$data);
                }

                function delete_sessiondata($var='')
                {
                        $data = 
$GLOBALS['phpgw']->session->appsession('session_data','phpgwapi');
                        if($var!='')
                        {
                                unset($data[$var]);
                        }
                        else
                        {
                                $data = '';
                        }
                        
$GLOBALS['phpgw']->session->appsession('session_data','phpgwapi',$data);
                }

                /**
                * Get the information about contact of type 'person'
                *
                * @return string Contact person name
                */
                function get_person_name()
                {
                        return $this->_contact_person;
                }

                /**
                * Get the information about contact of type `Organization'
                *
                * @return string Organization name
                */
                function get_org_name()
                {
                        return $this->_contact_org;
                }


                /**
                * Read one contact entry and return the wanted fields
                *
                * @param integer $id ID for contact entry to read
                * @param array $fields Wanted fields filter
                * @return array Array with ine contact entry
                * @deprecated
                * @access private
                * @internal send this the id and whatever fields you want to see
                */
                function read_single_entry($id,$fields='')
                {
                        $person_data = $this->person_complete_data($id);
                        $entry['fn']                    = 
$person_data['full_name'];
                        $entry['sound']                 = $person_data['sound'];
                        $entry['org_name']              = '';
                        $entry['org_unit']              = 
$person_data['department'];
                        $entry['title']                 = $person_data['title'];
                        $entry['n_prefix']              = 
$person_data['prefix'];
                        $entry['n_given']               = 
$person_data['first_name'];
                        $entry['n_middle']              = 
$person_data['middle_name'];
                        $entry['n_family']              = 
$person_data['last_name'];
                        $entry['n_suffix']              = 
$person_data['suffix'];
                        $entry['label']                 = '';
                        $entry['adr_one_street']        = 
$person_data['locations'][1]['add1'];
                        $entry['adr_one_locality']      = 
$person_data['locations'][1]['city'];
                        $entry['adr_one_region']        = 
$person_data['locations'][1]['state'];
                        $entry['adr_one_postalcode']    = 
$person_data['locations'][1]['postal_code'];
                        $entry['adr_one_countryname']   = 
$person_data['locations'][1]['country'];
                        $entry['adr_one_type']          = 
$person_data['locations'][1]['type'];
                        $entry['adr_two_street']        = 
$person_data['locations'][2]['add1'];
                        $entry['adr_two_locality']      = 
$person_data['locations'][2]['city'];
                        $entry['adr_two_region']        = 
$person_data['locations'][2]['state'];
                        $entry['adr_two_postalcode']    = 
$person_data['locations'][2]['postal_code'];
                        $entry['adr_two_countryname']   = 
$person_data['locations'][2]['country'];
                        $entry['adr_two_type']          = 
$person_data['locations'][2]['type'];
                        $entry['tz']                    = 
$person_data['locations'][1]['tz'];;
                        $entry['geo']                   = '';
                        $entry['tel_work']              = $person_data['work 
phone'];
                        $entry['tel_home']              = $person_data['home 
phone'];
                        $entry['tel_voice']             = $person_data['voice 
phone'];
                        $entry['tel_msg']               = $person_data['msg 
phone'];
                        $entry['tel_fax']               = $person_data['work 
fax'];
                        $entry['tel_pager']             = $person_data['pager'];
                        $entry['tel_cell']              = $person_data['mobile 
(cell) phone'];
                        $entry['tel_bbs']               = $person_data['bbs'];
                        $entry['tel_modem']             = $person_data['modem'];
                        $entry['tel_isdn']              = $person_data['isdn'];
                        $entry['tel_car']               = $person_data['car 
phone'];
                        $entry['tel_video']             = $person_data['video'];
                        $entry['tel_prefer']            = '';
                        $entry['email']                 = $person_data['work 
email'];
                        $entry['email_type']            = 
$person_data['comm_type']['work email'];
                        $entry['email_home']            = $person_data['home 
email'];
                        $entry['email_home_type']       = 
$person_data['comm_type']['home email'];
                        $entry['address2']              = 
$person_data['locations'][1]['add2'];
                        $entry['address3']              = 
$person_data['locations'][1]['add3'];
                        $entry['ophone']                = '';
                        $entry['bday']                  = 
$person_data['birthday'];
                        $entry['url']                   = 
$person_data['website'];
                        $entry['pubkey']                = 
$person_data['per_pubkey'];
                        $entry['note']                  = 
$person_data['notes'][1]['text'];
                        if(is_array($fields))
                        {
                                foreach($fields as $field)
                                {
                                        $entry_data[0][$field] = $entry[$field];
                                }
                        }
                        else
                        {
                                $entry_data[0] = $entry;
                        }
                        return $entry_data;
                }

                /**
                * Read last contact entry and return wanted fields
                *
                * @param array $fields Wanted fields
                * @return array Array with contact fields
                * @deprecated
                * @access private
                */
                function read_last_entry($fields='')
                {
                        $last_contact = $this->get_max_contact();
                        $person_data = $this->read_single_entry($last_contact, 
$fields);
                        return $person_data;
                }

                /**
                * Read fields from database
                *
                * @param integer $start Start position in database result
                * @param integer $limit Number of values wanted
                * @param array $fields Fields to read from database
                * @param string $query Unused
                * @param string $filter Unused
                * @param string $sort Unused
                * @param string $order Unused
                * @param integer $lastmod Unused
                * @return array Array with database fields
                * @deprecated
                * @access private
                */
                function 
read($start=0,$limit=0,$fields='',$query='',$filter='',$sort='',$order='', 
$lastmod=-1)
                {
                        foreach($fields as $field)
                        {
                                // we need search for a this communication media
                                if(@array_key_exists($field, $comm_old))
                                {
                                        $comms[] = array($field, 'comm_descr');
                                        unset($fields[$field]);
                                }
                        }
                        $first_adr = array();
                        foreach($fields as $field)
                        {
                                // We'll get first address
                                if(@in_array($field, $adr_old[0]))
                                {
                                        $adr[0] = $adr[0] + $field;
                                        unset($fields[$field]);
                                }

                                if(@in_array($field, $adr_old[1]))
                                {
                                        $adr[1] = $adr[1] + $field;
                                        unset($fields[$field]);
                                }
                        }

                        $this->request($fields);
                        //$this->limit($limit, $start);
                        $sql = $this->get_sql();
                        
$this->db->limit_query($sql,$start,__LINE__,__FILE__,$limit);
                        while ($this->db->next_record())
                        {
                                $return_fields[] = $this->db->Record;
                        }
                        return $return_fields;
                }

                /**
                * Add contact by importing it and adding a new organization 
when required
                *
                * @param string $owner Unused
                * @param array $fields Fields to import
                * @param mixed $access Access rights
                * @param integer $cat_id Category ID
                * @param integer $tid Unused
                * @deprecated This method is for old import only, I ask help to 
code a new one
                * @access private
                */
                function add($owner,$fields,$access='',$cat_id='',$tid='n')
                {
                        foreach($fields as $field => $value)
                        {
                                $this->explode_field_name($field, $value, 
$fields);
                        }

                        if(in_array($fields['note'], $fields))
                        {
                                $note['type'] = 'general';
                                $note['note'] = $fields['note'];
                                unset($fields['note']);
                        }

                        if($fields['organization'])
                        {
                                $criteria = 
$this->criteria_for_index($GLOBALS['phpgw_info']['user']['account_id'], 
PHPGW_CONTACTS_CATEGORIES_ALL, array('org_name'), $fields['organization']);
                                $records = $this->get_orgs(array('contact_id'));
                                if(is_array($records))
                                {
                                        foreach($record as $org)
                                        {
                                                $orgs[] = $org['contact_id'];
                                        }
                                }
                                else
                                {
                                        $this->add_org(array('org_name' => 
$fields['organization']));
                                        $orgs = array($this->last_id('contact', 
'contact_id'));
                                }
                        }

                        $fields['notes']                = $note;
                        $fields['organizations']        = $orgs;
                        $fields['categories']   = $cat_id;
                        $fields['access']               = $access;
                        $this->contact_import($fields);
                }

                /**
                * Test existence of a field in a contact
                *
                * @param integer $id Contact ID
                * @param string $field_name Field name which should be tested
                * @return integer Number of existing rows
                * @deprecated
                * @access private
                */
                function field_exists($id,$field_name)
                {
                        $this->request('other_count_row');
                        $this->criteria(array('other_contact_id' => $id));
                        $this->criteria(array('other_name' => $field_name));
                        $sql_select = $this->map['other_count_row']->select();
                        $this->db->query($sql_select,__LINE__,__FILE__);
                        $this->db->next_record();
                        return $this->db->f(0);
                }

                /**
                * Add one extra field to a contact
                *
                * @param integer $id Contact ID
                * @param integer $owner Unused
                * @param string $field_name Field name
                * @param string $field_value Field value
                * @deprecated
                * @access private
                */
                function 
add_single_extra_field($id,$owner,$field_name,$field_value)
                {
                        $this->other_fields = 
CreateObject('phpgwapi.contact_others');
                        $this->other_fields->insert(array('other_contact_id' => 
$id, 'other_name' => $field_name, 'other_value' => $field_value));
                }

                /**
                * Delete one extra field from a contact
                *
                * @param $id Contact ID
                * @param $field_name Field name to delete
                * @return array Empty array
                * @deprecated
                * @access private
                */
                function delete_single_extra_field($id,$field_name)
                {
                        $this->delete_others($cid);
                        return array();
                }

                /**
                * Update contact entry
                *
                * @param integer $id Contact ID
                * @param integer $owner Owner of contact
                * @param array $fields Fields to update
                * @param mixed $access Unused
                * @param integer $cat_id Unused
                * @param integer $tid Unused
                * @deprecated
                * @access private
                */
                function 
update($id,$owner,$fields,$access='',$cat_id='',$tid='n')
                {
                        $this->update($fields);
                        $this->criteria('contact_id', $id);
                        $sql_update = $this->run_update();

                        foreach($sql_update as $update)
                        {
                                $this->db->query($update, __LINE__, __FILE__);
                        }

                        foreach($extra_fields as $name => $value)
                        {
                                if ($this->field_exists($id,$x_name))
                                {
                                        if (!$value)
                                        {
                                                
$this->delete_single_extra_field($id,$name);
                                        }
                                        else
                                        {
                                                
$this->update_single_extra_field($id,$name);
                                        }
                                }
                                else
                                {
                                        
$this->add_single_extra_field($id,$owner,$name,$value);
                                }
                        }
                }

                /**
                * Echoes "don't use this"
                *
                * @param integer $id Unused
                * @deprecated
                * @access private
                */
                function read_extra_fields($id)
                {
                        echo "don't use this";
                }

                /**
                * Update one extra field of a contact
                *
                * @param integer $id Contact ID
                * @param string $name Field name
                * @param string $value Field value
                * @deprecated
                * @access private
                */
                function update_single_extra_field($id, $name, $value)
                {
                        $other = CreateObject('phpgwapi.contact_others');
                        $criteria = 
sql_criteria::token_and(sql_criteria::_equal('other_name', $name), 
sql_criteria::_equal('contact_id', $id));
                        $other->update($id, array('other_value' => $value), 
$criteria);
                }


                /**
                * Retrieve all persons data which you specify, this can use 
limit and order.
                *
                * @param array $fields The fields that you can see from person
                * @param integer $limit Limit of records that you want
                * @param integer $ofset Ofset of record that you want start
                * @param string $orderby The field which you want order
                * @param string $sort ASC | DESC depending what you want
                * @param mixed $criteria All criterias what you want
                * @param mixed $criteria_token same like $criteria but 
builded<br>with sql_criteria class, more powerfull
                * @return array Array person with records
                */
                function get_persons($fields, $limit='', $ofset='', 
$orderby='', $sort='', $criteria='', $criteria_token='')
                {
                        $this->request($fields);
                        if(in_array('org_name', $fields))
                        {
                                $this->request(array('people'));
                        }

                        if ($criteria != '')
                        {
                                $this->criteria($criteria);
                                $this->criteria(array('contact_type' => 
$this->search_contact_type($this->_contact_person)));
                        }
                        else
                        {
                                if($criteria_token=='')
                                {
                                        $this->criteria(array('contact_type' => 
$this->search_contact_type($this->_contact_person)));
                                }
                                else
                                {
                                        $criteria_token = 
sql_criteria::token_and(sql_criteria::_equal('contact_type', 
$this->search_contact_type($this->_contact_person)), $criteria_token);
                                        $this->criteria_token($criteria_token);
                                }
                        }

                        if($orderby)
                        {
                                $this->order(array($orderby), $sort);
                        }
                        $sql = $this->get_sql();
                        if ($limit)
                        {
                                $this->db->limit_query($sql, $ofset, __LINE__, 
__FILE__, $limit);
                        }
                        else
                        {
                                $this->db->query($sql, __LINE__, __FILE__);
                        }

                        $this->total_records = $this->db->num_rows();
                        while ($this->db->next_record())
                        {
                                $persons[] = $this->db->resultSet->fetchRow();
                        }
                        return $persons;
                }

                /**
                * Get all the `principal' information related for organization
                *
                * @param integer|array $contact_id id of the contact or array 
of the same
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @param boolean $get_org True: Also get the organization; 
False: get only the person data
                * @return array|string Array with records or string with sql 
query
                */
                function get_principal_persons_data($contact_id, 
$action=PHPGW_SQL_RUN_SQL, $get_org=True)
                {
                        $data = array('contact_id',
                                      'owner',
                                      'access',
                                      'cat_id',
                                      'per_full_name',
                                      'per_first_name',
                                      'per_last_name',
                                      'per_middle_name',
                                      'per_prefix',
                                      'per_suffix',
                                      'per_birthday',
                                      'per_pubkey',
                                      'per_title',
                                      'per_department',
                                      'per_initials',
                                      'per_active',
                                      'per_sound');
                        $this->request($data);
                        $this->criteria(array('contact_id' => $contact_id));
                        if($get_org==True)
                        {
                                $this->request(array('org_name', 'people'));
                                $this->criteria(array('my_preferred' => 'Y'));
                        }
                        return $this->get_query($action, __LINE__, __FILE__);
                }

                /**
                * Retrieve Data for Id, taking care that are person.
                *
                * @param mixed $person_id Organizations Id which want 
information.
                * @param string $criteria
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array Asociative array with id and all data that you 
requested
                */
                function get_organizations_by_person($person_id, $criteria ='', 
$action=PHPGW_SQL_RUN_SQL)
                {
                        $data = array('my_org_id',
                                      'my_addr_id',
                                      'my_preferred',
                                      'org_name',
                                      'people');

                        $this->request($data);
                        $this->criteria(array('my_person_id' => $person_id));
                        if (!empty($criteria))
                        {
                                $this->criteria($criteria);
                        }
                        return $this->get_query($action, __LINE__, __FILE__);
                }

                /**
                * Retrieve all organizations data which you specify, this can 
use limit and order.
                *
                * @param array $fields The fields that you can see from person
                * @param integer $limit Limit of records that you want
                * @param integer $ofset Ofset of record that you want start
                * @param string $orderby The field which you want order
                * @param string $sort ASC | DESC depending what you want
                * @param array $criteria All criterias what you want
                * @param mixed $criteria_token same like $criteria but 
builded<br>with sql_criteria class, more powerfull
                * @return array Array with organization with records
                */
                function get_orgs($fields, $limit='', $ofset='', $orderby='', 
$sort='', $criteria='', $criteria_token='')
                {
                        $this->request($fields);
                        $person_fields = array('per_full_name', 
'per_first_name', 'per_last_name');
                        if(count(array_intersect($person_fields, $fields)) > 0)
                        {
                                $this->request(array('organizations'));
                        }

                        if ($criteria != '')
                        {
                                $this->criteria($criteria);
                                $this->criteria(array('contact_type' => 
$this->search_contact_type($this->_contact_org)));
                        }
                        else
                        {
                                if($criteria_token=='')
                                {
                                        $this->criteria(array('contact_type' => 
$this->search_contact_type($this->_contact_org)));
                                }
                                else
                                {
                                        $criteria_token = 
sql_criteria::token_and(sql_criteria::_equal('contact_type', 
$this->search_contact_type($this->_contact_org)), $criteria_token);
                                        $this->criteria_token($criteria_token);
                                }
                        }

                        if($orderby)
                        {
                                $this->order(array($orderby), $sort);
                        }

                        $sql = $this->get_sql();

                        if ($limit)
                        {
                                $this->db->limit_query($sql, $ofset, __LINE__, 
__FILE__, $limit);
                        }
                        else
                        {
                                $this->db->query($sql, __LINE__, __FILE__);
                        }

                        $this->total_records = $this->db->num_rows();
                        while ($this->db->next_record())
                        {
                                $orgs[] = $this->db->resultSet->fetchRow();
                        }
                        
                        return $orgs;
                }

                /**
                * Get all the `principal' information related for contacts 
(when is/are person)
                *
                * @param integer|array $contact_id id of the contact or array 
of the same
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array|string Array with records or string with sql 
query
                */
                function get_principal_organizations_data($contact_id, 
$action=PHPGW_SQL_RUN_SQL)
                {
                        $data = array('contact_id',
                                      'owner',
                                      'access',
                                      'cat_id',
                                      'org_active',
                                      'org_name');
                        $this->request($data);
                        $this->criteria(array('contact_id' => $contact_id));
                        return $this->get_query($action, __LINE__, __FILE__);
                }

                /**
                * Retrieve Data for Id, taking care that are organizations.
                *
                * @param mixed $organizations_id Organizations Id which want 
information.
                * @param string $criteria
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array Asociative array with id and all data that we 
requested
                */
                function get_people_by_organizations($organizations_id, 
$criteria='', $action=PHPGW_SQL_RUN_SQL)
                {                       
                        $data = array('my_person_id',
                                      'my_addr_id',
                                      'my_preferred');
                        $this->request($data);
                        
                        $this->criteria(array('my_org_id' => 
$organizations_id));
                        $this->criteria($criteria);
                        return $this->get_query($action, __LINE__, __FILE__);
                }

                /**
                * Retrieve communications data for contact id.
                *
                * @param integer $contact_id  Id which want information.
                * @param array $fields_to_search Description what you want to 
find.
                * This parameter is an array and you can use it when you want 
get
                * information of especific comm_description (based in 
descriptions
                * from comm_description catalog).
                * @return array Asociative with id and all data that you 
requested
                */
                function get_comm_contact_data($contact_id, 
$fields_to_search='')
                {
                        $comms = array();
                        $data = array('comm_contact_id',
                                      'key_comm_id',
                                      'comm_preferred',
                                      'comm_data',
                                      'comm_descr',
                                      'comm_description');
                        $this->request($data);
                        $this->criteria(array('comm_contact_id' => 
$contact_id));
                        if(!empty($fields_to_search))
                        {
                                $this->criteria(array('comm_find_descr' => 
$fields_to_search));
                        }

                        $entry =  $this->get_records(__LINE__, __FILE__);
                        if($entry)
                        {
                                foreach($entry as $k => $v)
                                {
                                        $comms[] = $entry[$k];
                                }
                        }
                        return $comms;
                }



                /**
                * Retrieve locations data for contact id.
                *
                * @param integer $contact_id  Id which want information.
                * @param array $criteria Others criterias what you want.
                * @return array Asociative with id and all data that you 
requested
                */
                function get_addr_contact_data($contact_id, $criteria='')
                {
                        $data = array('addr_contact_id',
                                      'key_addr_id',
                                      'addr_type',
                                      'addr_add1',
                                      'addr_add2',
                                      'addr_city',
                                      'addr_state',
                                      'addr_postal_code',
                                      'addr_country',
                                      'addr_preferred',
                                      'addr_description');
                        $this->request($data);
                        $this->criteria(array('addr_contact_id' => 
$contact_id));
                        if($criteria!='')
                        {
                                $this->criteria($criteria);
                        }
                        $entry =  $this->get_records(__LINE__, __FILE__);
                        if($entry)
                        {
                                foreach($entry as $k => $v)
                                {
                                        $locations[] = $entry[$k];
                                }
                        }
                        return $locations;
                }

                /**
                * Retrieve others data for contact id.
                *
                * @param integer $contact_id  Id which want information.
                * @param string $criteria
                * @return array Asociative with id and all data that you 
requested
                */
                function get_others_contact_data($contact_id, $criteria='')
                {
                        $others = array();
                        $data = array('other_contact_id',
                                      'key_other_id',
                                      'other_owner',
                                      'other_name',
                                      'other_value');
                        $this->request($data);
                        $this->criteria(array('other_contact_id' => 
$contact_id));
                        if($criteria!='')
                        {
                                $this->criteria($criteria);
                        }
                        $entry =  $this->get_records(__LINE__, __FILE__);
                        if($entry)
                        {
                                foreach($entry as $k => $v)
                                {
                                        $others[] = $entry[$k];
                                }
                        }
                        return $others;
                }

                /**
                * Get the records from contact type catalog
                *
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array|string Array with records or string with sql 
query
                */
                function get_contact_types($action=PHPGW_SQL_RUN_SQL)
                {
                        $fields = array('contact_type_id', 
'contact_type_descr', 'contact_type_table');
                        $this->request($fields);
                        return $this->get_query($action, __LINE__, __FILE__);
                }

                /**
                * Get the records from addr type catalog
                *
                * @param integer $action PHPGW_SQL_RETURN_SQL | RUN_SQL 
depending what we want
                * @return array|string Array with records or string with sql 
query
                */
                function get_contact_addr_type($action=PHPGW_SQL_RUN_SQL)
                {
                        $fields = array('addr_type_id', 'addr_description');
                        $this->request($fields);
                        return $this->get_query($action, __LINE__, __FILE__);
                }

                /**
                * Get the records from comm type catalog
                *
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array|string Array with records or string with sql 
query
                */
                function get_contact_comm_type($action=PHPGW_SQL_RUN_SQL)
                {
                        $fields = array('comm_type_id', 
'comm_type_description', 'comm_active', 'comm_class');
                        $this->request($fields);
                        return $this->get_query($action, __LINE__, __FILE__);
                }

                /**
                * Get the records from comm descr catalog
                *
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array|string Array with records or string with sql 
query
                */
                function get_contact_comm_descr($action=PHPGW_SQL_RUN_SQL)
                {
                        $fields = array('comm_descr_id', 'comm_description', 
'comm_type');
                        $this->request($fields);
                        return $this->get_query($action, __LINE__, __FILE__);
                }

                /**
                * Get the records from note descr catalog
                *
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return mixed SQL string or records with note_type_id and 
not_description
                */
                function get_contact_note_type($action=PHPGW_SQL_RUN_SQL)
                {
                        $fields = array('note_type_id', 'note_description');
                        $this->request($fields);
                        return $this->get_query($action, __LINE__, __FILE__);
                }

                /**
                * Count the persons and return the number
                *
                * @param string $criteria  The criterias
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return integer The record count number
                */
                function get_count_persons($criteria='', 
$action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request('count_persons');
                        if($criteria!='')
                        {
                                $this->criteria_token($criteria);
                        }
                        $count =  $this->get_query($action, __LINE__, __FILE__);
                        return $count[0]['count_persons'];
                }

                /**
                * Count the organizations and return the number
                *
                * @param string $criteria  The criterias
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return integer The record count number
                */
                function get_count_orgs($criteria='', $action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request('count_orgs');
                        if($criteria!='')
                        {
                                $this->criteria_token($criteria);
                        }
                        $count =  $this->get_query($action, __LINE__, __FILE__);
                        return $count[0]['count_orgs'];
                }

                /**
                * Count the contacts and return the number
                *
                * @param string $criteria  The criterias
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return integer The record count number
                */
                function get_count_contacts($criteria='', 
$action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request('count_contacts');
                        if($criteria!='')
                        {
                                $this->criteria($criteria);
                        }
                        $count =  $this->get_query($action, __LINE__, __FILE__);
                        return $count[0]['count_contacts'];
                }

                /**
                * Get the max contact_id
                *
                * @param string $criteria  The criterias
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return integer The record count number
                */
                function get_max_contact($criteria='', 
$action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request('max_contacts');
                        if($criteria!='')
                        {
                                $this->criteria($criteria);
                        }
                        $max =  $this->get_query($action, __LINE__, __FILE__);
                        return $max[0]['max_contacts'];
                }

                /**
                * Retrieve all the people that is owned by $owner (but I have 
read access).
                *
                * @param integer $owner The account_id of the owner.
                * @param array $data This is the information that want to 
retrieve.
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array Asociative with id and all data that we 
requested
                */
                function get_people_by_owner($owner, $data, 
$action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request('contact_id');
                        $this->request($data);
                        $this->criteria(array('owner' => $owner));
                        return $this->get_query($action, __LINE__, __FILE__);
                }

                /**
                * Retrieve all the people that is part from specified category.
                *
                * @param integer $cat_id The cat_id of the owner.
                * @param boolean $sub_cat
                * @return array Asociative with id and all data that we 
requested
                */
                function get_persons_by_cat($cat_id, $sub_cat=True)
                {
                        if($sub_cat && $cat_id)
                        {
                                $cat_id = array_merge(array($cat_id), 
$this->get_sub_cats($cat_id));
                        }

                        $this->request('person_id');
                        if(is_array($cat_id))
                        {
                                $this->criteria(array('sel_cat_id' => $cat_id));
                        }
                        else
                        {
                                $this->criteria(array('cat_id' => $cat_id));
                        }

                        $sql = $this->get_sql();

                        $this->db->query($sql, __LINE__, __FILE__);
                        while ($this->db->next_record())
                        {
                                $persons[] = $this->db->f('person_id');
                        }
                        return $persons;
                }

                /**
                * Get all the contacts id, and data if it is dessired, from the 
contacts that are users of phpGroupWare
                *
                * @param array $data Data that we want for each contact that we 
retrieve.
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array Contacts that are users and his data.
                */
                function get_system_contacts($data, $action=PHPGW_SQL_RUN_SQL)
                {

                        $accounts = $GLOBALS['phpgw']->accounts->get_list();
                        foreach($accounts as $account_data)
                        {
                                if($account_data['person_id'])
                                {
                                        $people[] = $account_data['person_id'];
                                }
                        }

                        if(is_array($data))
                        {
                                $this->request($data);
                        }

                        $this->request('person_id');
                        // sql::in() is better than make a select by each 
account
                        $this->criteria(array('person_id' => $people));
                        return $this->get_query($action, __LINE__, __FILE__);
                }

                /**
                * Retrieve all contacts of user that are marked as private.
                *
                * @param mixed $data List of fields what we want retrieve
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array Asociative with id and all data that we 
requested
                */
                function get_private_contacts($data, $action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request('contact_id');
                        $this->request($data);
                        $this->criteria(array('access' => 'private'));
                        return $this->get_query($action, __LINE__, __FILE__);

                }

                /**
                * Retrieve the bussines email by contact
                *
                * @param integer $contacts_id The contact id that will be used 
for search his email.
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array Asociative with id and email
                */
                function get_email($contacts_id, $action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request(array('comm_data'));
                        $this->criteria(array('comm_descr' => 
$this->search_comm_descr('work email'), 'comm_contact_id' => $contacts_id));
                        $email = $this->get_records_by_field('comm_data', 
__LINE__, __FILE__);
                        return $email[0];
                }

                /**
                * Retrieve the bussines phone by contact
                *
                * @param integer $contacts_id The contact id that will be used 
for search his phone.
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array Asociative with id and phone
                */
                function get_phone($contacts_id, $action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request(array('comm_data'));
                        $this->criteria(array('comm_descr' => 
$this->search_comm_descr('work phone'), 'comm_contact_id' => $contacts_id));
                        $phone = $this->get_records_by_field('comm_data', 
__LINE__, __FILE__);
                        return $phone[0];
                }

                /**
                * Get all sub categories from cat_id
                *
                * @param integer $cat_id  The category id to find
                * @return array All sub categories
                * @access private
                */
                function get_sub_cats($cat_id)
                {
                        $sql = 'SELECT cat2.cat_id FROM phpgw_categories as cat 
'
                                .'INNER JOIN phpgw_categories as cat2 ON 
cat.cat_id=cat2.cat_parent '
                                .'WHERE '.sql::in('cat.cat_id', $cat_id);

                        $this->db->query($sql, __LINE__, __FILE__);
                        while ($this->db->next_record())
                        {
                                $cats[] = $this->db->f('cat_id');
                        }

                        if(is_array($cats))
                        {
                                return array_merge($cats, 
$this->get_sub_cats($cats));
                        }
                }

                /**
                * This function get all the Communication media from one 
contact.
                *
                * Or the first if there is no one marked as preferred.
                * @param integer $contact_id id to locate the contact
                * @return array Form: description => value, ...
                */
                function get_all_comms($contact_id)
                {
                        if (intval($contact_id) != 0)
                        {
                                // get all comm_descriptions from api function
                                $this->request(array('comm_data', 
'comm_descr'));
                                $this->criteria(array('comm_contact_id' => 
$contact_id));
                                // get all comms from db
                                $records = $this->get_query(PHPGW_SQL_RUN_SQL, 
__LINE__, __FILE__);
                                if(count($records) == 0)
                                {
                                        return;
                                }
                                foreach ($records as $comm)
                                {
                                        $descr = 
$this->search_comm_descr_id($comm['comm_descr']);
                                        $comms[$descr] = $comm['comm_data'];
                                }
                        }
                        return $comms;
                }

                /**
                * This function get the contact name.
                *
                * @param integer $contact_id id The contact what you want
                * @return string The name of the contact
                */
                function get_contact_name($contact_id)
                {
                        $type = 
$this->search_contact_type_id($this->get_type_contact($contact_id));
                        if($type == $this->_contact_person)
                        {
                                $field_name = 'per_full_name';
                        }
                        elseif($type == $this->_contact_org)
                        {
                                $field_name = 'org_name';
                        }

                        $this->request(array($field_name));
                        $this->criteria(array('contact_id' => $contact_id));
                        $contact_name = 
$this->get_records_by_field($field_name, __LINE__, __FILE__);
                        return $contact_name[0];
                }
                
                function get_name_of_person_id($person_id)
                {
                        $this->request(array('per_full_name'));
                        $this->criteria(array('person_id' => $person_id));
                        $person_name = 
$this->get_records_by_field('per_full_name', __LINE__, __FILE__);
                        return $person_name[0];
                }

                /**
                * Get communication description string.
                *
                * When there are no communication types available create them.
                * @param string $comm_type Communication Type
                * @param string $comm_description Communication location
                * @return string Communication description
                * @access private
                */
                function comms_fixed($comm_type, $comm_description)
                {
                        // In this array add all the label that you have on an 
import method, an make the
                        // association with the corresponding description on 
database
                        if(!$this->hash_comms_import)
                        {
                                $this->hash_comms_import =
                                        array('email'  => array('home'          
=> 'home email',
                                                                                
        'work'          => 'work email',
                                                                                
        'other'         => 'other email'),
                                              'phone'  => array('home'          
=> 'home phone',
                                                                                
        'work'          => 'work phone',
                                                                                
        'other'         => 'other phone',
                                                                                
        'msg'           => 'msg phone',
                                                                                
        'home_two'      => 'second home phone',
                                                                                
        'work_two'      => 'second work phone',
                                                                                
        'isdn'          => 'isdn',
                                                                                
        'other_two'     => 'second other phone',
                                                                                
        'pager'         => 'pager'),
                                              'fax'    => array('work'          
=> 'work fax',
                                                                                
        'home'          => 'home fax',
                                                                                
        'other'         => 'other fax'),
                                              'mobile' => array('car'           
=> 'car phone',
                                                                                
        'cell'          => 'mobile (cell) phone'));
                        }
                        return 
$this->hash_comms_import[$comm_type][$comm_description];
                }

                /**
                * Explode a field name by `_' so parts of the field name have a 
meaning, not only the whole name
                *
                * @param string $field meta-field name, with form: 
{kind}_{key_{real_field_name}
                * @param mixed $value to assing to field
                * @param mixed &$field_list reference to the list that contain 
$field
                * @access private
                */
                function explode_field_name($field, $value, &$fields_list)
                {
                        // ugly hack
                        $addr_keys = array('work', 'home', 'other', 'other', 
'other', 'other');

                        list($kind, $key, $name) = explode('_', $field, 3);
                        echo "$kind : $key : $name<br />\n";
                        switch ($kind)
                        {
                        case 'addr':
                                // Code for locations
                                $fields_list['location'][$key][$name] = $value;
                                unset($fields_list[$field]);
                                $fields_list['location'][$key]['type'] = 
$addr_keys[$key];
                                break;
                        case 'comm':
                                // Code for comms
                                
$fields_list['comm_media'][$this->comms_fixed($key, $name)] = $value;
                                unset($fields_list[$field]);
                                break;
                        case 'org':
                                list($org_key, $name) = explode('_', $name, 2);
                                switch($key)
                                {
                                case 'addr':
                                        // Code for locations
                                        
$fields_list['org_data']['location'][$org_key][$name] = $value;
                                        unset($fields_list[$field]);
                                        
$fields_list['org_data']['location'][$org_key]['type'] = $addr_keys[$org_key];
                                        break;
                                case 'comm':
                                        // Code for comms
                                        
$fields_list['org_data']['comm_media'][$this->comms_fixed($org_key, $name)] = 
$value;
                                        unset($fields_list[$field]);
                                        break;
                                default:
                                        // code for default (principal/others)
                                        $fields_list['org_data'][$field] = 
$value;
                                        unset($fields_list[$field]);
                                }
                        }
                }

                /**
                * Get all the data for any contact or contacts that are part of 
$optional_criteria.
                *
                * This function try to be a comprensive way to get data from 
contacts
                * convert the contacts database output on a multidimensional 
array
                * @param integer|array $contact_id
                * @param mixed $optional_criteria criteria built with 
sql_criteria
                * @param integer $line where this function is called, usefull 
for debug
                * @param integer $file where this function is called, usefull 
for debug
                * @return array All the data of contact (contacts).
                */
                function person_complete_data($contact_id, $optional_criteria = 
'', $line=__LINE__, $file=__FILE__)
                {
                        $this->request($this->import_export_fields);
                        if (empty($optional_criteria))
                        {
                                if (intval($contact_id) == 0)
                                {
                                        // this is an error
                                        return ;
                                }
                                
$this->criteria_token(sql_criteria::_equal('contact_id', $contact_id));
                        }
                        else
                        {
                                $this->criteria_token($optional_criteria);
                        }

                        $sql = $this->get_sql();

                        $this->execute_query($sql, $line, $file);

                        while ($this->db->next_record())
                        {
                                $record = $this->db->resultSet->fetchRow();
                                $contact['contact_id']          = 
$record['contact_id'];
                                $contact['access']              = 
$record['access'];
                                $contact['owner']               = 
$record['owner'];
                                $contact['full_name']           = 
$record['per_full_name'];
                                $contact['first_name']          = 
$record['per_first_name'];
                                $contact['last_name']           = 
$record['per_last_name'];
                                $contact['middle_name']         = 
$record['per_middle_name'];
                                $contact['suffix']              = 
$record['per_suffix'];
                                $contact['prefix']              = 
$record['per_prefix'];
                                $contact['birthday']            = 
$record['per_birthday'];
                                $contact['pubkey']              = 
$record['per_pubkey'];
                                $contact['title']               = 
$record['per_title'];
                                $contact['department']          = 
$record['per_department'];
                                $contact['initials']            = 
$record['per_initials'];
                                $contact['sound']               = 
$record['per_sound'];
                                $contact['active']              = 
$record['per_active'];
                                $contact['createon']            = 
$record['per_createon'];
                                $contact['createby']            = 
$record['per_createby'];
                                $contact['modby']               = 
$record['per_modby'];
                                $contact['modon']               = 
$record['per_modon'];
                                $contact['account_id']          = 
$record['account_id'];
                                $contact['org_name']            = 
$record['org_name'];
                                // Locations info
                                $loc_id                         = 
$record['key_addr_id'];
                                if($loc_id)
                                {
                                        $contact['locations'][$loc_id]['type']  
        = $record['addr_description'];
                                        $contact['locations'][$loc_id]['add1']  
        = $record['addr_add1'];
                                        $contact['locations'][$loc_id]['add2']  
        = $record['addr_add2'];
                                        $contact['locations'][$loc_id]['add3']  
        = $record['addr_add3'];
                                        
$contact['locations'][$loc_id]['address']       = $record['addr_address'];
                                        $contact['locations'][$loc_id]['city']  
        = $record['addr_city'];
                                        $contact['locations'][$loc_id]['state'] 
        = $record['addr_state'];
                                        
$contact['locations'][$loc_id]['postal_code']   = $record['addr_postal_code'];
                                        
$contact['locations'][$loc_id]['country']       = $record['addr_country'];
                                        
$contact['locations'][$loc_id]['preferred']     = $record['addr_preferred'];
                                }
                                // Notes
                                $note_id                                        
= $record['key_note_id'];
                                if($note_id)
                                {
                                        $contact['notes'][$note_id]['text']     
        = $record['note_text'];
                                        $contact['notes'][$note_id]['type']     
        = $record['note_description'];
                                }
                                // Communcation media fields
                                if($record['comm_data'])
                                {
                                        $comm_descr                             
= $record['comm_description'];
                                        //$contact[$comm_descr]                 
= $record['comm_data'];
                                        $contact['comm_media'][$comm_descr]     
= $record['comm_data'];
                                }
                                // Other fields
                                if($record['other_value'])
                                {
                                        $contact[$record['other_name']]         
= $record['other_value'];
                                }
                        }
                        return $contact;
                }


                /**
                * Search location id in location catalog
                *
                * @param integer $id The location id to find
                * @return string The description of id
                */
                function search_location_type_id($id)
                {
                        return $this->search_catalog('addr_type_id', $id, 
'addr_description', 'addr_type');
                }

                /**
                * Search location type in location catalog
                *
                * @param string $description The location description to find
                * @return integer The id of description
                */
                function search_location_type($description)
                {
                        return $this->search_catalog('addr_description', 
$description, 'addr_type_id', 'addr_type');
                }

                /**
                * Search location id in location catalog
                *
                * @param integer $id The location id to find
                * @return string The description of id
                */
                function search_note_type_id($id)
                {
                        return $this->search_catalog('note_type_id', $id, 
'note_description', 'note_type');
                }

                /**
                * Search location type in location catalog
                *
                * @param string $description The location description to find
                * @return integer The id of description
                */
                function search_note_type($description)
                {
                        return $this->search_catalog('note_description', 
$description, 'note_type_id', 'note_type');
                }

                /**
                * Search communication type id in communications catalog
                *
                * @param integer $id The communication id to find
                * @return string The description type of id
                */
                function search_comm_type_id($id)
                {
                        return $this->search_catalog('comm_type_id', $id, 
'comm_type_description', 'comm_type');
                }

                /**
                * Search communication type in location catalog
                *
                * @param string $description The communication type to find
                * @return integer The id of description
                */
                function search_comm_type($description)
                {
                        return $this->search_catalog('comm_type_description', 
$description, 'comm_type_id', 'comm_type');
                }

                /**
                * Search communication id in communications description catalog
                *
                * @param integer $id The communication description id to find
                * @return string The description text of id
                */
                function search_comm_descr_id($id)
                {
                        return $this->search_catalog('comm_descr_id', $id, 
'comm_description', 'comm_descr');
                }

                /**
                * Search communication description in communications 
description catalog
                *
                * @param string $description The communication type to find
                * @return integer The id of description
                */
                function search_comm_descr($description)
                {
                        return $this->search_catalog('comm_description', 
$description, 'comm_descr_id', 'comm_descr');
                }

                /**
                * Search contact type id in contact type catalog
                *
                * @param integer $id The contact type id to find
                * @return string The description text of id
                */
                function search_contact_type_id($id)
                {
                        return $this->search_catalog('contact_type_id', $id, 
'contact_type_descr', 'contact_type');
                }


                /**
                * Search contact type description in contact type catalog
                *
                * @param string $description The contact type description to 
find
                * @return integer The id of description
                */
                function search_contact_type($description)
                {
                        return $this->search_catalog('contact_type_descr', 
$description, 'contact_type_id', 'contact_type');
                }


                /**
                * Allow edit information of an existent contact
                *
                * Allow edit many communications media, locations, categories 
and others fields, that already exist for a given contact.
                * @param integer $cid Contact Id that want to be edited.
                * @param array $principal Principal information for contact, 
its depends on $type, but is according which each definition
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return string SQL update string
                */
                function edit_contact($cid, $principal, 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        $contact = CreateObject('phpgwapi.contact_central');
                        if (isset($principal['cat_id']))
                        {
                                $principal['cat_id'] = 
$this->get_categories($principal['cat_id']);
                        }
                        if(!isset($principal['owner']))
                        {
                                $principal['owner'] = 
$GLOBALS['phpgw_info']['user']['account_id'];
                        }
                        return $contact->update($principal, 
sql_criteria::_equal('contact_id',sql::integer($cid)), $action);
                }

                /**
                * Allow edit information of an person
                *
                * @param integer $id Person Id that want to be edited.
                * @param array $data Principal information for person
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return string SQL update string
                */
                function edit_person($id, $data, $action=PHPGW_SQL_RUN_SQL)
                {
                        $person = CreateObject('phpgwapi.contact_person');
                        if(!isset($data['per_modon']))
                        {
                                $data['per_modon'] = $this->get_mkdate();
                        }
                        if(!isset($data['per_modby']))
                        {
                                $data['per_modby'] = $this->get_user_id();
                        }
                        return $person->update($data, 
sql_criteria::_equal('person_id',sql::integer($id)), $action);
                }

                /**
                * Allow edit information of an org
                *
                * @param integer $id Org Id that want to be edited.
                * @param array $data Information for contact
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return string SQL update string
                */
                function edit_org($id, $data, $action=PHPGW_SQL_RETURN_SQL)
                {
                        $org = CreateObject('phpgwapi.contact_org');
                        if(!isset($data['org_modon']))
                        {
                                $data['org_modon'] = $this->get_mkdate();
                        }
                        if(!isset($data['org_modby']))
                        {
                                $data['org_modby'] = $this->get_user_id();
                        }
                        return $org->update($data, 
sql_criteria::_equal('org_id',sql::integer($id)), $action);
                }


                /**
                * Allow edit location information of an contact
                * 
                * @param integer $id Contact location Id that want to be edited.
                * @param array $data Information for contact
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return string SQL update string
                */
                function edit_location($id, $data, $action=PHPGW_SQL_RETURN_SQL)
                {
                        $loc = CreateObject('phpgwapi.contact_addr');
                        if(!isset($data['addr_modon']))
                        {
                                $data['addr_modon'] = $this->get_mkdate();
                        }
                        if(!isset($data['addr_modby']))
                        {
                                $data['addr_modby'] = $this->get_user_id();
                        }
                        return $loc->update($data, 
sql_criteria::_equal('contact_addr_id',sql::integer($id)), $action);
                }

                /**
                * Allow edit communication information of an contact
                * 
                * @param integer $id Contact comm Id that want to be edited.
                * @param array $data Information for contact
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return string SQL update string
                */
                function edit_comms($id, $data, $action=PHPGW_SQL_RETURN_SQL)
                {
                        $comm = CreateObject('phpgwapi.contact_comm');
                        if(!isset($data['comm_modon']))
                        {
                                $data['comm_modon'] = $this->get_mkdate();
                        }
                        if(!isset($data['comm_modby']))
                        {
                                $data['comm_modby'] = $this->get_user_id();
                        }
                        return $comm->update($data, 
sql_criteria::_equal('comm_id',sql::integer($id)), $action);
                }

                /**
                * Allow edit other information of an contact
                * 
                * @param integer $id Contact other Id that want to be edited.
                * @param array $data Information for contact
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return string SQL update string
                */
                function edit_other($id, $data, $action=PHPGW_SQL_RETURN_SQL)
                {
                        $comm = CreateObject('phpgwapi.contact_others');
                        return $comm->update($data, 
sql_criteria::_equal('other_id',sql::integer($id)), $action);
                }

                /**
                * Allow edit communication information of an contact
                *
                * @param integer $id Contact Id that want to be edited.
                * @param array $data Information for contact
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return string SQL update string
                */
                function edit_comms_by_contact($id, $data, 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        $comm = CreateObject('phpgwapi.contact_comm');
                        return $comm->update($data, 
sql_criteria::_equal('contact_id',sql::integer($id)), $action);
                }

                /**
                * Allow edit org-person relation of an contact
                *
                * @param integer $org_id Organization Id that want to be edited.
                * @param integer $person_id Person Id that want to be edited.
                * @param array $data Information for contact
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return string SQL update string
                */
                function edit_org_person_relation($org_id='', $person_id='', 
$data=array(), $action=PHPGW_SQL_RETURN_SQL)
                {
                        $relation = CreateObject('phpgwapi.contact_org_person');
                        if($org_id && $person_id)
                        {
                                $criteria = 
sql_criteria::and_(sql_criteria::equal('org_id',sql::integer($org_id)),
                                                               
sql_criteria::equal('person_id',sql::integer($person_id)));
                        }
                        elseif($org_id)
                        {
                                $criteria = 
sql_criteria::equal('org_id',sql::integer($org_id));
                        }
                        elseif($person_id)
                        {
                                $criteria = 
sql_criteria::equal('person_id',sql::integer($person_id));
                        }

                        return $relation->update($data, $criteria, $action);
                }

                /**
                * Allow to change the current owner for the new
                *
                * @param integer $old_owner Current owner
                * @param integer $new_owner New owner, wath you want to have 
now.
                * @return string SQL update string
                */
                function change_owner($old_owner='',$new_owner='')
                {
                        if (!($new_owner && $old_owner))
                        {
                                return False;
                        }
                        $contact = CreateObject('phpgwapi.contact_central');
                        return $contact->update(array('owner' => $new_owner),
                                                
sql_criteria::_equal('owner',sql::integer($old_owner)),
                                                PHPGW_SQL_RUN_SQL);
                }

                /**
                * Allow to change the current owner for the new
                *
                * @param integer $old_owner Current owner
                * @param integer $new_owner New owner, wath you want to have 
now.
                * @return string SQL update string
                */
                function change_owner_others($old_owner='',$new_owner='')
                {
                        if (!($new_owner && $old_owner))
                        {
                                return False;
                        }
                        $contact = CreateObject('phpgwapi.contact_others');
                        return $contact->update(array('contact_owner' => 
$new_owner),
                                                
sql_criteria::_equal('contact_owner',sql::integer($old_owner)),
                                                PHPGW_SQL_RUN_SQL);
                }

                /**
                * Allow to edit the current other data for the owner, you can 
modify other_name or other_value fields
                *
                * @param integer $id the owner id
                * @param string $new_data The new value which you want to 
update.
                * @param string $old_data The current value which you want to 
update.
                * @param string $field_data The field is can be other_name or 
other_value
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return string SQL update string
                */
                function edit_other_by_owner($id, $new_data, $old_data, 
$field_data, $action=PHPGW_SQL_RUN_SQL)
                {
                        $other = CreateObject('phpgwapi.contact_others');
                        $criteria = 
sql_criteria::append_and(array(sql_criteria::equal('contact_owner', 
sql::integer($id)),
                                                                   
sql_criteria::equal($field_data, sql::string($old_data))));
                        return $other->update(array($field_data => $new_data), 
$criteria, $action);
                }

                /**
                * Allow to change the current cat_id by the new
                *
                * @param integer $cid The contact_id what you want to edit
                * @param array $categories The new categories
                * @param $action
                * @return string SQL update string
                */
                function edit_category($cid, $categories=array(), 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        $contact = CreateObject('phpgwapi.contact_central');
                        $principal['cat_id'] = 
$this->get_categories($categories);
                        return $contact->update($principal, 
sql_criteria::_equal('contact_id',sql::integer($cid)), $action);
                }


                /**
                 * Add a contact and it's data
                 *
                 * If account_person_id will be null for each person that is 
not a user.
                 * @param mixed $type Type of contact, for either `organzation' 
or `person'
                 * @param array $principal Principal information for contact, 
its depends on $type, but is according which each definition
                 * @param array $comms Information relative to communication 
media
                 * @param array $location Information relative to locations.
                 * @param array $categeries Catagories in which contact must be 
added.
                 * @param array $others Others fields to be added.
                 * @param array $contact_relations the org_id or the person_id 
for this person or organzation
                 * @param array $notes Notes to be added.
                 * @return integer New contact ID
                 */
                function add_contact($type, $principal=array(), $comms=array(), 
$locations=array(), $categories=array(), $others=array(), 
$contact_relations=array(), $notes=array())
                {
                        $this->contact = 
CreateObject('phpgwapi.contact_central');
                        $owner = 
$principal['owner']?$principal['owner']:$GLOBALS['phpgw_info']['user']['account_id'];
                        $this->lock_table($this->contact->table);

                        $this->contact->insert(array('owner' => $owner,
                                                     'access' => 
$principal['access'],
                                                     'cat_id' => 
$this->get_categories($categories),
                                                     'contact_type' => $type), 
PHPGW_SQL_RUN_SQL);
                        $cid = $this->last_id('contact', 'contact_id');
                        $this->unlock_table();
                        $add_type = $this->search_contact_type_id($type);
                        switch($add_type)
                        {
                        case $this->_contact_person:
                                $this->add_person($principal, $cid, 
PHPGW_SQL_RUN_SQL);
                                $this->add_orgs_for_person($contact_relations, 
$principal['preferred_org'], $principal['preferred_address'], $cid, 
PHPGW_SQL_RUN_SQL);
                                break;
                        case $this->_contact_org:
                                $this->add_org($principal, $cid, 
PHPGW_SQL_RUN_SQL);
                                
$this->add_people_for_organzation($contact_relations, $cid, PHPGW_SQL_RUN_SQL);
                                break;
                        }

                        if(is_array($comms))
                        {
                                foreach($comms as $comm)
                                {
                                        $this->add_communication_media($comm, 
$cid, PHPGW_SQL_RUN_SQL);
                                        $this->unlock_table();
                                }
                        }
                        if(is_array($locations))
                        {
                                foreach($locations as $location)
                                {
                                        $this->add_location($location, $cid, 
PHPGW_SQL_RUN_SQL);
                                        $this->unlock_table();
                                }
                        }

                        if(is_array($others))
                        {
                                foreach($others as $other)
                                {
                                        $this->add_others($other, $cid, 
PHPGW_SQL_RUN_SQL);
                                        $this->unlock_table();
                                }
                        }
                        if(is_array($notes))
                        {
                                foreach($notes as $note)
                                {
                                        $this->add_note($note, $cid, 
PHPGW_SQL_RUN_SQL);
                                        $this->unlock_table();
                                }
                        }

                        if($add_type == $this->_contact_person)
                        {
                                $this->finalize_add($cid);
                        }
                        return $cid;
                }

                /**
                * Add an organization and it's data
                *
                * @param array $principal Principal information for organization
                * @param integer $cid Organization id
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return SQL insert string or nothing
                */
                function add_org($principal, $cid, $action=PHPGW_SQL_RETURN_SQL)
                {
                        $this->org = CreateObject('phpgwapi.contact_org');
                        if ($action == PHPGW_SQL_RUN_SQL)
                        {
                                $this->lock_table($this->org->table);
                        }
                        $this->lock_table($this->org->table);
                        $principal['org_creaton'] = $this->get_mkdate();
                        $principal['org_creatby'] = $this->get_user_id();
                        $principal['org_modon'] = $this->get_mkdate();
                        $principal['org_modby'] = $this->get_user_id();

                        $execute = $this->_add($principal,'org','org_id',$cid, 
$action);
                        $this->unlock_table();
                        return $execute;
                }

                /**
                * Add a person and it's data
                *
                * @param array $principal Principal information for person
                * @param integer $cid  person id
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return SQL insert string or nothing
                */
                function add_person($principal, $cid, 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        $this->person = CreateObject('phpgwapi.contact_person');
                        if ($action == PHPGW_SQL_RUN_SQL)
                        {
                                $this->lock_table($this->person->table);
                        }
                        $this->lock_table($this->person->table);
                        $principal['per_creaton'] = $this->get_mkdate();
                        $principal['per_creatby'] = $this->get_user_id();
                        $principal['per_modon'] = $this->get_mkdate();
                        $principal['per_modby'] = $this->get_user_id();

                        $execute = 
$this->_add($principal,'person','person_id',$cid, $action);
                        $this->unlock_table();
                        //$this->finalize_add($cid);
                        return $execute;
                }

                /**
                * Add a people for a organizations
                *
                * @param array $people People id which you want to insert
                * @param integer $cid Organization id
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return SQL insert string or nothing
                */
                function add_people_for_organzation($people, $cid, 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        if(!is_array($people))
                        {
//                              echo "There is no any person to add in your 
array";
//                              This must be a critical error to stop 
everything?
//                              $GLOBALS['phpgw']->exit();
                                return;
                        }

                        foreach($people as $person)
                        {
                                $orgs = $this->has_preferred_org($person);
                                $this->relations = 
CreateObject('phpgwapi.contact_org_person');
                                $data['my_person_id'] = $person;
                                $data['my_creaton'] = $this->get_mkdate();
                                $data['my_creatby'] = $this->get_user_id();
                                if(count($orgs[0]) == 0)
                                {
                                        $data['my_preferred'] = 'Y';
                                }
                                else
                                {
                                        $data['my_preferred'] = 'N';
                                }

                                if ($action == PHPGW_SQL_RUN_SQL)
                                {
                                        
$this->lock_table($this->relations->table);
                                }
                                $sql[] = $this->_add($data,'relations', 
'my_org_id', $cid, $action);
                                $this->unlock_table();
                        }
                        return $sql;
                }

                /**
                * Add a organizations for a person
                *
                * @param array $oragnizations Organizations id which you want 
to insert
                * @param integer $preferred_org Organization id from preferred 
organization
                * @param integer $addr_id Address id from preferred organization
                * @param integer $cid Person id
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return SQL insert string or nothing
                */
                function add_orgs_for_person($organizations, $preferred_org, 
$addr_id, $cid, $action=PHPGW_SQL_RETURN_SQL)
                {
                        if(is_array($organizations))
                        {
                                foreach($organizations as $org)
                                {
                                        $this->relations = 
CreateObject('phpgwapi.contact_org_person');
                                        $data['my_org_id'] = $org;
                                        $data['my_addr_id'] = $addr_id;
                                        if ($preferred_org == $org)
                                        {
                                                $data['my_preferred'] = 'Y';
                                        }
                                        else
                                        {
                                                $data['my_preferred'] = 'N';
                                        }
                                        $data['my_creaton'] = 
$this->get_mkdate();
                                        $data['my_creatby'] = 
$this->get_user_id();
                                        if ($action == PHPGW_SQL_RUN_SQL)
                                        {
                                                
$this->lock_table($this->relations->table);
                                        }
                                        $sql[] = $this->_add($data,'relations', 
'my_person_id', $cid, $action);
                                        $this->unlock_table();
                                }
                        }
                        return $sql;
                }

                /**
                * Add a locations for a contact
                *
                * @param array $location Locations information for contact
                * @param integer $cid contact id
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return SQL insert string or nothing
                */
                function add_location($location, $cid, 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        $addr = $this->has_preferred_location($cid);
                        $this->location = CreateObject('phpgwapi.contact_addr');
                        if ($action == PHPGW_SQL_RUN_SQL)
                        {
                                $this->lock_table($this->location->table);
                        }
                        if(count($addr[0]) == 0)
                        {
                                $location['addr_preferred'] = 'Y';
                        }
                        else
                        {
                                $location['addr_preferred'] = 'N';
                        }
                        $location['addr_creatby'] = $this->get_user_id();
                        $location['addr_modby'] = $this->get_user_id();
                        $location['addr_creaton'] = $this->get_mkdate();
                        $location['addr_modon'] = $this->get_mkdate();

                        unset($location['key_addr_id']);

                        return 
$this->_add($location,'location','addr_contact_id',$cid, $action);
                }

                /**
                * Add a communications for a contact
                *
                * @param array $comm Communications information for contact
                * @param integer $cid  contact id
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return SQL insert string or nothing
                */
                function add_communication_media($comm, $cid = '', 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        $this->comm = CreateObject('phpgwapi.contact_comm');
                        if ($action == PHPGW_SQL_RUN_SQL)
                        {
                                $this->lock_table($this->comm->table);
                        }

                        $comm['comm_creatby'] = $this->get_user_id();
                        $comm['comm_modby'] = $this->get_user_id();
                        $comm['comm_creaton'] = $this->get_mkdate();
                        $comm['comm_modon'] = $this->get_mkdate();

                        unset($comm['key_comm_id']);

                        return $this->_add($comm,'comm','comm_contact_id',$cid, 
$action);
                }

                /**
                * Add a note for a contact
                *
                * @param array $note Note information for contact
                * @param integer $cid  contact id
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return SQL insert string or nothing
                */
                function add_note($note, $cid = '', 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        $this->note = CreateObject('phpgwapi.contact_note');
                        if ($action == PHPGW_SQL_RUN_SQL)
                        {
                                $this->lock_table($this->note->table);
                        }

                        $note['note_creatby'] = $this->get_user_id();
                        $note['note_modby'] = $this->get_user_id();
                        $note['note_creaton'] = $this->get_mkdate();
                        $note['note_modon'] = $this->get_mkdate();

                        unset($comm['key_note_id']);

                        return 
$this->_add($note,'note','note_contact_id',$cid,$action);
                }

                /**
                * Add a others for a contact
                *
                * @param array $others Others information for contact
                * @param integer $cid contact id
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return SQL insert string or nothing
                */
                function add_others($others, $cid='', 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        $this->others = CreateObject('phpgwapi.contact_others');
                        if ($action == PHPGW_SQL_RUN_SQL)
                        {
                                $this->lock_table($this->others->table);
                        }

                        unset($others['key_other_id']);

                        return 
$this->_add($others,'others','other_contact_id',$cid, $action);
                }


                /**
                * Delete all data of this contact_id
                *
                * @param mixed $cid The contact_id or any list of contacts_id
                * @param string $contact_type Contact type
                * @param boolean $transaction Use transaction
                * @return boolean|array Error reason strings from different 
applications
                */
                function delete($cid, $contact_type='', $transaction=True)
                {
                        // check for hooks saying "do not delete"
                        if(!is_object($GLOBALS['phpgw']->hooks) )
                        {
                                $GLOBALS['phpgw']->hooks = 
createObject('phpgwapi.hooks');
                        }
                        $hook_response= $GLOBALS['phpgw']->hooks->process(array(
                                                                'location' => 
'delete_addressbook',
                                                                'contact_id' => 
$cid )
                                                        );

                        $negative_apps=false;
                        foreach($hook_response as $application => $response)
                        {
                                if(is_array($response))
                                {
                                        if(!$response['can_delete'])
                                        {
                                                
$negative_apps[$application]=$response['reason'];
                                        }
                                }
                        }

                        if( $negative_apps )
                        {
                                $return_value = $negative_apps;
                        }
                        else
                        {
                                $type = ($contact_type)? $contact_type : 
$this->search_contact_type_id($this->get_type_contact($cid));
                                $type = ($type == $this->_contact_person) ? 
'person' : 'org';


                                if(empty($entity_keys))
                                {
                                        $entity_keys = array('contact_id',
                                                        // $type= org | person 
therefore: here goes person_id or org_id
                                                        $type.'_id',
                                                        // in addition: here 
goes my_person_id or my_org_id
                                                        'my_'.$type.'_id',
                                                        'addr_contact_id',
                                                        'note_contact_id',
                                                        'other_contact_id',
                                                        'comm_contact_id');
                                }
                                if($transaction)
                                {
                                        $this->transaction_begin();
                                }
                                foreach ($entity_keys as $key)
                                {
                                        $return_value = 
$this->_delete(sql_criteria::_equal($key, $cid), PHPGW_SQL_RUN_SQL);
                                }
                                if($transaction)
                                {
                                        $this->transaction_end();
                                }

                                if ($contact_type == $this->_contact_person)
                                {
                                        $this->finalize_delete($cid);
                                }
                        }
                        return $return_value;
                }

                /**
                * Delete principal data of this contact_id
                *
                * @param mixed $cid The contact_id or any list of contacts_id
                * @param mixed $contact_type Contact type
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL
                * @return boolean|array Error reason strings from different 
applications
                */
                function delete_contact($cid, $contact_type='', 
$action=PHPGW_SQL_RUN_SQL)
                {
                        // check for hooks saying "do not delete"
                        $hook_response= $GLOBALS['phpgw']->hooks->process(array(
                                                                'location' => 
'delete_addressbook',
                                                                'contact_id' => 
$cid )
                                                        );
                        $negative_apps=false;
                        foreach($hook_response as $application => $response)
                        {
                                if(is_array($response))
                                {
                                        if(!$response['can_delete'])
                                        {
                                                
$negative_apps[$application]=$response['reason'];
                                        }
                                }
                        }

                        if( $negative_apps )
                        {
                                $return_value = $negative_apps;
                        }
                        else
                        {
                                $type = ($contact_type)? $contact_type : 
$this->search_contact_type_id($this->get_type_contact($cid));
                                $type = ($type == $this->_contact_person) ? 
'person' : 'org';
                                if ($action == PHPGW_SQL_RUN_SQL)
                                {
                                        $this->transaction_begin();
                                }
                                $return_value[] = 
$this->_delete(sql_criteria::_equal('contact_id', $cid), $action);
                                $return_value[] = 
$this->_delete(sql_criteria::_equal($type.'_id', $cid), $action);
                                if ($action == PHPGW_SQL_RUN_SQL)
                                {
                                        $this->transaction_end();
                                }
                        }
                        return $return_value;
                }

                /**
                * Delete relations between a person and their related orgs
                *
                * @param mixed $cid The contact_id or any list of contacts_id
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL
                * @return string Delete SQL string
                */
                function delete_orgs_by_person($cid, $action=PHPGW_SQL_RUN_SQL)
                {
                        return 
$this->_delete(sql_criteria::_equal('my_person_id', $cid), $action);
                }

                /**
                * Delete relations between an org and their related person
                *
                * @param mixed $cid The contact_id or any list of contacts_id
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL
                * @return string Delete SQL string
                */
                function delete_people_by_org($cid, $action=PHPGW_SQL_RUN_SQL)
                {
                        return $this->_delete(sql_criteria::_equal('my_org_id', 
$cid), $action);
                }

                /**
                * Delete relations between an org and their related person
                *
                * @param mixed $org_id
                * @param mixed $person_id
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL
                * @return string Delete SQL string
                */
                function delete_org_person_relation($org_id, $person_id, 
$action=PHPGW_SQL_RUN_SQL)
                {
                        $relations = 
CreateObject('phpgwapi.contact_org_person');
                        $this->lock_table($relations->table);
                        $criteria = 
$relations->entity_criteria(sql_criteria::token_and(sql_criteria::_equal('my_org_id',
 $org_id),
                                                                                
        sql_criteria::_equal('my_person_id', $person_id)));
                        $sql = $relations->delete($criteria, $action);
                        $this->unlock_table();
                        return $sql;
                }

                /**
                * Delete the address information of contact.
                *
                * @param integer|array $cid contact_id or list of contact_ids
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL
                * @return string Delete SQL string
                */
                function delete_locations($cid, $action=PHPGW_SQL_RETURN_SQL)
                {
                        return 
$this->_delete(sql_criteria::_equal('addr_contact_id',$cid), $action);
                }

                /**
                * Delete the communication media for this contact.
                *
                * @param integer|array $cid contact_id or list of contact_ids
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL
                * @return string Delete SQL string
                */
                function delete_comms($cid, $action=PHPGW_SQL_RETURN_SQL)
                {
                        return 
$this->_delete(sql_criteria::_equal('comm_contact_id',$cid), $action);
                }

                /**
                * Delete the others fields for this contact.
                *
                * @param integer|array $cid contact_id or list of contact_ids
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL
                * @return string Delete SQL string
                */
                function delete_others($cid, $action=PHPGW_SQL_RETURN_SQL)
                {
                        return 
$this->_delete(sql_criteria::_equal('other_contact_id',$cid), $action);
                }

                /**
                * Delete the notes for this contact.
                *
                * @param integer|array $cid Contact_id or list of contact_ids
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL
                * @return string Delete SQL string
                */
                function delete_notes($cid, $action=PHPGW_SQL_RETURN_SQL)
                {
                        return 
$this->_delete(sql_criteria::_equal('note_contact_id',$cid), $action);
                }

                /**
                * Delete the specified communication media.
                *
                * @param integer|array $id Key of the comm media what you want
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL
                * @return string Delete SQL string
                */
                function delete_specified_comm($id, 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        return 
$this->_delete(sql_criteria::_equal('key_comm_id',$id), $action);
                }

                /**
                * Delete the specified address.
                *
                * @param integer|array $id Key of the address what you want
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL
                * @return string Delete SQL string
                */
                function delete_specified_location($id, 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        return 
$this->_delete(sql_criteria::_equal('key_addr_id',$id), $action);
                }

                /**
                * Delete the specified others field.
                *
                * @param integer|array $id Key of the other field what you want
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL
                * @return string Delete SQL string
                */
                function delete_specified_other($id, 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        return 
$this->_delete(sql_criteria::_equal('key_other_id',$id), $action);
                }

                /**
                * Delete the specified note.
                *
                * @param integer|array $id Key of the note what you want
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL
                * @return string Delete SQL string
                */
                function delete_specified_note($id, 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        return 
$this->_delete(sql_criteria::_equal('key_note_id',$id), $action);
                }

                /**
                * Delete all contacts of an owner
                *
                * @param integer $owner Ownder of contacts
                * @internal This is for the admin script deleteaccount.php
                */
                function delete_all($owner=0)
                {
                        $owner = intval($owner);
                        if ($owner)
                        {
                                $contacts = 
$this->get_contacts_by_owner($owner);
                                if(is_array($contacts))
                                {
                                        foreach ($contacts as $row)
                                        {
                                                
$this->delete($row['contact_id']);
                                        }
                                }
                        }
                }


                /**
                * This function is the wrapper for getting queries or the sql 
string
                *
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @param integer $line where this function is called, usefull 
for debug
                * @param integer $file where this function is called, usefull 
for debug
                * @return array|string Array with records or string with sql 
query
                * @access private
                */
                function get_query($action=PHPGW_SQL_RUN_SQL, $line=__LINE__, 
$file=__FILE__)
                {
                        switch($action)
                        {
                        case RETURN_RECORDS:
                        case PHPGW_SQL_RUN_SQL:
                                return $this->get_records($line, $file);
                        case PHPGW_SQL_RETURN_SQL:
                                return $this->get_sql();
                        }
                }

                /**
                * This make a common task in many functions. Get the records 
resulted by get_sql method.
                *
                * @param integer $line where this function is called, usefull 
for debug
                * @param integer $file where this function is called, usefull 
for debug
                * @return array Recordset with all records in the database.
                * @access private
                */
                function get_records($line, $file)
                {
                        $this->execute_query($this->get_sql(),$line,$file);
                        while ($this->db->next_record())
                        {
                                $record[] = $this->db->resultSet->fetchRow();
                        }
                        return $record;
                }

                /**
                * Get records from database for one field
                *
                * @param string $field Database field name
                * @param integer $line Program line number that executes this 
method
                * @param string $file File name from which this method was 
called
                * @return array Database results for given field name
                * @access private
                */
                function get_records_by_field($field, $line=__LINE__, 
$file=__FILE__)
                {
                        $this->execute_query($this->get_sql(),$line,$file);
                        while ($this->db->next_record())
                        {
                                $record[] = $this->db->f($field);
                        }
                        return $record;
                }

                /**
                * Execute SQL query string
                *
                * @param string $query SQL query string
                * @param integer $line Program line number that executes this 
method
                * @param string $file File name from which this method was 
called
                * @access private
                */
                function execute_query($query, $line=__LINE__, $file=__FILE__)
                {
                        if (is_null($this->db))
                        {
                                $this->db = &$GLOBALS['phpgw']->db;
                        }
                        $this->db->query($query, $line, $file);
                }

                /**
                * Execute a list of SQL queries
                *
                * @param array $queries List of SQL queries
                * @access private
                */
                function execute_queries($queries=array())
                {
                        if(is_array($queries))
                        {
                                foreach($queries as $query)
                                {
                                        $this->db->query($query, -1, -1);
                                }
                        }
                }


                /**
                * Retrieve all the locations of $contacts_id
                *
                * @param integer|array $contact_id The contact id that will be 
used for search his data.
                * @param array $data This is the information that want to 
retrieve, according whith phpGroupware Address Specification.
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array Asociative with id and all data that we 
requested
                */
                function get_locations($contact_id, $data, 
$action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request('contact_id');
                        $this->request($data);
                        $this->criteria(array('addr_contact_id' => 
$contact_id));
                        return $this->get_query($action,__LINE__, __FILE__);
                }

                function get_orgs_by_cat($cat_id)
                {
                        $this->request('org_id');
                        $this->request('org_name');
                        $this->criteria(array('cat_id' => $cat_id));
                        $sql = $this->get_sql();
                        $this->db->query($sql, __LINE__, __FILE__);
                        while ($this->db->next_record())
                        {
                                $orgs = &$this->db->resultSet->fetchRow();
                        }
                        return $orgs;
                }

                function get_cats_by_person($person_id)
                {
                        $this->request('cat_id');
                        $this->criteria(array('contact_id' => $person_id));
                        $cats = $this->get_records_by_field('cat_id', __LINE__, 
__FILE__);
                        
                        if($cats[0])
                        {
                                $cats_array = explode(',', $cats[0]);
                        }
                        else
                        {
                                $cats_array=array();
                        }

                        return $cats_array;
                }

                function get_cats_by_org($org_id)
                {
                        $this->request('cat_id');
                        $this->criteria(array('org_id' => $org_id));
                        $cats = $this->get_records_by_field('cat_id', __LINE__, 
__FILE__);
                        if($cats[0])
                        {
                                $cats_array = explode(',', $cats[0]);
                        }
                        else
                        {
                                $cats_array=array();
                        }
                        return $cats_array;
                }

                function get_cats($fields)
                {
                        $this->request($fields);
                        $this->db->query($this->get_sql(), __LINE__, __FILE__);
                        while ($this->db->next_record())
                        {
                                $cats[] = $this->db->resultSet->fetchRow();
                        }

                        return $cats;
                }

                function get_categories($categories)
                {
                        if (is_array($categories))
                        {
                                return count($categories) > 1 ? 
','.implode(',',$categories).',' : $categories[0];
                        }
                        else
                        {
                                return $categories;
                        }
                }

                function get_addr_by_contact($contact_id)
                {
                        $this->request('addr_address');
                        $this->criteria(array('addr_contact_id' => 
$contact_id));
                        return $this->get_query(PHPGW_SQL_RUN_SQL, __LINE__, 
__FILE__);
                }


                /**
                * Read phone number for one contact
                *
                * @param $contacts_id Contact ID
                * @deprecated
                */
                function get_phone_by_contact($contacts_id)
                {
                        $this->get_phone($contacts_id);
                }


                /**
                * Create a criteria with or and like operators for all the 
fields
                *
                * @param array $fields Database field names
                * @return string Search result
                */
                function search_by_any($fields)
                {
                        foreach($fields as $field => $value)
                        {
                                if ($value == NULL)
                                {
                                        continue;
                                }
                                if (is_array($value))
                                {
                                        if(in_array('append_or', $value) || 
in_array('append_and', $value))
                                        {
                                                $elements[] = $value;
                                        }
                                        else
                                        {
                                                $elements[] = 
sql_criteria::in($field, $value);
                                        }
                                }
                                else
                                {
                                        $elements[] = 
sql_criteria::token_has($field, $value);
                                }
                        }
                        return sql_criteria::_append_or($elements);
                }

                /**
                * Create a criteria with `and' and the corresponding operator 
of each field.
                *
                * @param array $fields Database field names
                * @return string Search result
                */
                function search_by_all($fields)
                {
                        foreach($fields as $field => $value)
                        {
                                if ($value == NULL)
                                {
                                        continue;
                                }

                                if (is_array($value))
                                {
                                        if(in_array('append_or', $value) || 
in_array('append_and', $value))
                                        {
                                                $elements[] = $value;
                                        }
                                        else
                                        {
                                                if (count($value) == 1)
                                                {
                                                        $elements[] = 
sql_criteria::_equal($field, current($value));
                                                }
                                                else
                                                {
                                                        $elements[] = 
sql_criteria::_in($field, $value);
                                                }
                                        }
                                }
                                else
                                {
                                        $elements[] = 
sql_criteria::_equal($field, $value);
                                }
                        }
                        return sql_criteria::_append_and($elements);
                }

                /**
                * Get the all contacts which are from specified owner
                *
                * @param integer $owner The owner what you can find
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return mixed SQL string or records with note_type_id and 
not_description
                */
                function get_contacts_by_owner($owner,$action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request('contact_id');
                        $this->criteria(array('owner' => $owner));
                        return $this->get_query($action,__LINE__, __FILE__);
                }

                /**
                * Retrieve Data for categories given, taking care that are 
person.
                *
                * @param mixed $categories_id
                * @param mixed $data
                * @param mixed $contact_type
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array Asociative with id and all data that we 
requested
                */
                function get_contact_by_categories($categories_id, $data, 
$contact_type, $action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request('contact_id');
                        $this->request($data);
                        if($contact_type)
                        {
                                $this->criteria(array('cat_cat_id' => 
$categories_id, 'contact_type' => $this->get_type($contact_type)));
                        }
                        else
                        {
                                $this->criteria(array('cat_cat_id' => 
$categories_id));
                        }
                        return $this->get_query($action, __LINE__, __FILE__);
                }

                /**
                * Retrieve data from the categories that the contact_id belongs
                *
                * @param mixed $person_id Contacts Id which want his categories.
                * @param mixed $data list of fields that we want retrieve
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return array|string Array with records or string with SQL 
query
                * @access private
                */
                function _get_categories($person_id, $data, 
$action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request('contact_id');
                        $this->request($data);
                        $this->criteria(array('my_person_id' => $person_id));
                        return $this->get_query($aciton, __LINE__, __FILE__);
                }

                /**
                * Decide if contact is a user or not
                *
                * @param integer $contact_id Contact id which want to check.
                * @return boolean|integer Account id or false
                */
                function is_user($contact_id)
                {
                        $account_id = 
$GLOBALS['phpgw']->accounts->search_person($contact_id);

                        if($account_id == 0)
                        {
                                return FALSE;
                        }
                        else
                        {
                                return $account_id;
                        }
                }

                function get_account_id($contact_id)
                {
                        $accounts = $GLOBALS['phpgw']->accounts->get_list();
                        foreach($accounts as $account_data)
                        {
                                if($account_data['person_id'] == $contact_id)
                                {
                                        $account_id = 
$account_data['account_id'];
                                        break;
                                }
                        }

                        return $account_id;
                }


                /**
                * Decide if the person has preferred organization
                *
                * @param integer $person_id Person id which want to check.
                * @return array|boolean False if has't preferred org or array 
with all id which has preferred org.
                */
                function has_preferred_org($person_id)
                {
                        $this->request('my_person_id');
                        $this->request('my_org_id');
                        $this->criteria(array('my_person_id' => $person_id,
                                              'my_preferred' => 'Y'));
                        $persons = $this->get_records(__LINE__, __FILE__);
                        return $persons;
                }

                /**
                * Decide if the contact has preferred location
                *
                * @param integer $contact_id Contact id which want to check.
                * @return array|boolean False if has't preferred org or array 
with all id which has preferred org.
                */
                function has_preferred_location($contact_id)
                {
                        $this->request('addr_contact_id');
                        $this->request('key_addr_id');
                        $this->criteria(array('addr_contact_id' => $contact_id,
                                              'addr_preferred' => 'Y'));
                        $locations = $this->get_records(__LINE__, __FILE__);
                        return $locations;
                }

                /**
                * Decide if contact exist
                *
                * @param integer $contact_id Contact id which want to check.
                * @return boolean TRUE if contact exist false otherwise
                */
                function exist_contact($contact_id)
                {
                        $this->request('count_contacts');
                        $this->criteria(array('contact_id' => $contact_id));
                        $contact = $this->get_records(__LINE__, __FILE__);
                        if($contact[0]['count_contacts']==0)
                        {
                                return FALSE;
                        }
                        else
                        {
                                return TRUE;
                        }
                }

                function exist_org_person_relation($org_id, $person_id)
                {
                        $this->request('my_org_id');
                        $this->request('my_person_id');
                        $this->criteria(array('my_org_id' => $org_id,
                                              'my_person_id' => $person_id));
                        
                        $contact = $this->get_records(__LINE__, __FILE__);
                        if($contact[0]['my_org_id']==0)
                        {
                                return FALSE;
                        }
                        else
                        {
                                return TRUE;
                        }                       
                }
                

                /**
                * Decide if contacts are user or not, and retrieve its data.
                *
                * If account_person_id will be null for each person that is not 
a user.
                * @param mixed $person_id Person id which want to check.
                * @param array $data the info that you want of this contact
                * @return array With person_id, account_person_id and all data 
of contacts that we wanted.
                */
                function are_users($person_id, $data='')
                {
                        if($data!='')
                        {
                                $this->request($data);
                        }
                        $this->request(array('contact_id'));
                        $this->criteria(array('contact_id' => $person_id));
                        $query = $this->get_query(PHPGW_SQL_RETURN_SQL);
                        $this->db->query($query,__LINE__, __FILE__);
                        while($this->db->next_record())
                        {
                                $contact = $this->db->resultSet->fetchRow();
                                $contact['account_id'] = 
$GLOBALS['phpgw']->accounts->search_person($contact['contact_id']);
                                $contacts[] = $contact;
                        }
                        return $contacts;
                }

                /**
                * Get the organizations from one person
                *
                * @param integer $person_id Id of the contact type person
                * @return array Asociative array with id and all data that you 
requested
                */
                function get_orgs_by_person($person_id)
                {
                        return $this->get_organizations_by_person($person_id);
                }

                /**
                * Get the all contacts which are users of phpGroupWare
                *
                * @return mixed SQL string or records with note_type_id and 
not_description
                */
                function get_contacts_which_are_users()
                {
                        return $this->get_system_contacts();
                }

                function get_person_properties()
                {
                        $person = CreateObject('phpgwapi.contact_person');
                        return $person->get_false_fields();
                }

                function get_organization_properties()
                {
                        $org = CreateObject('phpgwapi.contact_org');
                        return $org->get_false_fields();
                }

                /**
                * Get all persons of specified organization
                *
                * @param integer $org_id ID of the organization what you want
                * @return array Array with records
                */
                function get_persons_by_org($org_id)
                {
                        $this->request(array('organizations', 'person_id', 
'per_full_name', 'per_first_name', 'per_middle_name', 'per_last_name'));
                        $this->criteria(array('org_id' => $org_id));
                        return $this->get_query(PHPGW_SQL_RETURN_SQL, __LINE__, 
__FILE__);
                }

                /**
                * Search a value into an array
                *
                * @param string $field_to_search Field into what you want to 
find
                * @param string $value_to_search Value what you want
                * @param string $field Field what you want return
                * @param string $catalog Catalog name into you want to find
                * @return string The value which you requiere in $field
                */
                function search_catalog($field_to_search, $value_to_search, 
$field, $catalog)
                {
                        if(is_array($this->$catalog))
                        {
                                foreach ($this->$catalog as $key => $value)
                                {
                                        if ($value[$field_to_search] == 
$value_to_search)
                                        {
                                                return $value[$field];
                                        }
                                }
                        }
                }

                /**
                * Retrieve the criteria for index addressbook implementation.
                *
                * Could be used in others parts but thinks that it was created
                * with that propouse. This looks for the categories and for the 
acl perms.
                *
                * @param integer $owner This is the actual user of phpgroupware
                *
                * @param mixed $access This is limit the search for private only
                * (with PHPGW_CONTACTS_PRIVATE), all my 
contacts(PHPGW_CONTACTS_MINE)
                * or all the records I have access (PHPGW_CONTACTS_ALL).
                *
                * @param integer $categories if have any value then limit the 
result
                * to contacts that belongs to this categories (and childs)
                * PHPGW_CONTACTS_CATEGORIES_ALL if want not use categories 
criterias.
                *
                * @param array $search_fields This is used in search, is the<br 
/>
                * list of fields to search. Also this list is used to know if 
we<br />
                * need to set the criteria for search the prefered addresses 
for contacts.
                *
                * @param string $pattern Is the string that will be used to 
search in
                * all fields of $search_fields, set value to this param without
                * setting $search_field is useless.
                *
                * @param array $show_fields Database fields to show
                * @return string SQL string
                */
                function criteria_for_index($owner, $access=PHPGW_CONTACTS_ALL, 
$categories=PHPGW_CONTACTS_CATEGORIES_ALL, $search_fields=array(), $pattern='', 
$show_fields=array())
                {
                        if(!is_numeric($owner) || intval($owner) == 0)
                        {
                                return ;
                        }
                        switch($access)
                        {
                        case PHPGW_CONTACTS_MINE:
                                $criteria = sql_criteria::_equal('owner', 
$owner);
                                break;
                        case PHPGW_CONTACTS_PRIVATE:
                                $criteria = 
sql_criteria::token_and(sql_criteria::_equal('access', 'private'),
                                                                
sql_criteria::_equal('owner', $owner));
                                break;
                        case PHPGW_CONTACTS_ALL:
                        default:
                                $criteria = 
sql_criteria::token_or(sql_criteria::token_and(sql_criteria::_equal('access', 
'public'),
                                                                                
sql_criteria::_in('owner', $this->get_contacts_shared($owner, PHPGW_ACL_READ))),
                                                                   
sql_criteria::_equal('owner', $owner));
                        }
                        if($categories != PHPGW_CONTACTS_CATEGORIES_ALL)
                        {
                                if(!is_array($categories))
                                {
                                        $categories = array($categories);
                                }

                                $categories_array = array_merge($categories, 
$this->get_sub_cats($categories));
                                if(count($categories_array) > 0)
                                {
                                        foreach($categories_array as $cat_id)
                                        {
                                                $search_categories[] = 
sql_criteria::token_or(sql_criteria::_equal('sel_cat_id', $cat_id),
                                                                                
        sql_criteria::token_has('sel_cat_id', ','.$cat_id.','));
                                        }
                                        $categories_criteria = 
sql_criteria::_append_or($search_categories);
                                        $criteria = 
sql_criteria::token_and($criteria, $categories_criteria);
                                }
                        }

                        $location = CreateObject('phpgwapi.contact_addr');
                        $search_fields = (empty($search_fields) || 
!is_array($search_fields)) ? array() : $search_fields;
                        $show_fields = (empty($show_fields) || 
!is_array($show_fields)) ? array() : $show_fields;
                        $search_count = 
count(array_intersect($location->get_false_fields(), $search_fields));
                        $show_count = 
count(array_intersect($location->get_false_fields(), $show_fields));

                        if($search_count <= 0 && $show_count > 0)
                        {
                                $addr_preferred_criteria = 
sql_criteria::token_or(sql_criteria::_equal('addr_pref_val', 'Y'),
                                                                                
sql_criteria::_is_null('key_addr_id'));
                                $criteria = sql_criteria::token_and($criteria, 
$addr_preferred_criteria);
                        }

                        if(count($search_fields['comm_media']) > 0)
                        {
                                $search_fields_comms = 
$search_fields['comm_media'];
                        }
                        unset($search_fields['comm_media']);

                        $index = array_search('per_full_name', $search_fields);
                        if($index!==False &&  $index!==Null)
                        {
                                unset($search_fields[$index]);
                                $search_fields[] = 'per_first_name';
                                $search_fields[] = 'per_last_name';
                                $search_fields[] = 'per_middle_name';
                        }

                        if(count($search_fields) > 0 && $pattern)
                        {
                                foreach($search_fields as $field)
                                {
                                        $search_array[] = 
sql_criteria::token_has($field, $pattern);
                                }

                                $criteria = sql_criteria::token_and($criteria, 
sql_criteria::_append_or($search_array));
                        }

                        if(count($search_fields_comms) > 0 && $pattern)
                        {
                                foreach($search_fields_comms as $field)
                                {
                                        $search_array_comm[] = 
sql_criteria::token_and(sql_criteria::token_has('comm_data', $pattern),
                                                                                
       sql_criteria::_equal('comm_descr', $this->search_comm_descr($field)));
                                }
                                $criteria = sql_criteria::token_and($criteria, 
sql_criteria::_append_or($search_array_comm));
                        }
                        return $criteria;
                }

                function search($search_fields, $pattern, $data='contact_id')
                {
                        if(count($search_fields) > 0 && $pattern)
                        {
                                $index = array_search('per_full_name', 
$search_fields);
                                if($index!==False && $index!==Null)
                                {
                                        unset($search_fields[$index]);
                                        $search_fields[] = 'per_first_name';
                                        $search_fields[] = 'per_last_name';
                                        $search_fields[] = 'per_middle_name';
                                }

                                foreach($search_fields as $field)
                                {
                                        $search_array[] = 
sql_criteria::token_has($field, $pattern);
                                }
                                $criteria = 
sql_criteria::_append_or($search_array);
                        }

                        $this->request('contact_id');
                        $this->criteria_token($criteria);
                        $records = $this->get_records(__LINE__, __FILE__);
                        if(is_array($records))
                        {
                                foreach($records as $key => $value)
                                {
                                        $info[] = $value['contact_id'];
                                }
                        }
                        return $info;
                }

                function get_contacts_shared($owner_id, 
$acl_type=PHPGW_ACL_READ)
                {
                        $this->grants = 
$GLOBALS['phpgw']->acl->get_grants('addressbook');
                        if($GLOBALS['phpgw']->acl->check('addressmaster', 7, 
'addressbook'))
                        {
                                $required_grants[] = 
$GLOBALS['phpgw_info']['server']['addressmaster'];
                        }
                        foreach($this->grants as $owner => $perm)
                        {
                                if($this->check_perms($perm, $acl_type))
                                {
                                        $required_grants[] = $owner;
                                }
                        }
                        return $required_grants;
                }

                function check_perms($has, $needed)
                {
                        return (!!($has & $needed) == True);
                }

                /**
                * Check if the contact has a specified permission or if is 
addressmaster
                *
                * @param integer $contact_id The contact_id which you want to 
find
                * @param integer $needed The permission what you need
                * @param integer $owner_id The owner_id of the contact
                * @return boolean True when access is allowed otherwise false
                */
                function check_acl($contact_id, $needed, $owner_id='')
                {
                        $grants = 
$GLOBALS['phpgw']->acl->get_grants('addressbook');
                        if($owner_id=='')
                        {
                                $owner_id = 
$this->get_contact_owner($contact_id);
                        }
                        return($this->check_perms($grants[$owner_id],$needed) 
|| $GLOBALS['phpgw']->acl->check('addressmaster',7,'addressbook'));
                }

                /**
                * Check if the contact has add permissions.
                *
                * @param integer $contact_id The contact_id which you want to 
check
                * @param integer $owner_id The owner_id of the contact which 
you want to check
                * @return boolean True when when adding to this contact is 
allowed otherwise false
                */
                function check_add($contact_id, $owner_id='')
                {
                        return $this->check_acl($contact_id, PHPGW_ACL_ADD, 
$owner_id);
                }

                /**
                * Check if the contact has edit permissions.
                *
                * @param integer $contact_id The contact_id which you want to 
check
                * @param integer $owner_id The owner_id of the contact which 
you want to check
                * @return boolean True when editing this contact is allowed 
otherwise false
                */
                function check_edit($contact_id, $owner_id='')
                {
                        return $this->check_acl($contact_id, PHPGW_ACL_EDIT, 
$owner_id);
                }

                /**
                * Check if the contact has read permissions.
                *
                * @param integer $contact_id The contact_id which you want to 
check
                * @param integer $owner_id The owner_id of the contact which 
you want to check
                * @return boolean TRue when reading this contact is allowed 
otherwise false
                */
                function check_read($contact_id, $owner_id='')
                {
                        return $this->check_acl($contact_id, PHPGW_ACL_READ, 
$owner_id);
                }

                /**
                * Check if the contact has delete permissions.
                *
                * @param integer $contact_id The contact_id which you want to 
check
                * @param integer $owner_id The owner_id of the contact which 
you want to check
                * @return boolean True when deleting this contact is allowed 
otherwise false
                */
                function check_delete($contact_id, $owner_id='')
                {
                        return $this->check_acl($contact_id, PHPGW_ACL_DELETE, 
$owner_id);
                }

                /**
                * Get the owner of the contact.
                *
                * @param integer $contact_id The contact_id which you want to 
find
                * @return integer Owner of the given contact
                */
                function get_contact_owner($contact_id)
                {
                        $this->request('owner');
                        $this->criteria(array('contact_id' => $contact_id));
                        $owner = $this->get_records(__LINE__, __FILE__);
                        return $owner[0]['owner'];
                }

                /**
                * Copy all contact data to new contact
                *
                * @param integer $contact_id Id of the contact what you want to 
copy
                * @param integer $type Type Id of the contact what you want to 
copy
                * @return integer Id of the new contact
                */
                function copy_contact($contact_id, $type='')
                {
                        $type = ($contact_type)? $contact_type : 
$this->get_type_contact($contact_id);
                        $copy_type = ($this->search_contact_type_id($type) == 
$this->_contact_person) ? 'persons' : 'organizations';

                        $get_data_type= 'get_principal_' . $copy_type . '_data';

                        $principal = $this->$get_data_type($contact_id);
                        unset($principal[0]['owner']);
                        unset($principal[0]['per_full_name']);

                        $cats = explode(",", $principal[0]['cat_id']);
                        foreach($cats as $cat)
                        {
                                if($cat)
                                {
                                        $categories[] = $cat;
                                }
                        }

                        $comms = $this->get_comm_contact_data($contact_id);
                        $locations = $this->get_addr_contact_data($contact_id);
                        $others = $this->get_others_contact_data($contact_id);

                        $new_contact_id = $this->add_contact($type, 
$principal[0], $comms, $locations, $categories, $others);

                        switch($copy_type)
                        {
                        case $this->tab_main_persons:
                                
$this->copy_organizations_by_person($contact_id, $new_contact_id);
                                break;
                        case $this->tab_main_organizations:
                                
$this->copy_people_by_organizations($contact_id, $new_contact_id);
                                break;
                        }

                        return $new_contact_id;
                }

                /**
                * Copy all organizatons from person_id to new person_id
                *
                * @param integer $person_id Id of the person what you want to 
copy
                * @param integer $new_person_id Id of the new person
                */
                function copy_organizations_by_person($person_id, 
$new_person_id)
                {
                        $records = 
$this->get_organizations_by_person($person_id);
                        if(is_array($records))
                        {
                                foreach($records as $data)
                                {
                                        $this->relations = 
CreateObject('phpgwapi.contact_org_person');
                                        
$this->lock_table($this->relations->table);
                                        $data['my_creaton'] = 
$this->get_mkdate();
                                        $data['my_creatby'] = 
$this->get_user_id();
                                        $sql[] = $this->_add($data, 
'relations', 'my_person_id', $new_person_id, PHPGW_SQL_RUN_SQL);
                                        $this->unlock_table();
                                }
                        }
                }

                /**
                * Copy all persons from org_id to new org_id
                *
                * @param integer $organization_id Id of the organization what 
you want to copy
                * @param integer $new_organization_id Id of the new organization
                */
                function copy_people_by_organizations($organization_id, 
$new_organization_id)
                {
                        $records = 
$this->get_people_by_organizations($organization_id);
                        
                        if(is_array($records))
                        {
                                foreach($records as $data)
                                {                                       
                                        
if(!$this->exist_org_person_relation($new_organization_id, 
$data['my_person_id']))
                                        {
                                                $this->relations = 
CreateObject('phpgwapi.contact_org_person');
                                                
$this->lock_table($this->relations->table);
                                                $data['my_creaton'] = 
$this->get_mkdate();
                                                $data['my_creatby'] = 
$this->get_user_id();
                                                $sql[] = 
$this->_add($data,'relations', 'my_org_id', $new_organization_id, 
PHPGW_SQL_RUN_SQL);
                                                $this->unlock_table();
                                        }
                                }
                        }
                }

                /**
                * Create insert SQL statement to insert data from object
                *
                * @param mixed $data Data
                * @param mixed $object Object
                * @param string $key_field Key for associatove array
                * @param integer $cid Value for key
                * @param mixed $action Unknown
                * @return string Insert SQL string or nothing
                * @access private
                */
                function _add($data, $object, $key_field, $cid = '', 
$action=PHPGW_SQL_RETURN_SQL)
                {
                        // If dont get the $cid, then I hope is in $data array.
                        $this->ldebug('_add', array('object' => $object, 'cid' 
=> $cid, 'data' => $data ));
                        $cid = ($cid)? $cid : $data[$key_field];
                        // Do nothing without contact
                        if (empty($cid))
                        {
                                $this->abort($this->$object->table);
                        }
                        else
                        {
                                $data[$key_field] = $cid;
                                return $this->$object->insert($data, $action);
                        }
                }

                /**
                * Display the correct translation for the field
                *
                * @param string $field The field what you want
                * @return string Translated field name for display
                */
                function display_name($field)
                {
                        if($this->contact_fields['showable'])
                        {
                                return 
$GLOBALS['phpgw']->lang($this->contact_fields['showable'][$field]);
                        }
                        if($this->contact_fields['retreivable'])
                        {
                                return 
$GLOBALS['phpgw']->lang($this->contact_fields['retrievable'][$field]);
                        }
                        if($this->contact_fields['catalogs'])
                        {
                                return 
$GLOBALS['phpgw']->lang($this->contact_fields['catalogs'][$field]);
                        }
                }

                /**
                * Begin a Transaction to database.
                *
                * @internal Create database object if necesary
                * @access private
                */
                function transaction_begin()
                {
                        if (is_null($this->db))
                        {
                                $this->db = &$GLOBALS['phpgw']->db;
                        }
                        if (!$this->trans)
                        {
                                $this->db->transaction_begin();
                                $this->trans = TRUE;
                        }
                }

                /**
                * End actual Transaction
                *
                * @access private
                */
                function transaction_end()
                {
                        if (!is_null($this->db))
                        {
                                $this->db->transaction_commit();
                                $this->trans = FALSE;
                        }
                }

                function last_id($entity, $field)
                {
                        return 
$this->db->get_last_insert_id($this->$entity->table, 
$this->$entity->real_field($field));
                }

                function lock_table($table, $action=PHPGW_SQL_RUN_SQL)
                {
                        if (!($this->locked[$table]) && $action == 
PHPGW_SQL_RUN_SQL)
                        {
                                $this->db->lock($table);
                                $this->locked[$table] = TRUE;
                        }
                }

                /**
                * Unlock database table
                *
                * @access private
                */
                function unlock_table()
                {
                        $this->ldebug('unlock_table', array($this->locked), 
'dump');
                        if(count($this->locked))
                        {
                                $this->ldebug('unlock_table', array('count' => 
count($this->locked)));
                                $this->db->unlock();
                                $this->locked = NULL;
                        }
                }

                /**
                * Unknown
                *
                * @param array $fields Database field names
                * @param string $data_type Unknown
                * @return array Array with 'comms','locations' and 'others'
                * @access private
                */
                function slice_old_fields($fields, $data_type)
                {
                        foreach ($comm_old as $old_field => $value)
                        {
                                if($fields[$old_field])
                                {
                                        if($fields['tel_pref'] == $old_field)
                                        {
                                                $comms[] = array($old_field     
=> $value,
                                                                'comm_descr'    
=> $this->search_comm_id($this->comm_old[$old_field][0]),
                                                                
'comm_preferred'=> $old_field);
                                                unset($fields['tel_pref']);
                                        }
                                        else
                                        {
                                                $comms[] = array($old_field => 
$value, 'comm_descr' => $this->search_comm_id($this->comm_old[$old_field][0]));
                                        }
                                        unset($fields[$old_field]);
                                }
                        }
                        foreach ($this->adr_old[0] as $old_field)
                        {
                                $location[0][$old_field] = $fields[$old_field];
                                unset($fields[$old_field]);
                        }
                        foreach ($this->adr_old[1] as $old_field)
                        {
                                $location[1][$old_field] = $fields[$old_field];
                                unset($fields[$old_field]);
                        }
                        $new_fields = $this->split_stock_and_extras($fields);
                        if(count($new_fields[0]) > 0)
                        {
                                // This fields are send to /dev/null
                                // There is no need of they?
                                // _debug_array($new_fields[0]);
                        }
                        foreach ($new_fields[2] as $field => $value)
                        {
                                $others[] = array('other_name' => $field, 
'other_value' => $value);
                        }
                        return array('comms' => $comms, 'locations' => 
$location, 'others' => $others);
                }

                function is_contact($account_id)
                {
                        $account = 
$GLOBALS['phpgw']->accounts->get_account_data($account_id);
                        if(empty($account[$account_id]['person_id']))
                        {
                                return False;
                        }
                        return $account[$account_id]['person_id'];
                }

                /**
                * Get the contact_type for contact_id.
                *
                * @param integer $contact_id  Contact id which want to check.
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return integer The contact_type_id.
                */
                function get_type_contact($contact_id, 
$action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request(array('contact_type'));
                        $this->criteria(array('contact_id' => $contact_id));
                        $type =  $this->get_query($action, __LINE__, __FILE__);
                        return $type[0]['contact_type'];
                }

                /**
                * Get the preferred address of organization.
                *
                * @param integer $org_id  The organization id which want to 
check.
                * @param integer $action PHPGW_SQL_RETURN_SQL | 
PHPGW_SQL_RUN_SQL depending what we want
                * @return integer The addr_id.
                */
                function get_location_pref_org($org_id, 
$action=PHPGW_SQL_RUN_SQL)
                {
                        $this->request(array('key_addr_id'));
                        $this->criteria(array('org_id' => $org_id,
                                              'addr_pref_val'=>'Y'));
                        $addr_id =  $this->get_query($action, __LINE__, 
__FILE__);
                        return $addr_id[0]['key_addr_id'];
                }

                function get_mkdate()
                {
                        $date =  mktime();
                        return $date;
                }

                function get_user_id()
                {
                        return $GLOBALS['phpgw_info']['user']['account_id'];
                }

                function finalize_add($id)
                {
                        $this->finalize_edit($id);
                }

                function finalize_edit($id)
                {
                        if ($this->LDAPSyncEnabled)
                        {
                                $this->LDAPSync($id);
                        }
                }

                function finalize_delete($id)
                {
                        if ($this->LDAPSyncEnabled)
                        {
                                $this->LDAPSyncDelete($id);
                        }
                }

                function LDAPSyncDelete($id)
                {
                        $result = ldap_search($this->LDAPResource, 
$GLOBALS['phpgw_info']['server']['ldap_contact_context'], 
'employeeNumber='.$id, array('dn'));
                        $count = ldap_get_entries($this->LDAPResource, $result);
                        if ((int)$count['count'] > 0)
                        {
                                
ldap_delete($this->LDAPResource,$count[0]['dn']);
                        }
                }

                function LDAPSync($id)
                {
                        $this->LDAPSyncDelete($id);

                        $person = $this->get_principal_persons_data($id);

                        $time = gettimeofday();
                        $uid = 
$person[0]['contact_id'].':'.$person[0]['per_full_name'];
                        $dn = 'uid=' . utf8_encode($uid).',' . 
$GLOBALS['phpgw_info']['server']['ldap_contact_context'];

                        /* Requerid attributes */
                        $attributes['objectClass'][] = 'person';
                        $attributes['objectClass'][] = 'organizationalPerson';
                        $attributes['objectClass'][] = 'inetOrgPerson';
                        $attributes['cn'][]          = 
utf8_encode($person[0]['per_full_name']) ? 
utf8_encode($person[0]['per_full_name']) : ' ';
                        $attributes['sn'][]          = 
utf8_encode($person[0]['per_last_name']) ? 
utf8_encode($person[0]['per_last_name']) : ' ';
                        /* Optional attributes */
                        $attributes['uid'][]         = utf8_encode($uid);
                        if($person[0]['org_name'])
                        {
                                $attributes['o'][]         = 
utf8_encode($person[0]['org_name']);
                        }
                        if($person[0]['per_title'])
                        {
                                $attributes['title'][]     = 
utf8_encode($person[0]['per_title']);
                        }
                        if($person[0]['per_first_name'])
                        {
                                $attributes['givenName'][] = 
utf8_encode($person[0]['per_first_name']);
                        }
                        /*if($person[0]['per_last_name'])
                        {
                        }*/
                        if($person[0]['per_initials'])
                        {
                                $attributes['initials'][]       = 
utf8_encode($person[0]['per_initials']);
                        }
                        if($person[0]['per_department'])
                        {
                                $attributes['ou'][]       = 
utf8_encode($person[0]['per_department']);
                        }
                        if($person[0]['contact_id'])
                        {
                                $attributes['employeeNumber'][] = 
utf8_encode($person[0]['contact_id']);
                        }
                        unset($person);

                        $address_pref = $this->get_addr_contact_data($id, 
array('addr_pref_val'=>'Y'));

                        if($address_pref[0]['addr_add1'] || 
$address_pref[0]['addr_add2'] || $address_pref[0]['addr_add3'])
                        {
                                $attributes['street'][]                         
= utf8_encode($address_pref[0]['addr_add1'] .
                                                                                
              $address_pref[0]['addr_add2'] .
                                                                                
              $address_pref[0]['addr_add3']);
                                $attributes['postalAddress'][]                  
= utf8_encode($address_pref[0]['addr_add1'] .
                                                                                
              $address_pref[0]['addr_add2'] .
                                                                                
              $address_pref[0]['addr_add3']);
                        }

                        if($address_pref[0]['addr_state'])
                        {
                                $attributes['st'][]         = 
utf8_encode($address_pref[0]['addr_state']);
                        }
                        if($address_pref[0]['addr_postal_code'])
                        {
                                $attributes['postalCode'][] = 
utf8_encode($address_pref[0]['addr_postal_code']);
                        }
                        if($address_pref[0]['addr_city'])
                        {
                                $attributes['l'][]          = 
utf8_encode($address_pref[0]['addr_city']);
                        }
                        //$attributes['homePostalAddress'][]            = ''; 
//we can use the address with type home
                        unset($address_pref);

                        $db2LDAP_map['home email']          = 'mail';
                        $db2LDAP_map['work email']          = 'mail';
                        $db2LDAP_map['home phone']          = 'homePhone';
                        $db2LDAP_map['work phone']          = 'telephoneNumber';
                        $db2LDAP_map['pager']               = 'pager';
                        $db2LDAP_map['isdn']                = 
'internationaliSDNNumber';
                        $db2LDAP_map['home fax']            = 
'facsimileTelephoneNumber';
                        $db2LDAP_map['work fax']            = 
'facsimileTelephoneNumber';
                        $db2LDAP_map['mobile (cell) phone'] = 'mobile';
                        $db2LDAP_map['car phone']           = 'telephoneNumber';
                        $db2LDAP_map['website']             = 'labeledURI';

                        $comms = $this->get_comm_contact_data($id, '');
                        $validator = CreateObject('phpgwapi.validator');
                        for ($i=0; $i < count($comms); $i++)
                        {
                                $key = 
$db2LDAP_map[$comms[$i]['comm_description']];
                                if ($comms[$i]['comm_data'] && $key)
                                {
                                        $write = true;
                                        switch($key)
                                        {
                                                case 'mail':
                                                $write = 
$validator->is_email($comms[$i]['comm_data']);
                                                break;
                                        }

                                        if($write)
                                        {
                                                if 
($comms[$i]['comm_preferred'] == 'Y' && count($attributes[$key]) > 0)
                                                {
                                                        
array_unshift($attributes[$key], utf8_encode($comms[$i]['comm_data']));
                                                }
                                                else
                                                {
                                                        $attributes[$key][] = 
utf8_encode($comms[$i]['comm_data']);
                                                }
                                        }
                                }
                        }

                        $success = @ldap_add($this->LDAPResource, $dn, 
$attributes);
                        if (!$success)
                        {
                                echo 'ldap_add FAILED: [' . 
ldap_errno($this->LDAPResource) . '] ' . ldap_error($this->LDAPResource).'<br 
/><br />';
                                echo "<strong>Adds: ".$dn."</strong><br />";
                                echo "<pre>";
                                print_r($attributes);
                                echo "</pre>";
                                echo "<br />";
                        }
                }

                /**
                * Method that could be used to import fields from an array with 
the specified form.
                *
                * This is the only one method that provide the fullfill fields 
for contact.
                * @param array $fields Field names to import
                * @param string $type Type of given communications
                * @param boolean $update True: update existing entry; False: 
overwrite
                * @return integer New contact ID or -1 on error
                */
                function contact_import($fields, $type = '', $update=false)
                {
                        $type = empty($type) ? 
$this->search_contact_type($this->_contact_person) : $type;
                        if((isset($fields['first_name']) && 
!isset($fields['org_name'])) || $type)
                        {
                                $contact['contact_id']        = 
isset($fields['contact_id'])        ? $fields['contact_id']        : '';
                                $contact['access']            = 
isset($fields['access'])            ? $fields['access']            : '';
                                $contact['owner']             = 
isset($fields['owner'])             ? $fields['owner']             : 
$GLOBALS['phpgw_info']['user']['account_id'];
                                $contact['per_first_name']    = 
isset($fields['first_name'])        ? $fields['first_name']        : '';
                                $contact['per_last_name']     = 
isset($fields['last_name'])         ? $fields['last_name']         : '';
                                $contact['per_middle_name']   = 
isset($fields['middle_name'])       ? $fields['middle_name']       : '';
                                $contact['per_suffix']        = 
isset($fields['suffix'])            ? $fields['suffix']            : '';
                                $contact['per_prefix']        = 
isset($fields['prefix'])            ? $fields['prefix']            : '';
                                $contact['per_birthday']      = 
isset($fields['birthday'])          ? $fields['birthday']          : '';
                                $contact['per_pubkey']        = 
isset($fields['pubkey'])            ? $fields['pubkey']            : '';
                                $contact['per_title']         = 
isset($fields['title'])             ? $fields['title']             : '';
                                $contact['per_department']    = 
isset($fields['department'])        ? $fields['department']        : '';
                                $contact['per_initials']      = 
isset($fields['initials'])          ? $fields['initials']          : '';
                                $contact['per_sound']         = 
isset($fields['sound'])             ? $fields['sound']             : '';
                                $contact['per_active']        = 
isset($fields['active'])            ? $fields['active']            : '';
                                $contact['preferred_org']     = 
isset($fields['preferred_org'])     ? $fields['preferred_org']     : '';
                                $contact['preferred_address'] = 
isset($fields['preferred_address']) ? $fields['preferred_address'] : '';
                                $contact['relations']         = 
isset($fields['organizations'])     ? $fields['organizations']     : array();

                                if ($contact['preferred_org'] != '')
                                {
                                        $this->request(array('contact_id'));
                                        $this->criteria(array('org_name' => 
$contact['preferred_org']));
                                        $result = 
$this->get_query(PHPGW_SQL_RUN_SQL, __LINE__, __FILE__);
                                        if ($result && isset($result[0]))
                                        {
                                                $contact['relations'][] = 
$result[0]['contact_id'];
                                        }
                                }

                                unset(  $fields['contact_id'],
                                        $fields['first_name'],
                                        $fields['last_name'],
                                        $fields['middle_name'],
                                        $fields['suffix'],
                                        $fields['prefix'],
                                        $fields['birthday'],
                                        $fields['pubkey'],
                                        $fields['title'],
                                        $fields['department'],
                                        $fields['initials'],
                                        $fields['sound'],
                                        $fields['active'],
                                        $fields['preferred_org'],
                                        $fields['preferred_address'],
                                        $fields['organizations'],
                                        $fields['access'],
                                        $fields['full_name'],
                                        $fields['owner'],
                                        $fields['createon'],
                                        $fields['createby'],
                                        $fields['modon'],
                                        $fields['modby'],
                                        $fields['account_id'],
                                        $fields['org_name']);
                        }
                        else
                        {
                                $contact['org_name']   = 
isset($fields['org_name']) ? $fields['org_name'] : '';
                                $contact['org_active'] = 
isset($fields['active'])   ? $fields['active']   : '';
                                $contact['org_parent'] = 
isset($fields['parent'])   ? $fields['parent']   : '';
                                $contact['relations']  = 
isset($fields['people'])   ? $fields['people']   : '';

                                unset(  $fields['org_name'],
                                        $fields['active'],
                                        $fields['parent'],
                                        $fields['people']);
                        }

                        $contact['categories'] = isset($fields['categories']) ? 
$fields['categories'] : '';
                        unset($fields['categories'], $fields['access']);

                        // Locations info
                        $locations = array();
                        if(is_array($fields['locations']))
                        {
                                foreach($fields['locations'] as $location_input)
                                {
                                        // Go for a _good_ address type
                                        $addr_type = 
$this->search_location_type($location_input['type']);
                                        if(!empty($addr_type))
                                        {
                                                $location['addr_type'] = 
$addr_type;
                                        }
                                        else
                                        {
                                                $addr_type = 
$this->search_location_type('work');
                                                if(!empty($addr_type))
                                                {
                                                        $location['addr_type'] 
= $addr_type;
                                                }
                                                else
                                                {
                                                        //return 
PHPGW_CONTACTS_ERROR_LOCATION_TYPE_MISSING;
                                                        return -1;
                                                }
                                        }
                                        $location['addr_add1']        = 
isset($location_input['add1'])        ? $location_input['add1']        : '';
                                        $location['addr_add2']        = 
isset($location_input['add2'])        ? $location_input['add2']        : '';
                                        $location['addr_add3']        = 
isset($location_input['add3'])        ? $location_input['add3']        : '';
                                        $location['addr_city']        = 
isset($location_input['city'])        ? $location_input['city']        : '';
                                        $location['addr_state']       = 
isset($location_input['state'])       ? $location_input['state']       : '';
                                        $location['addr_postal_code'] = 
isset($location_input['postal_code']) ? $location_input['postal_code'] : '';
                                        $location['addr_country']     = 
isset($location_input['country'])     ? $location_input['country']     : '';
                                        $location['addr_preferred']   = 
isset($location_input['preferred'])   ? $location_input['preferred']   : '';
                                        $locations[] = $location;
                                }
                        }
                        unset($fields['locations']);

                        // Notes
                        $notes = array();
                        if(is_array($fields['notes']))
                        {
                                if(isset($fields['notes']['type']) && 
isset($fields['notes']['note']))
                                {
                                        $fields['notes'] = 
array($fields['notes']);
                                }

                                foreach($fields['notes'] as $note_input)
                                {
                                        $note_type = 
$this->search_note_type($note_input['type']);
                                        if(!empty($note_type))
                                        {
                                                $note['note_type'] = $note_type;
                                        }
                                        else
                                        {
                                                // FIXME: what is the default 
value for note_type?
                                                $note_type = 
$this->search_note_type('general');
                                                if(!empty($note_type))
                                                {
                                                        $note['note_type'] = 
$note_type;
                                                }
                                                else
                                                {
                                                        //return 
PHPGW_CONTACTS_ERROR_NOTE_TYPE_MISSING;
                                                        return -1;
                                                }
                                        }
                                        $note['note_text'] = 
$note_input['note'];
                                        $notes[] = $note;
                                }
                        }
                        unset($fields['notes']);

                        // Communcation media fields
                        $comm_media = array();
                        if(is_array($fields['comm_media']))
                        {
                                foreach($fields['comm_media'] as 
$description_input => $comm_input)
                                {
                                        $description_id = 
$this->search_comm_descr($description_input);
                                        if(!empty($description_id))
                                        {
                                                $comm['comm_descr']     = 
$description_id;
                                                $comm['comm_data']      = 
$comm_input;
                                                $comm_media[]           = $comm;
                                        }
                                        else
                                        {
                                                // Promote to others
                                                $fields[$description_input] = 
$comm_input;
                                        }
                                }
                        }
                        unset($fields['comm_media']);

                        // Other fields
                        $others=array();
                        if(count($fields) > 0)
                        {
                                foreach($fields as $field_name => $field_value)
                                {
                                        $other['other_name']    = $field_name;
                                        $other['other_value']   = $field_value;
                                        $other['other_owner']   = 
$GLOBALS['phpgw_info']['user']['account_id'];
                                        $others[]               = $other;
                                }
                        }

                        if (($update == true) && (isset($contact['contact_id']) 
== true))
                        {
                                $cid = $contact['contact_id'];
                                $ret = array();
                                $ret['contact_id'] = $cid;
                                
                                $this->edit_contact($cid, $contact, 
PHPGW_SQL_RUN_SQL);
                                if ($GLOBALS['phpgw']->db->adodb->ErrorMsg())
                                        $ret['edit_contact'] = false;
                                else
                                        $ret['edit_contact'] = true;

                                $this->edit_person($cid, $contact, 
PHPGW_SQL_RUN_SQL);
                                if ($GLOBALS['phpgw']->db->adodb->ErrorMsg())
                                        $ret['edit_person'] = false;
                                else
                                        $ret['edit_person'] = true;


                                // update comm media data
                                if(is_array($comm_media) && (count($comm_media) 
> 0))
                                {
                                        $ret_comm = array();
                                        $ret['comm'] =& $ret_comm;
                                
                                        $old_comms_media = 
$this->get_comm_contact_data($cid);
                                        if(is_array($old_comms_media) && 
(count($old_comms_media) > 0))
                                        {
                                                foreach($old_comms_media as 
$old_comm)
                                                {
                                                        $key_comm_id = 
$old_comm['key_comm_id'];
                                                        
$ret_comm['key_comm_id'][] = $key_comm_id;
                                                        $is_edited = false;
                                                        
                                                        reset($comm_media);
                                                        while(list($key,$comm) 
= each($comm_media))
                                                        {
                                                                
if($comm['comm_descr'] == $old_comm['comm_descr'])
                                                                {
                                                                        // 
replace old comm data
                                                                        
$this->edit_comms($key_comm_id, $comm, PHPGW_SQL_RUN_SQL);
                                                                        if 
($GLOBALS['phpgw']->db->adodb->ErrorMsg())
                                                                                
$ret_comm['edit_comms'][$key_comm_id] = false;
                                                                        else
                                                                                
$ret_comm['edit_comms'][$key_comm_id] = true;
                                                                        // 
unset comm array
                                                                        
unset($comm_media[$key]);
                                                                        
$is_edited = true;
                                                                        break;
                                                                }
                                                        }
        
                                                        // if old entry was not 
set by new data (edited), delete them
                                                        if($is_edited == false)
                                                        {
                                                                // delete old 
comm data
                                                                
$this->delete_specified_comm($key_comm_id, PHPGW_SQL_RUN_SQL);
                                                                if 
($GLOBALS['phpgw']->db->adodb->ErrorMsg())
                                                                        
$ret_comm[$key_comm_id]['delete_specified_comm'] = false;
                                                                else
                                                                        
$ret_comm[$key_comm_id]['delete_specified_comm'] = true;
                                                        }
                                                }
                                        }
                                        // add new comms (rest of the comms 
array)
                                        foreach($comm_media as $comm)
                                        {
                                                
$this->add_communication_media($comm, $cid, PHPGW_SQL_RUN_SQL);
                                                $this->unlock_table();
                                                if 
($GLOBALS['phpgw']->db->adodb->ErrorMsg())
                                                        
$ret_comm['add_communication_media'][] = false;
                                                else
                                                        
$ret_comm['add_communication_media'][] = true;
                                        }
                                }

                                // update location data (delete old and add new 
locs)
                                $ret_loc = array();
                                $ret['loc'] =& $ret_loc;
                                $old_locations = 
$this->get_addr_contact_data($cid);
                                if(is_array($old_locations) && 
(count($old_locations) > 0))
                                {
                                        // 1. delete old locs
                                        $this->delete_locations($cid);
                                        if 
($GLOBALS['phpgw']->db->adodb->ErrorMsg())
                                                $ret_loc['delete_locations'] = 
false;
                                        else
                                                $ret_loc['delete_locations'] = 
true;
                                }
                                // 2. add new locs
                                if(is_array($locations) && (count($locations) > 
0))
                                {
                                        foreach($locations as $loc)
                                        {
                                                $this->add_location($loc, $cid, 
PHPGW_SQL_RUN_SQL);
                                                $this->unlock_table();
                                                if 
($GLOBALS['phpgw']->db->adodb->ErrorMsg())
                                                        
$ret_loc['add_location'][] = false;
                                                else
                                                        
$ret_loc['add_location'][] = true;
                                        }
                                }                                       

                                // todo: updare $contact['relations'] ???


                                // update other data (delete old and add new 
others)
                                $ret_other = array();
                                $ret['other'] =& $ret_other;
                                $old_others = 
$this->get_others_contact_data($cid);
                                if(is_array($old_others) && (count($old_others) 
> 0))
                                {
                                        $ret['other'] = $old_others;
                                        // 1. delete old others
                                        $this->delete_others($cid);
                                        if 
($GLOBALS['phpgw']->db->adodb->ErrorMsg())
                                                $ret_other['delete_others'] = 
false;
                                        else
                                                $ret_other['delete_others'] = 
true;
                                }
                                // 2. add new others
                                if(is_array($others) && (count($others) > 0))
                                {
                                        foreach($others as $other)
                                        {
                                                $this->add_others($other, $cid, 
PHPGW_SQL_RUN_SQL);
                                                $this->unlock_table();
                                                if 
($GLOBALS['phpgw']->db->adodb->ErrorMsg())
                                                        
$ret_other['add_other'][] = false;
                                                else
                                                        
$ret_other['add_other'][] = true;
                                        }
                                }                                       

                                return $ret;
                        }
                        else
                        {
                                return $this->add_contact($type, $contact, 
$comm_media, $locations, $contact['categories'], $others, 
$contact['relations'], $notes);
                        }
                }
        }
?>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]