<?php
/***************************************************************************\
* eGroupWare - FeLaMiMail                                                   *
* http://www.linux-at-work.de                                               *
* http://www.phpgw.de                                                       *
* http://www.egroupware.org                                                 *
* Written by : Lars Kneschke [lkneschke@linux-at-work.de]                   *
* -------------------------------------------------                         *
* This program is free software; you can redistribute it and/or modify it   *
* under the terms of the GNU General Public License as published by the     *
* Free Software Foundation; either version 2 of the License, or (at your    *
* option) any later version.                                                *
\***************************************************************************/

/* $Id$ */

class ajax_contacts {
	function ajax_contacts() {
		$GLOBALS['egw']->session->commit_session();
		$this->charset	= $GLOBALS['egw']->translation->charset();
	}
	
	function decodeFolderName($_folderName) {
		$folderName = translation::convert(html_entity_decode($_folderName, ENT_QUOTES, $this->charset),'UTF7-IMAP', $this->charset);
		$response = new xajaxResponse();
		$response->addScript("decodedFolder ='".$folderName."'");
		return $response->getXML();
	}

	function searchAddress($_searchString) {
		if ($GLOBALS['egw_info']['user']['apps']['addressbook']) {
			if (method_exists($GLOBALS['egw']->contacts,'search')) {
				// 1.3+
				$showAccounts = true;
				//error_log(__METHOD__.__LINE__.$_searchString);
				$seStAr = explode(' ',$_searchString);
				foreach ($seStAr as $k => $v) if (strlen($v)<3) unset($seStAr[$k]);
				$_searchString = trim(implode(' AND ',$seStAr));
				//error_log(__METHOD__.__LINE__.$_searchString);
				if ($GLOBALS['egw_info']['user']['preferences']['addressbook']['hide_accounts']) $showAccounts=false;
				$filter = ($showAccounts?array():array('account_id' => null));
				$filter['cols_to_search']=array('n_prefix','n_given','n_family','org_name','email','email_home');
				$contacts = $GLOBALS['egw']->contacts->search(implode(' +',$seStAr),array('n_fn','n_prefix','n_given','n_family','org_name','email','email_home'),'n_fn','','%',false,'OR',array(0,100),$filter);
				// additionally search the accounts, if the contact storage is not the account storage
				if ($showAccounts &&
					$GLOBALS['egw_info']['server']['account_repository'] == 'ldap' &&
					$GLOBALS['egw_info']['server']['contact_repository'] == 'sql')
				{
					$accounts = $GLOBALS['egw']->contacts->search(array(
						'n_prefix'       => $_searchString,
						'n_given'       => $_searchString,
						'n_family'       => $_searchString,
						'org_name'       => $_searchString,
						'email'      => $_searchString,
						'email_home' => $_searchString,
					),array('n_fn','n_prefix','n_given','n_family','org_name','email','email_home'),'n_fn','','%',false,'OR',array(0,100),array('owner' => 0));
					
					if ($contacts && $accounts)
					{
						$contacts = array_merge($contacts,$accounts);
						usort($contacts,create_function('$a,$b','return strcasecmp($a["n_fn"],$b["n_fn"]);'));
					}
					elseif($accounts)
					{
						$contacts =& $accounts;
					}
					unset($accounts);
				}
			} else {
				// < 1.3
				$contacts = $GLOBALS['egw']->contacts->read(0,20,array(
					'fn' => 1,
					'email' => 1,
					'email_home' => 1,
				), $_searchString, 'tid=n', '', 'fn');
			}
		}
		$response = new xajaxResponse();

		if(is_array($contacts)) {
			$innerHTML	= '';
			$jsArray	= array();
			$i		= 0;
			
			foreach($contacts as $contact) {
				foreach(array($contact['email'],$contact['email_home']) as $email) {
					// avoid wrong addresses, if an rfc822 encoded address is in addressbook
					$email = preg_replace("/(^.*<)([a-zA-Z0-9_\-]+@[a-zA-Z0-9_\-\.]+)(.*)/",'$2',$email);
					if (method_exists($GLOBALS['egw']->contacts,'search'))
					{
						$contact['n_fn']='';
						if (!empty($contact['n_prefix'])) $contact['n_fn'] = $contact['n_prefix'];
						if (!empty($contact['n_given'])) $contact['n_fn'] .= ($contact['n_fn']?' ':'').$contact['n_given'];
						if (!empty($contact['n_family'])) $contact['n_fn'] .= ($contact['n_fn']?' ':'').$contact['n_family'];
						if (!empty($contact['org_name'])) $contact['n_fn'] .= ($contact['n_fn']?' ':'').'('.$contact['org_name'].')';
						$contact['n_fn'] = str_replace(array(',','@'),' ',$contact['n_fn']);
					}
					else
					{
						$contact['n_fn'] = str_replace(array(',','@'),' ',$contact['n_fn']);
					}
					$completeMailString = addslashes(trim($contact['n_fn'] ? $contact['n_fn'] : $contact['fn']) .' <'. trim($email) .'>');
					if(!empty($email) && in_array($completeMailString ,$jsArray) === false) {
						$i++;
						$str = $GLOBALS['egw']->translation->convert(trim($contact['n_fn'] ? $contact['n_fn'] : $contact['fn']) .' <'. trim($email) .'>', $this->charset, 'utf-8');
						#$innerHTML .= '<div class="inactiveResultRow" onclick="selectSuggestion('. $i .')">'.
						$innerHTML .= '<div class="inactiveResultRow" onmousedown="keypressed(13,1)" onmouseover="selectSuggestion('.($i-1).')">'.
							htmlentities($str, ENT_QUOTES, 'utf-8') .'</div>';
						$jsArray[$i] = $completeMailString;
					}
					if ($i > 10) break;	// we check for # of results here, as we might have empty email addresses
				}
			}

			if($jsArray) {
				$response->addAssign('resultBox', 'innerHTML', $innerHTML);
				$response->addScript('results = new Array("'.implode('","',$jsArray).'");');
				$response->addScript('displayResultBox();');
			}
			//$response->addScript("getResults();");
			//$response->addScript("selectSuggestion(-1);");
		} else {
			$response->addAssign('resultBox', 'className', 'resultBoxHidden');
		}

		return $response->getXML();
	}
}