True, 'compose' => True, 'composeFromDraft' => True, 'getAttachment' => True, 'fileSelector' => True, 'forward' => True, 'composeAsNew' => True, 'composeAsForward'=> True, 'reply' => True, 'replyAll' => True, 'selectFolder' => True, ); var $destinations = array( 'to' => 'to', 'cc' => 'cc', 'bcc' => 'bcc', 'replyto' => 'replyto', 'folder' => 'folder' ); /** * Instance of bofelamimail * * @var bofelamimail */ var $bofelamimail; /** * Instance of bocompose * * @var bocompose */ var $bocompose; /** * Active preferences, reference to $this->bofelamimail->mailPreferences * * @var array */ var $mailPreferences; /** * Instance of Template class * * @var Template */ var $t; function uicompose() { $this->displayCharset = $GLOBALS['egw']->translation->charset(); if (!isset($_POST['composeid']) && !isset($_GET['composeid'])) { // create new compose session $this->bocompose = CreateObject('felamimail.bocompose','',$this->displayCharset); $this->composeID = $this->bocompose->getComposeID(); } else { // reuse existing compose session if (isset($_POST['composeid'])) $this->composeID = $_POST['composeid']; else $this->composeID = $_GET['composeid']; $this->bocompose = CreateObject('felamimail.bocompose',$this->composeID,$this->displayCharset); } $this->t = CreateObject('phpgwapi.Template',EGW_APP_TPL); $this->bofelamimail =& $this->bocompose->bofelamimail; $this->mailPreferences =& $this->bofelamimail->mailPreferences; $this->t->set_unknowns('remove'); $this->rowColor[0] = $GLOBALS['egw_info']["theme"]["bg01"]; $this->rowColor[1] = $GLOBALS['egw_info']["theme"]["bg02"]; } function unhtmlentities ($string) { $trans_tbl = get_html_translation_table (HTML_ENTITIES); $trans_tbl = array_flip ($trans_tbl); return strtr ($string, $trans_tbl); } function action() { $formData['identity'] = (int)$_POST['identity']; foreach((array)$_POST['destination'] as $key => $destination) { if(!empty($_POST['address'][$key])) { if($destination == 'folder') { $formData[$destination][] = $GLOBALS['egw']->translation->convert($_POST['address'][$key], $this->charset, 'UTF7-IMAP'); } else { $formData[$destination][] = $_POST['address'][$key]; } } } $formData['subject'] = $this->bocompose->stripSlashes($_POST['subject']); $formData['body'] = $this->bocompose->stripSlashes($_POST['body']); // if the body is empty, maybe someone pasted something with scripts, into the message body if(empty($formData['body'])) { // this is to be found with the egw_unset_vars array for the _POST['body'] array $name='_POST'; $key='body'; #error_log($GLOBALS['egw_unset_vars'][$name.'['.$key.']']); if (isset($GLOBALS['egw_unset_vars'][$name.'['.$key.']'])) { $formData['body'] = bocompose::_getCleanHTML( $GLOBALS['egw_unset_vars'][$name.'['.$key.']']); } } $formData['priority'] = $this->bocompose->stripSlashes($_POST['priority']); $formData['signatureID'] = (int)$_POST['signatureID']; $formData['stationeryID'] = $_POST['stationeryID']; $formData['mimeType'] = $this->bocompose->stripSlashes($_POST['mimeType']); if ($formData['mimeType'] == 'html' && html::htmlarea_availible()===false) { $formData['mimeType'] = 'plain'; $formData['body'] = $this->bocompose->convertHTMLToText($formData['body']); } $formData['disposition'] = (bool)$_POST['disposition']; $formData['to_infolog'] = $_POST['to_infolog']; $formData['to_tracker'] = $_POST['to_tracker']; //$formData['mailbox'] = $_GET['mailbox']; if((bool)$_POST['printit'] == true) { $formData['printit'] = 1; $formData['isDraft'] = 1; // pint the composed message. therefore save it as draft and reopen it as plain printwindow $formData['subject'] = "[".lang('printview').":]".$formData['subject']; $messageUid = $this->bocompose->saveAsDraft($formData,$destinationFolder); if (!$messageUid) { print ""; return; } $uidisplay = CreateObject('felamimail.uidisplay'); $uidisplay->printMessage($messageUid, $formData['printit'],$destinationFolder); //egw::link('/index.php',array('menuaction' => 'felamimail.uidisplay.printMessage','uid'=>$messageUid)); return; } if((bool)$_POST['saveAsDraft'] == true) { $formData['isDraft'] = 1; // save as draft $folder = $this->bofelamimail->getDraftFolder(); $this->bofelamimail->reopen($folder); $status = $this->bofelamimail->getFolderStatus($folder); //error_log(__METHOD__.__LINE__.array2string(array('Folder'=>$folder,'Status'=>$status))); $uidNext = $status['uidnext']; // we may need that, if the server does not return messageUIDs of saved/appended messages $messageUid = $this->bocompose->saveAsDraft($formData,$folder); // folder may change if (!$messageUid) { print ""; //try to reopen the mail from session data $this->compose('to',true); return; } // saving as draft, does not mean closing the message unset($_POST['composeid']); unset($_GET['composeid']); $uicompose = CreateObject('felamimail.uicompose'); $messageUid = ($messageUid===true ? $uidNext : $messageUid); if (!$uicompose->bofelamimail->icServer->_connected) $uicompose->bofelamimail->openConnection($uicompose->bofelamimail->profileID); if ($uicompose->bofelamimail->getMessageHeader($messageUid)) { //error_log(__METHOD__.__LINE__.' (re)open drafted message with new UID: '.$messageUid.' in folder:'.$folder); $uicompose->bocompose->getDraftData($uicompose->bofelamimail->icServer, $folder, $messageUid); $uicompose->compose('to',true); return; } } else { $cachedComposeID = egw_cache::getCache(egw_cache::SESSION,'email','composeIdCache'.trim($GLOBALS['egw_info']['user']['account_id']),$callback=null,$callback_params=array(),$expiration=60); egw_cache::setCache(egw_cache::SESSION,'email','composeIdCache'.trim($GLOBALS['egw_info']['user']['account_id']),$this->composeID,$expiration=60); //error_log(__METHOD__.__LINE__.' '.$formData['subject'].' '.$cachedComposeID.'<->'.$this->composeID); if (!empty($cachedComposeID) && $cachedComposeID == $this->composeID) { //already send print ""; return; } if(!$this->bocompose->send($formData)) { // reset the cached composeID, as something failed egw_cache::setCache(egw_cache::SESSION,'email','composeIdCache'.trim($GLOBALS['egw_info']['user']['account_id']),null,$expiration=60); // print ""; $this->compose(); return; } } #common::egw_exit(); print ""; } function composeAsForward($_focusElement='to') { if (isset($_GET['forwardmails'])) { unset($_GET['forwardmails']); $replyID = $_GET['reply_id']; $replyIds = explode(',',$replyID); $icServer = $this->bofelamimail->profileID; $folder = (isset($_GET['folder'])?base64_decode($_GET['folder']):base64_decode($_GET['mailbox'])); //_debug_array(array('reply_id'=>$replyIds,'folder'=>$folder)); if (!empty($folder) && !empty($replyID) ) { // this fill the session data with the values from the original email $buff = $this->bocompose->preferencesArray['message_forwarding']; $this->bocompose->preferencesArray['message_forwarding'] = 'asmail'; foreach($replyIds as $key => $id) { $this->bocompose->getForwardData($icServer, $folder, $id,NULL); } $this->bocompose->preferencesArray['message_forwarding'] = $buff; } } $this->compose($_focusElement); } /** * function compose * this function is used to fill the compose dialog with the content provided by session data * * @var _focusElement varchar subject, to, body supported * @var suppressSigOnTop boolean * @var isReply boolean */ function compose($_focusElement='to',$suppressSigOnTop=false, $isReply=false) { //error_log(__METHOD__.__LINE__.array2string($_REQUEST)); if (isset($_GET['reply_id'])) $replyID = $_GET['reply_id']; // read the data from session // all values are empty for a new compose window $insertSigOnTop = false; $sessionData = $this->bocompose->getSessionData(); $alwaysAttachVCardAtCompose = false; // we use this to eliminate double attachments, if users VCard is already present/attached if ( isset($GLOBALS['egw_info']['apps']['stylite']) && (isset($this->bocompose->preferencesArray['attachVCardAtCompose']) && $this->bocompose->preferencesArray['attachVCardAtCompose'])) { $alwaysAttachVCardAtCompose = true; if (!is_array($_REQUEST['preset']['file']) && !empty($_REQUEST['preset']['file'])) { $f = $_REQUEST['preset']['file']; $_REQUEST['preset']['file'] = array($f); } $_REQUEST['preset']['file'][] = "vfs://default/apps/addressbook/".$GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id')."/.entry"; } if (is_array($_REQUEST['preset'])) { //_debug_array($_REQUEST); if ($_REQUEST['preset']['mailto']) { // handle mailto strings such as // mailto:larry,dan?cc=mike&bcc=sue&subject=test&body=type+your&body=message+here // the above string may be htmlentyty encoded, then multiple body tags are supported // first, strip the mailto: string out of the mailto URL $tmp_send_to = (stripos($_REQUEST['preset']['mailto'],'mailto')===false?$_REQUEST['preset']['mailto']:trim(substr(html_entity_decode($_REQUEST['preset']['mailto']),7))); // check if there is more than the to address $mailtoArray = explode('?',$tmp_send_to,2); if ($mailtoArray[1]) { // check if there are more than one requests $addRequests = explode('&',$mailtoArray[1]); foreach ($addRequests as $key => $reqval) { // the additional requests should have a =, to separate key from value. $keyValuePair = explode('=',$reqval,2); $sessionData[$keyValuePair[0]] .= (strlen($sessionData[$keyValuePair[0]])>0 ? ' ':'') . $keyValuePair[1]; } } $sessionData['to']=$mailtoArray[0]; // if the mailto string is not htmlentity decoded the arguments are passed as simple requests foreach(array('cc','bcc','subject','body') as $name) { if ($_REQUEST[$name]) $sessionData[$name] .= (strlen($sessionData[$name])>0 ? ( $name == 'cc' || $name == 'bcc' ? ',' : ' ') : '') . $_REQUEST[$name]; } } if (isset($_REQUEST['preset']['file'])) { $names = (array)$_REQUEST['preset']['name']; $types = (array)$_REQUEST['preset']['type']; //if (!empty($types) && in_array('text/calendar; method=request',$types)) $files = (array)$_REQUEST['preset']['file']; foreach($files as $k => $path) { if (!empty($types[$k]) && stripos($types[$k],'text/calendar')!==false) { $insertSigOnTop = 'below'; } if (parse_url($path,PHP_URL_SCHEME == 'vfs')) { $type = egw_vfs::mime_content_type($path); // special handling for attaching vCard of iCal --> use their link-title as name if (substr($path,-7) != '/.entry' || !(list($app,$id) = array_slice(explode('/',$path),-3)) || !($name = egw_link::title($app, $id))) { $name = urldecode(egw_vfs::basename($path)); } else { $name .= '.'.mime_magic::mime2ext($type); } $formData = array( 'name' => $name, 'type' => $type, 'file' => $path, 'size' => filesize($path), ); if ($formData['type'] == egw_vfs::DIR_MIME_TYPE) continue; // ignore directories } elseif(is_readable($path)) { $formData = array( 'name' => isset($names[$k]) ? $names[$k] : basename($path), 'type' => isset($types[$k]) ? $types[$k] : (function_exists('mime_content_type') ? mime_content_type($path) : mime_magic::filename2mime($path)), 'file' => $path, 'size' => filesize($path), ); } else { continue; } $this->bocompose->addAttachment($formData,($alwaysAttachVCardAtCompose?true:false)); } $remember = array(); if (isset($_REQUEST['preset']['mailto'])) { foreach(array_keys($sessionData) as $k) { if (in_array($k,array('to','cc','bcc','subject','body'))) $remember[$k] = $sessionData[$k]; } } $sessionData = $this->bocompose->getSessionData(); $sessionData = array_merge($sessionData,$remember); } foreach(array('to','cc','bcc','subject','body') as $name) { if ($_REQUEST['preset'][$name]) $sessionData[$name] = $_REQUEST['preset'][$name]; } } // is the to address set already? if (!empty($_REQUEST['send_to'])) { $sessionData['to'] = base64_decode($_REQUEST['send_to']); // first check if there is a questionmark or ampersand if (strpos($sessionData['to'],'?')!== false) list($sessionData['to'],$rest) = explode('?',$sessionData['to'],2); $sessionData['to'] = html_entity_decode($sessionData['to']); if (($at_pos = strpos($sessionData['to'],'@')) !== false) { if (($amp_pos = strpos(substr($sessionData['to'],$at_pos),'&')) !== false) { //list($email,$addoptions) = explode('&',$value,2); $email = substr($sessionData['to'],0,$amp_pos+$at_pos); $rest = substr($sessionData['to'], $amp_pos+$at_pos+1); //error_log(__METHOD__.__LINE__.$email.' '.$rest); $sessionData['to'] = $email; } } if (strpos($sessionData['to'],'%40')!== false) $sessionData['to'] = html::purify(str_replace('%40','@',$sessionData['to'])); $rarr = array(html::purify($rest)); if (isset($rest)&&!empty($rest) && strpos($rest,'&')!== false) $rarr = explode('&',$rest); //error_log(__METHOD__.__LINE__.$sessionData['to'].'->'.array2string($rarr)); $karr = array(); foreach ($rarr as $ri => $rval) { //must contain = if (strpos($rval,'=')!== false) { $k = $v = ''; list($k,$v) = explode('=',$rval,2); $karr[$k] = $v; } } //error_log(__METHOD__.__LINE__.$sessionData['to'].'->'.array2string($karr)); foreach(array('cc','bcc','subject','body') as $name) { if ($karr[$name]) $sessionData[$name] = $karr[$name]; } if (!empty($_REQUEST['subject'])) $sessionData['subject'] = html::purify(trim(html_entity_decode($_REQUEST['subject']))); } //is the MimeType set/requested if (!empty($_REQUEST['mimeType'])) { $sessionData['mimeType'] = $_REQUEST['mimeType']; } else { // try to enforce a mimeType on reply ( if type is not of the wanted type ) if ($isReply) { if (!empty($this->bocompose->preferencesArray['replyOptions']) && $this->bocompose->preferencesArray['replyOptions']=="text" && $sessionData['mimeType'] == 'html') { $sessionData['mimeType'] = 'plain'; $sessionData['body'] = $this->bocompose->convertHTMLToText(str_replace(array("\n\r","\n"),' ',$sessionData['body'])); } if (!empty($this->bocompose->preferencesArray['replyOptions']) && $this->bocompose->preferencesArray['replyOptions']=="html" && $sessionData['mimeType'] != 'html') { $sessionData['mimeType'] = 'html'; $sessionData['body'] = "
".$sessionData['body']."
"; // take care this assumption is made on the creation of the reply header in bocompose::getReplyData if (strpos($sessionData['body'],"
 \r\n \r\n---")===0) $sessionData['body'] = substr_replace($sessionData['body']," 
\r\n
---",0,strlen("
 \r\n \r\n---")-1);
					}
				}
			}
			if ($sessionData['mimeType'] == 'html' && html::htmlarea_availible()===false)
			{
				$sessionData['mimeType'] = 'plain';
				$sessionData['body'] = $this->bocompose->convertHTMLToText($sessionData['body']);
			}
			// removal of possible script elements in HTML; getCleanHTML is the choice here, if not only for consistence
			// we use the preg of common_functions (slightly altered) to meet eGroupwares behavior on posted variables
			if ($sessionData['mimeType'] == 'html')
			{
				// this is now moved to egw_htmLawed (triggered by default config) which is called with ckeditor anyway
				//felamimail_bo::getCleanHTML($sessionData['body'],true);
			}

			// is a certain signature requested?
			// only the following values are supported (and make sense)
			// no => means -2
			// system => means -1
			// default => fetches the default, which is standard behavior
			if (!empty($_REQUEST['signature']) && (strtolower($_REQUEST['signature']) == 'no' || strtolower($_REQUEST['signature']) == 'system'))
			{
				$presetSig = (strtolower($_REQUEST['signature']) == 'no' ? -2 : -1);
			}
			if (($suppressSigOnTop || $sessionData['isDraft']) && !empty($sessionData['signatureID'])) $presetSig = (int)$sessionData['signatureID'];
			if (($suppressSigOnTop || $sessionData['isDraft']) && !empty($sessionData['stationeryID'])) $presetStationery = $sessionData['stationeryID'];
			$presetId = NULL;
			if (($suppressSigOnTop || $sessionData['isDraft']) && !empty($sessionData['identity'])) $presetId = (int)$sessionData['identity'];
			$this->display_app_header();

			$this->t->set_file(array("composeForm" => "composeForm.tpl"));
			$this->t->set_block('composeForm','header','header');
			$this->t->set_block('composeForm','body_input');
			$this->t->set_block('composeForm','attachment','attachment');
			$this->t->set_block('composeForm','attachment_row','attachment_row');
			$this->t->set_block('composeForm','attachment_row_bold');
			$this->t->set_block('composeForm','destination_row');
			$this->t->set_block('composeForm','simple_text');

			$this->translate();
			// store the selected Signature
			$this->t->set_var("mySigID",($presetSig ? $presetSig : $sessionData['signatureID']));

			if ($GLOBALS['egw_info']['user']['apps']['addressbook']) {
				$this->t->set_var("link_addressbook",egw::link('/index.php',array(
					'menuaction' => 'addressbook.addressbook_ui.emailpopup',
				)));
			} else {
				$this->t->set_var("link_addressbook",'');
			}
			$this->t->set_var("focusElement",$_focusElement);

			$linkData = array
			(
				'menuaction'	=> 'felamimail.uicompose.selectFolder',
			);
			$this->t->set_var('folder_select_url',egw::link('/index.php',$linkData));

			$linkData = array
			(
				'menuaction'	=> 'felamimail.uicompose.fileSelector',
				'composeid'	=> $this->composeID
			);
			$this->t->set_var('file_selector_url',egw::link('/index.php',$linkData));

			$this->t->set_var('vfs_selector_url',egw::link('/index.php',array(
				'menuaction' => 'filemanager.filemanager_select.select',
				'mode' => 'open-multiple',
				'method' => 'felamimail.uicompose.vfsSelector',
				'id' => $this->composeID,
				'label' => lang('Attach'),
			)));
			if ($GLOBALS['egw_info']['user']['apps']['filemanager'])
			{
				$this->t->set_var('vfs_attach_button','
				');
			}
			else
			{
				$this->t->set_var('vfs_attach_button','');
			}
			$linkData = array
			(
				'menuaction'	=> 'felamimail.uicompose.action',
				'composeid'	=> $this->composeID
			);
			$this->t->set_var("link_action",egw::link('/index.php',$linkData));
			$this->t->set_var('folder_name',$this->bofelamimail->sessionData['mailbox']);
			$this->t->set_var('compose_id',$this->composeID);
			// the editorobject is needed all the time (since we use CKEDITOR3
			//$editorObject = html::initCKEditor('400px','simple');
			$this->t->set_var('ckeditorConfig', egw_ckeditor_config::get_ckeditor_config('simple-withimage'));//$editorObject->jsEncode($editorObject->config));
			$this->t->set_var('refreshTimeOut', 3*60*1000); // 3 minutes till a compose messages will be saved as draft;

			// check for some error messages from last posting attempt
			$errorInfo = $this->bocompose->getErrorInfo();
			if (isset($_REQUEST['preset']['msg'])) $errorInfo = html::purify($_REQUEST['preset']['msg']);
			if($errorInfo)
			{
				$this->t->set_var('errorInfo',"$errorInfo");
			}
			else
			{
				$this->t->set_var('errorInfo',' ');
			}

			// header
			$allIdentities = $this->mailPreferences->getIdentity();
			unset($allIdentities[0]);
			//_debug_array($allIdentities);
			$defaultIdentity = 0;
			$identities = array();
			foreach($allIdentities as $key => $singleIdentity) {
				//$identities[$singleIdentity->id] = $singleIdentity->realName.' <'.$singleIdentity->emailAddress.'>';
				$iS = felamimail_bo::generateIdentityString($singleIdentity);
				//error_log(__METHOD__.__LINE__.':'.$presetId.'->'.$key.'('.$singleIdentity->id.')'.'#'.$iS.'#');
				if (array_search('('.$singleIdentity->id.') '.$iS,$identities)===false) $identities[$singleIdentity->id] = '('.$singleIdentity->id.') '.$iS;
				if(!empty($singleIdentity->default) && $singleIdentity->default==1 && $defaultIdentity==0)
				{
					//_debug_array($singleIdentity);
					$defaultIdentity = $singleIdentity->id;
					//$defaultIdentity = $key;
					$sessionData['signatureID'] = (!empty($singleIdentity->signature) ? $singleIdentity->signature : $sessionData['signatureID']);
				}
			}
			$selectFrom = html::select('identity', (!empty($presetId) ? $presetId : $defaultIdentity), $identities, true, "style='width:100%;' onchange='changeIdentity(this);'");
			$this->t->set_var('select_from', $selectFrom);
			//error_log(__METHOD__.__LINE__.' DefaultIdentity:'.array2string($identities[($presetId ? $presetId : $defaultIdentity)]));
			// navbar(, kind of)
			$this->t->set_var('img_clear_left', common::image('felamimail','clear_left'));
			$this->t->set_var('img_fileopen', common::image('phpgwapi','fileopen'));
			$this->t->set_var('img_mail_send', common::image('felamimail','mail_send'));
			$this->t->set_var('img_attach_file', common::image('felamimail','attach'));
			$this->t->set_var('ajax-loader', common::image('felamimail','ajax-loader'));
			$this->t->set_var('img_fileexport', common::image('felamimail','fileexport'));
			// prepare print url/button
			$this->t->set_var('img_print_it', common::image('felamimail','print'));
			$this->t->set_var('lang_print_it', lang('print it'));
			$this->t->set_var('print_it', $printURL);
			// from, to, cc, replyto
			$destinationRows = 0;
			foreach(array('to','cc','bcc','replyto','folder') as $destination) {
				foreach((array)$sessionData[$destination] as $key => $value) {
					if ($value=="NIL@NIL") continue;
					if ($destination=='replyto' && str_replace('"','',$value) == str_replace('"','',$identities[($presetId ? $presetId : $defaultIdentity)])) continue;
					//error_log(__METHOD__.__LINE__.array2string(array('key'=>$key,'value'=>$value)));
					$selectDestination = html::select('destination[]', $destination, $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'");
					$this->t->set_var('select_destination', $selectDestination);
					$value = htmlspecialchars_decode($value,ENT_COMPAT);
					$value = str_replace("\"\"",'"',$value);
					$address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($value):$value), '');
					foreach((array)$address_array as $addressObject) {
						if ($addressObject->host == '.SYNTAX-ERROR.') continue;
						$address = imap_rfc822_write_address($addressObject->mailbox,$addressObject->host,$addressObject->personal);
						$address = felamimail_bo::htmlentities($address, $this->displayCharset);
						$this->t->set_var('address', ($destination=='folder'?$value:$address));
						$this->t->parse('destinationRows','destination_row',True);
						$destinationRows++;
					}
				}
			}
			while($destinationRows < 3) {
				// and always add one empty row
				$selectDestination = html::select('destination[]', 'to', $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'");
				$this->t->set_var('select_destination', $selectDestination);
				$this->t->set_var('address', '');
				$this->t->parse('destinationRows','destination_row',True);
				$destinationRows++;
			}
			// and always add one empty row
			$selectDestination = html::select('destination[]', 'to', $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'");
			$this->t->set_var('select_destination', $selectDestination);
			$this->t->set_var('address', '');
			$this->t->parse('destinationRows','destination_row',True);

			// handle subject
			$subject = felamimail_bo::htmlentities($sessionData['subject'],$this->displayCharset);
			$this->t->set_var("subject",$subject);

			if ($GLOBALS['egw_info']['user']['apps']['addressbook']) {
				$this->t->set_var('addressbookButton','');
			} else {
				$this->t->set_var('addressbookButton','');
			}
			if ($GLOBALS['egw_info']['user']['apps']['infolog']) {
				$this->t->set_var('infologImage',html::image('felamimail','to_infolog',lang('Save as infolog'),'width="17px" height="17px" valign="middle"' ));
				$this->t->set_var('lang_save_as_infolog',lang('Save as infolog'));
				$this->t->set_var('infolog_checkbox','');
			} else {
				$this->t->set_var('infologImage','');
				$this->t->set_var('lang_save_as_infolog','');
				$this->t->set_var('infolog_checkbox','');
			}
			if ($GLOBALS['egw_info']['user']['apps']['tracker'])
			{
				$this->t->set_var('trackerImage',html::image('felamimail','to_tracker',lang('Save as tracker'),'width="17px" height="17px" valign="middle"' ));
				$this->t->set_var('lang_save_as_infolog',($GLOBALS['egw_info']['user']['apps']['infolog']?lang('Save:'):lang('Save as tracker')));
				$this->t->set_var('tracker_checkbox','');
			} else {
				$this->t->set_var('trackerImage','');
				$this->t->set_var('tracker_checkbox','');
			}
			$this->t->set_var('lang_no_recipient',lang('No recipient address given!'));
			$this->t->set_var('lang_no_subject',lang('No subject given!'));
			$this->t->set_var('lang_infolog_tracker_not_both',lang("You can either choose to save as infolog OR tracker, not both."));
			$this->t->pparse("out","header");

			// prepare signatures, the selected sig may be used on top of the body
			require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php');
			$boSignatures = new felamimail_bosignatures();
			$signatures = $boSignatures->getListOfSignatures();

			if (empty($sessionData['signatureID'])) {
				if ($signatureData = $boSignatures->getDefaultSignature()) {
					if (is_array($signatureData)) {
						$sessionData['signatureID'] = $signatureData['signatureid'];
					} else {
						$sessionData['signatureID'] =$signatureData;
					}
				}
			}

			$selectSignatures = array(
				'-2' => lang('no signature')
			);
			foreach($signatures as $signature) {
				$selectSignatures[$signature['fm_signatureid']] = lang('Signature').': '.$signature['fm_description'];
			}
			$disableRuler = false;
			$signature = $boSignatures->getSignature(($presetSig ? $presetSig : $sessionData['signatureID']));
			if ((isset($this->bocompose->preferencesArray['disableRulerForSignatureSeparation']) &&
				$this->bocompose->preferencesArray['disableRulerForSignatureSeparation']) ||
				empty($signature->fm_signature) || trim($this->bocompose->convertHTMLToText($signature->fm_signature)) =='')
			{
				$disableRuler = true;
			}
			$font_span ='';
			if($sessionData['mimeType'] == 'html' /*&& trim($sessionData['body'])==''*/) {
				// User preferences for style
				$font = $GLOBALS['egw_info']['user']['preferences']['common']['rte_font'];
				$font_size = $GLOBALS['egw_info']['user']['preferences']['common']['rte_font_size'];
				$font_span = '';
				if (empty($font) && empty($font_size)) $font_span = '';
			}
			//remove possible html header stuff
			if (stripos($sessionData['body'],'')!==false) $sessionData['body'] = str_ireplace(array('',''),array('',''),$sessionData['body']);
			//error_log(__METHOD__.__LINE__.array2string($this->bocompose->preferencesArray));
			if (isset($this->bocompose->preferencesArray['insertSignatureAtTopOfMessage']) &&
				$this->bocompose->preferencesArray['insertSignatureAtTopOfMessage'] &&
				!(isset($_POST['mySigID']) && !empty($_POST['mySigID']) ) && !$suppressSigOnTop
			)
			{
				$insertSigOnTop = ($insertSigOnTop?$insertSigOnTop:true);
				if($sessionData['mimeType'] == 'html') {
					$before = ($disableRuler ?' 
':' 

'); $inbetween = ' 
'; if (!empty($font_span) && !($insertSigOnTop === 'below')) $before = $font_span.$before.'
'; } else { $before = ($disableRuler ?"\r\n\r\n":"\r\n\r\n-- \r\n"); $inbetween = "\r\n"; } $sigText = felamimail_bo::merge($signature->fm_signature,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))); if ($sessionData['mimeType'] == 'html') $sigText = "".$sigText.""; if ($insertSigOnTop === 'below') { $sessionData['body'] = $font_span.($font_span?'​':'').$sessionData['body'].$before.($sessionData['mimeType'] == 'html'?$sigText:$this->bocompose->convertHTMLToText($sigText)); } else { $sessionData['body'] = $before.($sessionData['mimeType'] == 'html'?$sigText:$this->bocompose->convertHTMLToText($sigText)).$inbetween.$sessionData['body']; } } else { $sessionData['body'] = $font_span.($font_span?($insertSigOnTop?'​':($isReply||isset($replyID)||empty($sessionData['body'])?' ':'')).'':'').$sessionData['body']; } //error_log(__METHOD__.__LINE__.$sessionData['body']); // prepare body // in a way, this tests if we are having real utf-8 (the displayCharset) by now; we should if charsets reported (or detected) are correct if (strtoupper($this->displayCharset) == 'UTF-8') { $test = @json_encode($sessionData['body']); //error_log(__METHOD__.__LINE__.' ->'.strlen($singleBodyPart['body']).' Error:'.json_last_error().'<- BodyPart:#'.$test.'#'); //if (json_last_error() != JSON_ERROR_NONE && strlen($singleBodyPart['body'])>0) if ($test=="null" && strlen($sessionData['body'])>0) { // this should not be needed, unless something fails with charset detection/ wrong charset passed error_log(__METHOD__.__LINE__.' Charset problem detected; Charset Detected:'.felamimail_bo::detect_encoding($sessionData['body'])); $sessionData['body'] = utf8_encode($sessionData['body']); } } if($sessionData['mimeType'] == 'html') { $mode = 'simple-withimage'; //$mode ='advanced';// most helpful for debuging #if (isset($GLOBALS['egw_info']['server']['enabled_spellcheck'])) $mode = 'egw_simple_spellcheck'; $style="border:0px; width:100%; height:400px;"; // dont run purify, as we already did that (getCleanHTML). $this->t->set_var('tinymce', html::fckEditorQuick('body', $mode, $sessionData['body'],'400px','100%',false)); $this->t->set_var('mimeType', 'html'); $ishtml=1; } else { $border="1px solid gray; margin:1px"; // initalize the CKEditor Object to enable switching back and force $editor = html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%',false,$border); $this->t->set_var('tinymce', $editor); //html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%')); $this->t->set_var('mimeType', 'text'); $ishtml=0; } $bostationery = new felamimail_bostationery(); $selectStationeries = array( '0' => lang('no stationery') ); $showStationaries = false; $validStationaries = $bostationery->get_valid_templates(); if (is_array($validStationaries) && count($validStationaries)>0) { $showStationaries = true; $selectStationeries += $validStationaries; } // if ID of signature Select Box is set, we allow for changing the sig onChange of the signatueSelect $selectBoxSignature = html::select('signatureID', ($presetSig ? $presetSig : $sessionData['signatureID']), $selectSignatures, true, ($insertSigOnTop?"id='signatureID'":"")." style='width: 35%;' onchange='fm_compose_changeInputType(this)'"); $selectBoxStationery = html::select('stationeryID', ($presetStationery ? $presetStationery : 0), $selectStationeries, true, "style='width: 35%;'"); $this->t->set_var("select_signature", $selectBoxSignature); $this->t->set_var("select_stationery", ($showStationaries ? $selectBoxStationery:'')); $this->t->set_var("lang_editormode",lang("Editor type")); if (html::htmlarea_availible()===false) { $this->t->set_var("toggle_editormode",''); } else { // IE seems to need onclick to realize there is a change $this->t->set_var("toggle_editormode", lang("Editor type").": "); } $this->t->pparse("out","body_input"); // attachments if (is_array($sessionData['attachments']) && count($sessionData['attachments']) > 0) { $imgClearLeft = common::image('felamimail','clear_left'); $tableRows = array(); foreach((array)$sessionData['attachments'] as $id => $attachment) { $tempArray = array ( '1' => $attachment['name'], '.1' => 'width="40%"', '2' => mime_magic::mime2label($attachment['type']), '3' => egw_vfs::hsize($attachment['size']), '.3' => "style='text-align:right;'", '4' => ' ', '.4' => 'width="10%"', '5' => "composeID."','$id')\">", ); $tableRows[] = $tempArray; } if(count($tableRows) > 0) { $table = html::table($tableRows, "style='width:100%'"); } $this->t->set_var('attachment_rows',$table); } else { $this->t->set_var('attachment_rows',''); } $this->t->pparse("out","attachment"); } function composeFromDraft() { $icServer = (int)$_GET['icServer']; $folder = (isset($_GET['folder'])?base64_decode($_GET['folder']):base64_decode($_GET['mailbox'])); $replyID = $_GET['uid']; if (!empty($folder) && !empty($replyID) ) { // this fill the session data with the values from the original email $this->bocompose->getDraftData($icServer, $folder, $replyID); } $this->compose('body',$suppressSigOnTop=true); } function display_app_header() { egw_framework::validate_file('jscode','composeMessage','felamimail'); egw_framework::validate_file('ckeditor3','ckeditor','phpgwapi'); $GLOBALS['egw']->js->set_onload('javascript:initAll();'); $GLOBALS['egw']->js->set_onbeforeunload("if (do_onunload && justClickedSend==false) if (draftsMayExist) {a = checkunload(browserSupportsOnUnloadConfirm?'".addslashes(lang("Please choose:"))."'+'\\n'+'".addslashes(lang("1) keep drafted message (press OK)"))."'+'\\n'+'".addslashes(lang("2) discard the message completely (press Cancel)"))."':'".addslashes(lang("if you leave this page without saving to draft, the message will be discarded completely"))."');".' if (!browserSupportsOnUnloadConfirm) return a;}'); //$GLOBALS['egw']->js->set_onbeforeunload("if (do_onunload) if (draftsMayExist) return '".addslashes(lang("Please choose:"))."'+'\\n'+'".addslashes(lang("1) keep drafted message (press OK)"))."'+'\\n'+'".addslashes(lang("2) discard the message completely (press Cancel)"))."';"); $GLOBALS['egw']->js->set_onunload("if (do_onunload && justClickedSend==false) checkunload();"); //$GLOBALS['egw']->js->set_onunload("if (do_onunload) egw_appWindow('felamimail').xajax_doXMLHTTPsync('felamimail.ajaxfelamimail.removeLastDraftedVersion','".$this->composeID."');"); $GLOBALS['egw_info']['flags']['include_xajax'] = True; common::egw_header(); } /** * Callback for filemanagers select file dialog * * @param string $composeid * @param string|array $files path of file(s) in vfs (no egw_vfs::PREFIX, just the path) * @return string javascript output by the file select dialog, usually to close it */ function vfsSelector($composeid,$files) { $this->bocompose = CreateObject('felamimail.bocompose',$this->composeID=$composeid,$this->displayCharset); foreach((array) $files as $path) { $formData = array( 'name' => egw_vfs::basename($path), 'type' => egw_vfs::mime_content_type($path), 'file' => egw_vfs::PREFIX.$path, 'size' => filesize(egw_vfs::PREFIX.$path), ); $this->bocompose->addAttachment($formData); } return 'window.close();'; } function fileSelector() { if(is_array($_FILES["addFileName"])) { #phpinfo(); //_debug_array($_FILES); $success=false; if (is_array($_FILES["addFileName"]['name'])) { // multiple uploads supported by newer firefox (>3.6) and chrome (>4) versions, // upload array information is by key within the attribute (name, type, size, temp_name) foreach($_FILES["addFileName"]['name'] as $key => $filename) { if($_FILES['addFileName']['error'][$key] == $UPLOAD_ERR_OK) { $formData['name'] = $_FILES['addFileName']['name'][$key]; $formData['type'] = $_FILES['addFileName']['type'][$key]; $formData['file'] = $_FILES['addFileName']['tmp_name'][$key]; $formData['size'] = $_FILES['addFileName']['size'][$key]; $this->bocompose->addAttachment($formData); $success = true; } } } else // should not happen as upload form name is defined as addFileName[] { if($_FILES['addFileName']['error'] == $UPLOAD_ERR_OK) { $formData['name'] = $_FILES['addFileName']['name']; $formData['type'] = $_FILES['addFileName']['type']; $formData['file'] = $_FILES['addFileName']['tmp_name']; $formData['size'] = $_FILES['addFileName']['size']; $this->bocompose->addAttachment($formData); $success = true; } } if ($success == true) { print ""; } else { print ""; } } // this call loads js and css for the treeobject html::tree(false,false,false,null,'foldertree','','',false,'/',null,false); egw_framework::validate_file('jscode','composeMessage','felamimail'); common::egw_header(); #$uiwidgets =& CreateObject('felamimail.uiwidgets'); $this->t->set_file(array("composeForm" => "composeForm.tpl")); $this->t->set_block('composeForm','fileSelector','fileSelector'); $this->translate(); $linkData = array ( 'menuaction' => 'felamimail.uicompose.fileSelector', 'composeid' => $this->composeID ); $this->t->set_var('file_selector_url', egw::link('/index.php',$linkData)); $maxUploadSize = ini_get('upload_max_filesize'); $this->t->set_var('max_uploadsize', $maxUploadSize); $this->t->set_var('ajax-loader', common::image('felamimail','ajax-loader')); $this->t->pparse("out","fileSelector"); } function forward() { $icServer = (int)$_GET['icServer']; $folder = base64_decode($_GET['folder']); $replyID = $_GET['reply_id']; $partID = $_GET['part_id']; $mode = false; if (isset($_GET['mode']) && ($_GET['mode']=='forwardasattach'||$_GET['mode']=='forwardinline')) $mode = ($_GET['mode']=='forwardinline'?'inline':'asattach'); if (!empty($replyID)) { // this fill the session data with the values from the original email $this->bocompose->getForwardData($icServer, $folder, $replyID, $partID, $mode); } $this->compose(); } function getAttachment() { $bocompose = CreateObject('felamimail.bocompose', $_GET['_composeID']); $attachment = $bocompose->sessionData['attachments'][$_GET['attID']] ; if (!empty($attachment['folder'])) { $is_winmail = $_GET['is_winmail'] ? $_GET['is_winmail'] : 0; $this->mailbox = $attachment['folder']; $this->bofelamimail->reopen($this->mailbox); #$attachment = $this->bofelamimail->getAttachment($this->uid,$part); $attachmentData = $this->bofelamimail->getAttachment($attachment['uid'],$attachment['partID'],$is_winmail); $this->bofelamimail->closeConnection(); } if (parse_url($attachment['file'],PHP_URL_SCHEME) == 'vfs') { egw_vfs::load_wrapper('vfs'); } //error_log(print_r($attachmentData,true)); header ("Content-Type: ".$attachment['type']."; name=\"". $this->bofelamimail->decode_header($attachment['name']) ."\""); header ("Content-Disposition: inline; filename=\"". $this->bofelamimail->decode_header($attachment['name']) ."\""); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Pragma: public"); if (!empty($attachment['file'])) { $fp = fopen($attachment['file'], 'rb'); fpassthru($fp); fclose($fp); } else { echo $attachmentData['attachment']; } common::egw_exit(); exit; } function selectFolder() { // this call loads js and css for the treeobject html::tree(false,false,false,null,'foldertree','','',false,'/',null,false); egw_framework::validate_file('jscode','composeMessage','felamimail'); common::egw_header(); $bofelamimail = $this->bofelamimail; $uiwidgets = CreateObject('felamimail.uiwidgets'); $connectionStatus = $bofelamimail->openConnection($bofelamimail->profileID); $folderObjects = $bofelamimail->getFolderObjects(true,false); $folderTree = $uiwidgets->createHTMLFolder ( $folderObjects, 'INBOX', 0, lang('IMAP Server'), $mailPreferences['username'].'@'.$mailPreferences['imapServerAddress'], 'divFolderTree', false, true ); print '
'; print $folderTree; } function composeAsNew() { $icServer = (int)$_GET['icServer']; $folder = (isset($_GET['folder'])?base64_decode($_GET['folder']):base64_decode($_GET['mailbox'])); $replyID = $_GET['reply_id']; $partID = $_GET['part_id']; if (!empty($folder) && !empty($replyID) ) { // this fill the session data with the values from the original email $this->bocompose->getDraftData($icServer, $folder, $replyID, $partID); } $this->compose('body',true); } function reply() { $icServer = (int)$_GET['icServer']; $folder = base64_decode($_GET['folder']); $replyID = $_GET['reply_id']; $partID = $_GET['part_id']; if (!empty($folder) && !empty($replyID) ) { // this fill the session data with the values from the original email $this->bocompose->getReplyData('single', $icServer, $folder, $replyID, $partID); } $this->compose('body',false,true); } function replyAll() { $icServer = (int)$_GET['icServer']; $folder = base64_decode($_GET['folder']); $replyID = $_GET['reply_id']; $partID = $_GET['part_id']; if (!empty($folder) && !empty($replyID) ) { // this fill the session data with the values from the original email $this->bocompose->getReplyData('all', $icServer, $folder, $replyID, $partID); } $this->compose('body',false,true); } function translate() { $this->t->set_var("lang_message_list",lang('Message List')); $this->t->set_var("lang_to",lang('to')); $this->t->set_var("lang_cc",lang('cc')); $this->t->set_var("lang_bcc",lang('bcc')); $this->t->set_var("lang_identity",lang('identity')); $this->t->set_var("lang_reply_to",lang('reply to')); $this->t->set_var("lang_subject",lang('subject')); $this->t->set_var("lang_addressbook",lang('addressbook')); $this->t->set_var("lang_search",lang('search')); $this->t->set_var("lang_send",lang('send')); $this->t->set_var('lang_save_as_draft',lang('save as draft')); $this->t->set_var("lang_back_to_folder",lang('back to folder')); $this->t->set_var("lang_attachments",lang('attachments')); $this->t->set_var("lang_add",lang('add')); $this->t->set_var("lang_remove",lang('remove')); $this->t->set_var("lang_priority",lang('priority')); $this->t->set_var("lang_normal",lang('normal')); $this->t->set_var("lang_high",lang('high')); $this->t->set_var("lang_low",lang('low')); $this->t->set_var("lang_signature",lang('signature')); $this->t->set_var("lang_stationery",lang('stationery')); $this->t->set_var("lang_select_folder",lang('select folder')); $this->t->set_var('lang_max_uploadsize',lang('max uploadsize')); $this->t->set_var('lang_adding_file_please_wait',lang('Adding file to message. Please wait!')); $this->t->set_var('lang_receive_notification',lang('Receive notification')); $this->t->set_var('lang_no_address_set',lang('can not send message. no recipient defined!')); $this->t->set_var("th_bg",$GLOBALS['egw_info']["theme"]["th_bg"]); $this->t->set_var("bg01",$GLOBALS['egw_info']["theme"]["bg01"]); $this->t->set_var("bg02",$GLOBALS['egw_info']["theme"]["bg02"]); $this->t->set_var("bg03",$GLOBALS['egw_info']["theme"]["bg03"]); } } ?>