From 102bc9d6a2cb7882e05629d280e8be8282bfae5d Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Wed, 21 Aug 2013 10:47:20 +0000 Subject: [PATCH] several stuff towards a compose window; a testhtmlarea template to test/figure out issues regarding disabled --- mail/inc/class.mail_bo.inc.php | 87 +++++-- mail/inc/class.mail_compose.inc.php | 315 +++++++++++++----------- mail/inc/class.mail_hooks.inc.php | 6 + mail/inc/class.mail_signatures.inc.php | 296 ++++++++++++++++++++++ mail/inc/class.mail_ui.inc.php | 66 +++-- mail/js/app.js | 48 ++-- mail/templates/default/compose.xet | 23 +- mail/templates/default/index.xet | 1 + mail/templates/default/sieve.index.xet | 4 +- mail/templates/default/testhtmlarea.xet | 17 ++ 10 files changed, 664 insertions(+), 199 deletions(-) create mode 100644 mail/inc/class.mail_signatures.inc.php create mode 100644 mail/templates/default/testhtmlarea.xet diff --git a/mail/inc/class.mail_bo.inc.php b/mail/inc/class.mail_bo.inc.php index 8d5039f7aa..2f17e779c6 100644 --- a/mail/inc/class.mail_bo.inc.php +++ b/mail/inc/class.mail_bo.inc.php @@ -213,7 +213,7 @@ class mail_bo else { // make sure the prefs are up to date for the profile to load - $loadfailed = false; + $loadfailed = $alreadytriedreloading = false; self::$instances[$_profileID]->mailPreferences = self::$instances[$_profileID]->bopreferences->getPreferences(true,$_profileID); //error_log(__METHOD__.__LINE__." ReRead the Prefs for ProfileID ".$_profileID.' called from:'.function_backtrace()); if (self::$instances[$_profileID]->mailPreferences) @@ -228,13 +228,29 @@ class mail_bo } else { - $loadfailed=true; + // first try reloading without restore + if ($_restoreSession==true) self::$instances[$_profileID] = new mail_bo('utf-8',false,$_profileID); + if (!self::$instances[$_profileID]->mailPreferences) { + if (self::$debug) error_log(__METHOD__.__LINE__.' something wrong:'.array2string($_restoreSession).' mailPreferences could not be loaded!'); + $loadfailed=$alreadytriedreloading=true; + } + } + if ($_profileID>0 && empty(self::$instances[$_profileID]->icServer->host)&&$alreadytriedreloading==false) + { + if ($_restoreSession==true) self::$instances[$_profileID] = new mail_bo('utf-8',false,$_profileID); + if (empty(self::$instances[$_profileID]->icServer->host)) + { + if (self::$debug) error_log(__METHOD__.__LINE__.' something critically wrong for '.$_profileID.' RestoreSession:'.array2string($_restoreSession).'->'.array2string(self::$instances[$_profileID]->icServer).' No Server host set!'); + $loadfailed=$alreadytriedreloading=true; + } } if ($loadfailed) { - error_log(__METHOD__.__LINE__." ReRead of the Prefs for ProfileID ".$_profileID.' failed for icServer; trigger new instance. called from:'.function_backtrace()); - // restore session seems to provide an incomplete session - self::$instances[$_profileID] = new mail_bo('utf-8',false,$_profileID); + $newprofileID = ($alreadytriedreloading ? emailadmin_bo::getUserDefaultProfileID():$_profileID); + if ($alreadytriedreloading) error_log(__METHOD__.__LINE__." Loading the Profile for ProfileID ".$_profileID.' failed for icServer; trigger new instance for Default-Profile '.$newprofileID.'. called from:'.function_backtrace()); + // try loading the default profile for the user + self::$instances[$newprofileID] = new mail_bo('utf-8',false,$newprofileID); + $_profileID = $newprofileID; } } self::$instances[$_profileID]->profileID = $_profileID; @@ -571,7 +587,7 @@ class mail_bo */ function closeConnection() { //if ($icServer->_connected) error_log(__METHOD__.__LINE__.' disconnect from Server'); - if ($icServer->_connected) $this->icServer->disconnect(); + if ($this->icServer->_connected) $this->icServer->disconnect(); } /** @@ -1588,8 +1604,18 @@ class mail_bo { $rfcAddr = imap_rfc822_parse_adrlist($_string,''); if (!isset(self::$idna2)) self::$idna2 = new egw_idna; + $stringA = array(); //$_string = str_replace($rfcAddr[0]->host,self::$idna2->decode($rfcAddr[0]->host),$_string); - $_string = imap_rfc822_write_address($rfcAddr[0]->mailbox,self::$idna2->decode($rfcAddr[0]->host),$rfcAddr[0]->personal); + foreach ((array)$rfcAddr as $_rfcAddr) + { + if ($_rfcAddr->host=='.SYNTAX-ERROR.') + { + $stringA = array(); + break; // skip idna conversion if we encounter an error here + } + $stringA[] = imap_rfc822_write_address($_rfcAddr->mailbox,self::$idna2->decode($_rfcAddr->host),$_rfcAddr->personal); + } + if (!empty($stringA)) $_string = implode(',',$stringA); } if ($_tryIDNConversion==='FORCE') { @@ -3956,6 +3982,11 @@ class mail_bo error_log(__METHOD__.__LINE__.array2string($retValue->message)); $retValue = null; } + // if SUBJECT is an array, use thelast one, as we assume something with the unfolding for the subject did not work + if (is_array($retValue['SUBJECT'])) + { + $retValue['SUBJECT'] = $retValue['SUBJECT'][count($retValue['SUBJECT'])-1]; + } return ($decode ? self::decode_header($retValue,true):$retValue); } @@ -4271,7 +4302,8 @@ class mail_bo //error_log(__METHOD__.__LINE__.array2string(substr($structure->parameters['NAME'],0,strlen('data:')))); if (!is_array($structure->parameters['NAME']) && substr($structure->parameters['NAME'],0,strlen('data:'))==='data:') { $namecounter++; - return lang("unknown").$namecounter.($structure->subType ? ".".$structure->subType : ""); + $ext = mime_magic::mime2ext($structure->Type.'/'.$structure->subType); + return lang("unknown").$namecounter.($ext?$ext:($structure->subType ? ".".$structure->subType : "")); } if (is_array($structure->parameters['NAME'])) $structure->parameters['NAME'] = implode(' ',$structure->parameters['NAME']); return rawurldecode(self::decode_header($structure->parameters['NAME'])); @@ -4321,7 +4353,8 @@ class mail_bo } } $namecounter++; - return lang("unknown").$namecounter.($structure->subType ? ".".$structure->subType : ""); + $ext = mime_magic::mime2ext($structure->Type.'/'.$structure->subType); + return lang("unknown").$namecounter.($ext?$ext:($structure->subType ? ".".$structure->subType : "")); } } @@ -4420,7 +4453,8 @@ class mail_bo { $attachment = translation::convert($attachment,$structure->parameters['CHARSET'],self::$displayCharset); } - + $ext = mime_magic::mime2ext($structure->type .'/'. $structure->subType); + if ($ext && stripos($filename,'.')===false && stripos($filename,$ext)===false) $filename = trim($filename).'.'.$ext; $attachmentData = array( 'type' => $structure->type .'/'. $structure->subType, 'filename' => $filename, @@ -4432,6 +4466,8 @@ class mail_bo if ( $filename == 'winmail.dat' && $_winmail_nr > 0 && ( $wmattach = $this->decode_winmail( $_uid, $_partID, $_winmail_nr ) ) ) { + $ext = mime_magic::mime2ext($wmattach['type']); + if ($ext && stripos($wmattach['name'],'.')===false && stripos($wmattach['name'],$ext)===false) $wmattach['name'] = trim($wmattach['name']).'.'.$ext; $attachmentData = array( 'type' => $wmattach['type'], 'filename' => $wmattach['name'], @@ -4670,13 +4706,14 @@ class mail_bo /** * createHeaderInfoSection - creates a textual headersection from headerobject * @param array header headerarray may contain SUBJECT,FROM,SENDER,TO,CC,BCC,DATE,PRIORITY,IMPORTANCE - * @param string headline Text tom use for headline + * @param string headline Text tom use for headline, if SUPPRESS, supress headline and footerline * @param bool createHTML do it with HTML breaks * @return string a preformatted string with the information of the header worked into it */ static function createHeaderInfoSection($header,$headline='', $createHTML = false) { $headdata = null; + //error_log(__METHOD__.__LINE__.array2string($header).function_backtrace()); if ($header['SUBJECT']) $headdata = lang('subject').': '.$header['SUBJECT'].($createHTML?"
":"\n"); if ($header['FROM']) $headdata .= lang('from').': '.self::convertAddressArrayToString($header['FROM'], $createHTML).($createHTML?"
":"\n"); if ($header['SENDER']) $headdata .= lang('sender').': '.self::convertAddressArrayToString($header['SENDER'], $createHTML).($createHTML?"
":"\n"); @@ -4689,13 +4726,13 @@ class mail_bo //if ($mailcontent['headers']['ORGANIZATION']) $headdata .= lang('organization').': '.$mailcontent['headers']['ORGANIZATION']."\ if (!empty($headdata)) { - if (!empty($headline)) $headdata = "---------------------------- $headline ----------------------------".($createHTML?"
":"\n").$headdata; - if (empty($headline)) $headdata = "--------------------------------------------------------".($createHTML?"
":"\n").$headdata; - $headdata .= "--------------------------------------------------------".($createHTML?"
":"\n"); + if (!empty($headline) && $headline != 'SUPPRESS') $headdata = "---------------------------- $headline ----------------------------".($createHTML?"
":"\n").$headdata; + if (empty($headline)) $headdata = ($headline != 'SUPPRESS'?"--------------------------------------------------------".($createHTML?"
":"\n"):'').$headdata; + $headdata .= ($headline != 'SUPPRESS'?"--------------------------------------------------------".($createHTML?"
":"\n"):''); } else { - $headdata = "--------------------------------------------------------".($createHTML?"
":"\n"); + $headdata = ($headline != 'SUPPRESS'?"--------------------------------------------------------".($createHTML?"
":"\n"):''); } return $headdata; } @@ -4753,6 +4790,26 @@ class mail_bo return $returnAddr; } + /** + * Merges a given content with contact data + * + * @param string $content + * @param array $ids array with contact id(s) + * @param string &$err error-message on error + * @return string/boolean merged content or false on error + */ + function merge($content,$ids,$mimetype='') + { + $contacts = new addressbook_bo(); + $mergeobj = new addressbook_merge(); + + if (empty($mimetype)) $mimetype = (strlen(strip_tags($content)) == strlen($content) ?'text/plain':'text/html'); + $rv = $mergeobj->merge_string($content,$ids,$err,$mimetype, array(), self::$displayCharset); + if (empty($rv) && !empty($content) && !empty($err)) $rv = $content; + if (!empty($err) && !empty($content) && !empty($ids)) error_log(__METHOD__.__LINE__.' Merge failed for Ids:'.array2string($ids).' ContentType:'.$mimetype.' Content:'.$content.' Reason:'.array2string($err)); + return $rv; + } + /** * Hook stuff */ diff --git a/mail/inc/class.mail_compose.inc.php b/mail/inc/class.mail_compose.inc.php index 5c3ef5c8b0..cdfcd12812 100644 --- a/mail/inc/class.mail_compose.inc.php +++ b/mail/inc/class.mail_compose.inc.php @@ -23,6 +23,7 @@ class mail_compose ( 'action' => True, 'compose' => True, + 'testhtmlarea' => True, 'composeFromDraft' => True, 'getAttachment' => True, 'fileSelector' => True, @@ -198,7 +199,7 @@ class mail_compose if (!$messageUid) { print ""; //try to reopen the mail from session data - $this->compose('to',true); + $this->compose(null,null,'to',true); return; } // saving as draft, does not mean closing the message @@ -211,7 +212,7 @@ class mail_compose { //error_log(__METHOD__.__LINE__.' (re)open drafted message with new UID: '.$messageUid.' in folder:'.$folder); $uicompose->bocompose->getDraftData($uicompose->mail_bo->icServer, $folder, $messageUid); - $uicompose->compose('to',true); + $uicompose->compose(null,null,'to',true); return; } } else { @@ -258,25 +259,29 @@ class mail_compose $this->preferencesArray['message_forwarding'] = $buff; } } - $this->compose($_focusElement); + $this->compose(null,null,$_focusElement); } /** * function compose * this function is used to fill the compose dialog with the content provided by session data * + * @var content array the etemplate content array + * @var msg string a possible message to be passed and displayed to the userinterface * @var _focusElement varchar subject, to, body supported * @var suppressSigOnTop boolean * @var isReply boolean */ - function compose($_focusElement='to',$suppressSigOnTop=false, $isReply=false) + function compose(array $content=null,$msg=null, $_focusElement='to',$suppressSigOnTop=false, $isReply=false) { //error_log(__METHOD__.__LINE__.array2string($_REQUEST)); + error_log(__METHOD__.__LINE__.array2string($content)); + 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->getSessionData(); + $sessionData = /*$content; // */$this->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->preferencesArray['attachVCardAtCompose']) && $this->preferencesArray['attachVCardAtCompose'])) @@ -493,9 +498,6 @@ class mail_compose if ($_REQUEST['preset'][$name]) $sessionData[$name] = $_REQUEST['preset'][$name]; } } - $etpl = new etemplate_new('mail.compose'); - $content = array(); - _debug_array($sessionData); // is the to address set already? if (!empty($_REQUEST['send_to'])) { @@ -591,18 +593,6 @@ class mail_compose if (($suppressSigOnTop || $sessionData['isDraft']) && !empty($sessionData['identity'])) $presetId = (int)$sessionData['identity']; /* - $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( @@ -669,101 +659,11 @@ class mail_compose $this->t->set_var('errorInfo',' '); } */ - // header - $allIdentities = $this->mailPreferences->getIdentity(); - unset($allIdentities[0]); - //_debug_array($allIdentities); - if (is_null(mail_bo::$mailConfig)) mail_bo::$mailConfig = config::read('mail'); - // not set? -> use default, means full display of all available data - if (!isset(mail_bo::$mailConfig['how2displayIdentities'])) mail_bo::$mailConfig['how2displayIdentities'] =''; - $globalIds = 0; - $defaultIds = array(); - foreach($allIdentities as $key => $singleIdentity) { - if ($singleIdentity->id<0){ $globalIds++; }/*else{ unset($allIdentities[$key]);}*/ - // there could be up to 2 default IDS. the activeProfile and another on marking the desired Identity to choose - if(!empty($singleIdentity->default) && $singleIdentity->default==1) $defaultIds[$singleIdentity->id] = $singleIdentity->id; - } - //error_log(__METHOD__.__LINE__.' Identities regarded/marked as default:'.array2string($defaultIds). ' MailProfileActive:'.$this->mail_bo->profileID); - // if there are 2 defaultIDs, its most likely, that the user choose to set - // the one not being the activeServerProfile to be his default Identity - if (count($defaultIds)>1) unset($defaultIds[$this->mail_bo->profileID]); - $defaultIdentity = 0; - $identities = array(); - foreach($allIdentities as $key => $singleIdentity) { - //$identities[$singleIdentity->id] = $singleIdentity->realName.' <'.$singleIdentity->emailAddress.'>'; - $iS = mail_bo::generateIdentityString($singleIdentity); - if (mail_bo::$mailConfig['how2displayIdentities']=='' || count($allIdentities) ==1 || count($allIdentities) ==$globalIds) - { - $id_prepend =''; - } - else - { - $id_prepend = '('.$singleIdentity->id.') '; - } - //if ($singleIdentity->default) error_log(__METHOD__.__LINE__.':'.$presetId.'->'.$key.'('.$singleIdentity->id.')'.'#'.$iS.'#'); - if (array_search($id_prepend.$iS,$identities)===false) $identities[$singleIdentity->id] = $id_prepend.$iS; - if(in_array($singleIdentity->id,$defaultIds) && $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 = mail_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 = mail_bo::htmlentities($sessionData['subject'],$this->displayCharset); @@ -798,11 +698,61 @@ class mail_compose $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(); + //identities and signature stuff + $allIdentities = $this->preferences->getIdentity(); + unset($allIdentities[0]); + //_debug_array($allIdentities); + if (is_null(mail_bo::$mailConfig)) mail_bo::$mailConfig = config::read('mail'); + // not set? -> use default, means full display of all available data + if (!isset(mail_bo::$mailConfig['how2displayIdentities'])) mail_bo::$mailConfig['how2displayIdentities'] =''; + $globalIds = 0; + $defaultIds = array(); + foreach($allIdentities as $key => $singleIdentity) { + if ($singleIdentity->id<0){ $globalIds++; }/*else{ unset($allIdentities[$key]);}*/ + // there could be up to 2 default IDS. the activeProfile and another on marking the desired Identity to choose + if(!empty($singleIdentity->default) && $singleIdentity->default==1) + { + $defaultIds[$singleIdentity->id] = $singleIdentity->id; + $selectedSender = mail_bo::generateIdentityString($singleIdentity); + } + } + //error_log(__METHOD__.__LINE__.' Identities regarded/marked as default:'.array2string($defaultIds). ' MailProfileActive:'.$this->mail_bo->profileID); + // if there are 2 defaultIDs, its most likely, that the user choose to set + // the one not being the activeServerProfile to be his default Identity + if (count($defaultIds)>1) unset($defaultIds[$this->mail_bo->profileID]); + $defaultIdentity = 0; + $identities = array(); + foreach($allIdentities as $key => $singleIdentity) { + //$identities[$singleIdentity->id] = $singleIdentity->realName.' <'.$singleIdentity->emailAddress.'>'; + $iS = mail_bo::generateIdentityString($singleIdentity); + $shortIDString = trim(mail_bo::generateIdentityString($singleIdentity,false)); + if (mail_bo::$mailConfig['how2displayIdentities']=='' || count($allIdentities) ==1 || count($allIdentities) ==$globalIds) + { + $id_prepend =''; + } + else + { + $id_prepend = '('.$singleIdentity->id.') '; + } + //if ($singleIdentity->default) error_log(__METHOD__.__LINE__.':'.$presetId.'->'.$key.'('.$singleIdentity->id.')'.'#'.$iS.'#'); + if (array_search($id_prepend.$iS,$identities)===false) + { + $identities[$singleIdentity->id] = $id_prepend.$iS; + $sel_options['SENDER'][$iS] = $id_prepend.$iS; + } + if(in_array($singleIdentity->id,$defaultIds) && $defaultIdentity==0) + { + //_debug_array($singleIdentity); + $defaultIdentity = $singleIdentity->id; + //$defaultIdentity = $key; + $sessionData['signatureID'] = (!empty($singleIdentity->signature) ? $singleIdentity->signature : $sessionData['signatureID']); + } + } + + // fetch the signature, prepare the select box, ... + $boSignatures = new mail_signatures(); $signatures = $boSignatures->getListOfSignatures(); if (empty($sessionData['signatureID'])) { @@ -883,6 +833,7 @@ class mail_compose $sessionData['body'] = ($font_span?$font_span:' ').$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') @@ -922,32 +873,12 @@ class mail_compose } else { $border="1px solid gray; margin:1px"; // initalize the CKEditor Object to enable switching back and force - $editor = html::fckEditorQuick('body', 'ascii', $sessionData['body'],'500px','99%',false,$border); -/* - $this->t->set_var('tinymce', $editor); //html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%')); - $this->t->set_var('mimeType', 'text'); -*/ + //$editor = html::fckEditorQuick('body', 'ascii', $sessionData['body'],'500px','99%',false,$border); $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) { @@ -958,7 +889,6 @@ class mail_compose // 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) @@ -986,12 +916,89 @@ class mail_compose // $this->t->set_var('attachment_rows',''); } -// $this->t->pparse("out","attachment"); -$content['is_html'] = $this->sessionData['mimeType'] == 'html'; -$content['mailtext'] = 'garbage'; + // signature stuff set earlier + $sel_options['signatureID'] = $selectSignatures; + $content['signatureID'] = ($presetSig ? $presetSig : $sessionData['signatureID']); + // end signature stuff + + // stationery stuff + $bostationery = new emailadmin_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; + } + //_debug_array($selectStationeries); + $sel_options['stationeryID'] = $selectStationeries; + // if ID of signature Select Box is set, we allow for changing the sig onChange of the signatueSelect + $content['stationeryID'] = ($presetStationery ? $presetStationery : 0); + // end stationery stuff + //$sessionData['bcc'] = array('kl@stylite.de','kl@leithoff.net'); + // address stuff like 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 = mail_bo::htmlentities($address, $this->displayCharset); + $content[strtoupper($destination)][]=$address; + $destinationRows++; + } + } + } + if ($content) + { + } + else + { + $content['is_html'] = ($this->sessionData['mimeType'] == 'html'?true:''); + $content['is_plain'] = ($this->sessionData['mimeType'] == 'html'?'':true); + //error_log(__METHOD__.__LINE__.array2string(array($sel_options['SENDER'],$selectedSender))); + $content['SENDER'] = ($selectedSender?(array)$selectedSender:''); + //error_log(__METHOD__.__LINE__.$sessionData['body']); + $content['mail_'.($this->sessionData['mimeType'] == 'html'?'html':'plain').'text'] = $sessionData['body']; + } + $etpl = new etemplate_new('mail.compose'); $etpl->exec('mail.mail_compose.compose',$content,$sel_options,$readonlys,$preserv,2); } + function testhtmlarea($content=null) + { + error_log(__METHOD__.__LINE__.array2string($content)); + if ($content) + { + $this->sessionData['mimeType'] = 'plain'; + $content['is_html'] = ($this->sessionData['mimeType'] == 'html'?true:''); + $content['is_plain'] = ($this->sessionData['mimeType'] == 'html'?'':true); + } + else + { + $sessionData['body'] = 'bla bla bla'; + $content['is_html'] = ($this->sessionData['mimeType'] == 'html'?true:''); + $content['is_plain'] = ($this->sessionData['mimeType'] == 'html'?'':true); + //error_log(__METHOD__.__LINE__.array2string(array($sel_options['SENDER'],$selectedSender))); + $content['SENDER'] = ($selectedSender?(array)$selectedSender:''); + //error_log(__METHOD__.__LINE__.$sessionData['body']); + $content['mail_'.($this->sessionData['mimeType'] == 'html'?'html':'plain').'text'] = $sessionData['body']; + } + $etpl = new etemplate_new('mail.testhtmlarea'); + $etpl->exec('mail.mail_compose.testhtmlarea',$content,$sel_options,$readonlys,$preserv,2); + } + function composeFromDraft() { $icServer = (int)$_GET['icServer']; $folder = (isset($_GET['folder'])?base64_decode($_GET['folder']):base64_decode($_GET['mailbox'])); @@ -2492,6 +2499,34 @@ $content['mailtext'] = 'garbage'; } function ajax_searchIdentities() { + $_searchString = trim($_REQUEST['query']); + $allIdentities = $this->preferences->getIdentity(); + foreach($allIdentities as $key => $singleIdentity) + { + /* + if($singleIdentity->default === true) + { + $selectedAddresses[$singleIdentity->emailAddress] = $singleIdentity->emailAddress; + } + */ + $idString = mail_bo::generateIdentityString($singleIdentity); + $shortIDString = mail_bo::generateIdentityString($singleIdentity,false); + if (empty($_searchString) || ($_searchString && stripos($idString,$_searchString)!==false)) + { + //error_log(__METHOD__.__LINE__.$idString.'<->'.$shortIDString); + $predefinedAddresses[$idString] = array( + 'id'=>$idString, + 'label' => $idString, + // Add just name for nice display, with title for hover + 'name' => $shortIDString, + 'title' => $idString + ); + } + } + if (is_array($predefinedAddresses)) asort($predefinedAddresses); + header('Content-Type: application/json; charset=utf-8'); + echo json_encode($predefinedAddresses); + common::egw_exit(); } function ajax_searchFolder() { @@ -2536,7 +2571,7 @@ $content['mailtext'] = 'garbage'; } public static function ajax_searchAddress() { - error_log(__METHOD__. "request from seachAddress" . $_REQUEST['query']); + //error_log(__METHOD__. "request from seachAddress " . $_REQUEST['query']); $_searchString = trim($_REQUEST['query']); if ($GLOBALS['egw_info']['user']['apps']['addressbook']) { //error_log(__METHOD__.__LINE__.array2string($_searchString)); diff --git a/mail/inc/class.mail_hooks.inc.php b/mail/inc/class.mail_hooks.inc.php index dc5a86c707..fdd6377275 100644 --- a/mail/inc/class.mail_hooks.inc.php +++ b/mail/inc/class.mail_hooks.inc.php @@ -799,6 +799,12 @@ class mail_hooks 'link'=>false, 'icon' => false ); + $file[] = array( + 'no_lang' => true, + 'text'=>'', + 'link'=>false, + 'icon' => false + ); $file[] = array( 'no_lang' => true, 'text'=>'', diff --git a/mail/inc/class.mail_signatures.inc.php b/mail/inc/class.mail_signatures.inc.php new file mode 100644 index 0000000000..f7509ab1fb --- /dev/null +++ b/mail/inc/class.mail_signatures.inc.php @@ -0,0 +1,296 @@ + + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +class mail_signatures +{ + var $tableName = 'egw_felamimail_signatures'; + + var $fm_signatureid = NULL; + + var $fm_description = NULL; + + var $fm_signature = NULL; + + var $fm_defaultsignature = NULL; + + var $boemailadmin; + var $profileData; + + function mail_signatures($_signatureID = NULL) { + $this->accountID = $GLOBALS['egw_info']['user']['account_id']; + + if($_signatureID !== NULL) { + $this->read($_signatureID); + } + $this->boemailadmin = new emailadmin_bo(); + $this->profileData = $this->boemailadmin->getUserProfile('felamimail'); + } + + function getDefaultSignature() { + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + $where = array( + 'fm_accountid' => $this->accountID, + 'fm_defaultsignature' => true + ); + + $db->select($this->tableName,'fm_signatureid,fm_description,fm_signature,fm_defaultsignature', + $where, __LINE__, __FILE__); + + if(($row = $db->row(true))) { + return $row['fm_signatureid']; + } + + return false; + } + + function read($_signatureID) { + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + $where = array( + 'fm_accountid' => $this->accountID, + 'fm_signatureid' => $_signatureID + ); + + $db->select($this->tableName,'fm_signatureid,fm_description,fm_signature,fm_defaultsignature', + $where, __LINE__, __FILE__); + + if(($data = $db->row(true))) { + if (empty($data['fm_description'])) + { + $buff = trim(substr(str_replace(array("\r\n","\r","\n","\t"),array(" "," "," "," "),translation::convertHTMLToText($data['fm_signature'])),0,100)); + $data['fm_description'] = $buff?$buff:lang('none'); + } + $this->fm_signatureid = $data['fm_signatureid']; + $this->fm_description = $data['fm_description']; + $this->fm_signature = $data['fm_signature']; + $this->fm_defaultsignature = (bool)$data['fm_defaultsignature']; + + return TRUE; + } + + return FALSE; + } + + function deleteSignatures($_signatureID) + { + if(!is_array($_signatureID)) { + return false; + } + foreach($_signatureID as $signatureID) { + #error_log("$signatureID"); + $this->delete($signatureID); + } + } + + private function delete($_signatureID = FALSE) { + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + if($_signatureID !== FALSE) { + $signatureID = (int)$_signatureID; + } else { + $signatureID = (int)$this->fm_signatureid; + } + + $where = array( + 'fm_accountid' => $this->accountID, + 'fm_signatureid' => $signatureID + ); + + $db->delete($this->tableName, $where, __LINE__, __FILE__); + + if ($db->affected_rows() === 0) { + return false; + } + + return true; + } + + function saveSignature($_signatureID, $_description, $_signature, $_isDefaultSignature) + { + if($_signatureID == -1) { + // the systemwide profile + // can only be made the default profile + + return -1; + } else { + if($this->profileData->ea_user_defined_signatures == false) { + return false; + } + + $this->fm_description = $_description; + $this->fm_signature = $_signature; + $this->fm_defaultsignature = (bool)$_isDefaultSignature; + if((int)$_signatureID > 0) { + $this->fm_signatureid = (int)$_signatureID; + } + + $this->save(); + + return $this->fm_signatureid; + } + } + + private function save() { + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + // reset fm_defaultsignature in all other rows to false + if($this->fm_defaultsignature === true) { + $where = array( + 'fm_accountid' => $this->accountID, + ); + $data = array( + 'fm_defaultsignature' => false, + ); + + $db->update($this->tableName, $data, $where, __LINE__, __FILE__); + } + if (empty($this->fm_description)) + { + $buff = trim(substr(str_replace(array("\r\n","\r","\n","\t"),array(" "," "," "," "),translation::convertHTMLToText($this->fm_signature)),0,100)); + $this->fm_description = $buff?$buff:lang('none'); + } + $data = array( + 'fm_accountid' => $this->accountID, + 'fm_signature' => $this->fm_signature, + 'fm_description' => $this->fm_description, + 'fm_defaultsignature' => $this->fm_defaultsignature, + ); + + + if($this->fm_signatureid === NULL) { + $db->insert($this->tableName, $data, '', __LINE__, __FILE__); + + $this->fm_signatureid = $db->get_last_insert_id($this->tableName,'fm_signatureid'); + + return TRUE; + } else { + $where = array( + 'fm_accountid' => $this->accountID, + 'fm_signatureid' => $this->fm_signatureid, + ); + $db->update($this->tableName, $data, $where, __LINE__, __FILE__); + + return TRUE; + } + } + + function search() { + $signatures = array(); + + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + $where = array( + 'fm_accountid' => $this->accountID + ); + + $db->select($this->tableName,'fm_signatureid,fm_description,fm_signature,fm_defaultsignature', + $where, __LINE__, __FILE__); + + while ($data = $db->row(true)) { + if (empty($data['fm_description'])) + { + $buff = trim(substr(str_replace(array("\r\n","\r","\n","\t"),array(" "," "," "," "),translation::convertHTMLToText($data['fm_signature'])),0,100)); + $data['fm_description'] = $buff?$buff:lang('none'); + } + + $signatureData = array( + 'fm_signatureid' => $data['fm_signatureid'], + 'fm_description' => $data['fm_description'], + 'fm_signature' => $data['fm_signature'], + 'fm_defaultsignature' => (bool)$data['fm_defaultsignature'], + ); + $signatures[$data['fm_signatureid']] = $signatureData; + } + + return $signatures; + } + + function getListOfSignatures() { + //$fmSignatures = new felamimail_signatures(); + + #$profileData = $boemailadmin->getUserProfile('felamimail'); + + $systemSignatures = array(); + if(!empty($this->profileData->ea_default_signature)) { + $systemSignatures[-1] = array( + 'fm_signatureid' => -1, + 'fm_description' => lang('system signature'), + 'fm_defaultsignature' => FALSE, + ); + + if($this->profileData->ea_user_defined_signatures != true) { + $systemSignatures[-1]['fm_defaultsignature'] = TRUE; + } + } + // return only systemsignature, if no user defined signatures are enabled + if($this->profileData->ea_user_defined_signatures != true) { + return $systemSignatures; + } + + $signatures = $this->search(); + + if(count($signatures) == 0 && + !isset($GLOBALS['egw_info']['user']['preferences']['mail']['email_sig_copied']) && + !empty($GLOBALS['egw_info']['user']['preferences']['mail']['email_sig'])) { + + $GLOBALS['egw']->preferences->read_repository(); + $newSignature = new mail_signatures(); + $newSignature->fm_description = lang('default signature'); + $newSignature->fm_signature = nl2br($GLOBALS['egw_info']['user']['preferences']['felamimail']['email_sig']); + $newSignature->fm_defaultsignature = true; + $newSignature->save(); + $GLOBALS['egw']->preferences->add('mail', 'email_sig_copied', true); + $GLOBALS['egw']->preferences->save_repository(); + + $signatures = $this->search(); + } + + // make systemsignature the default, if no other signature is defined as default signature + if($this->getDefaultSignature() === false) { + $systemSignatures[-1]['fm_defaultsignature'] = TRUE; + } + + $signatures = array_merge($systemSignatures, $signatures); + #_debug_array($signatures); + return $signatures; + } + + function getSignature($_signatureID, $_unparsed = false) + { + if($_signatureID == -1) { + + $systemSignatureIsDefaultSignature = $this->getDefaultSignature(); + + $signature = new mail_signatures(); + $signature->fm_signatureid = -1; + $signature->fm_description = 'eGroupWare '. lang('default signature'); + $signature->fm_signature = ($_unparsed === true ? $this->profileData->ea_default_signature : $GLOBALS['egw']->preferences->parse_notify($this->profileData->ea_default_signature)); + $signature->fm_defaultsignature = $systemSignatureIsDefaultSignature; + + return $signature; + + } else { + $signature = new mail_signatures($_signatureID); + if($_unparsed === false) { + $signature->fm_signature = ($_unparsed === true ? $this->profileData->ea_default_signature : $GLOBALS['egw']->preferences->parse_notify($signature->fm_signature)); + } + return $signature; + } + } +} +?> diff --git a/mail/inc/class.mail_ui.inc.php b/mail/inc/class.mail_ui.inc.php index 42c8741af0..deb98f29ec 100644 --- a/mail/inc/class.mail_ui.inc.php +++ b/mail/inc/class.mail_ui.inc.php @@ -51,6 +51,13 @@ class mail_ui */ static $delimiter = '::'; + /** + * nextMatch name for index + * + * @var string + */ + static $nm_index = 'nm'; + /** * instance of mail_bo * @@ -157,11 +164,11 @@ class mail_ui if (!is_array($content)) { $content = array( - 'nm' => egw_session::appsession('index','mail'), + self::$nm_index => egw_session::appsession('index','mail'), ); - if (!is_array($content['nm'])) + if (!is_array($content[self::$nm_index])) { - $content['nm'] = array( + $content[self::$nm_index] = array( 'get_rows' => 'mail.mail_ui.get_rows', // I method/callback to request the data for the rows eg. 'notes.bo.get_rows' 'filter' => 'any', // filter is used to choose the mailbox 'no_filter2' => false, // I disable the 2. filter (params are the same as for filter) @@ -178,10 +185,10 @@ class mail_ui 'actions' => self::get_actions(), 'row_id' => 'row_id', // is a concatenation of trim($GLOBALS['egw_info']['user']['account_id']):profileID:base64_encode(FOLDERNAME):uid ); - //$content['nm']['path'] = self::get_home_dir(); + //$content[self::$nm_index]['path'] = self::get_home_dir(); } } - $content['nm']['csv_fields'] = false; + $content[self::$nm_index]['csv_fields'] = false; if ($msg) { $content['msg'] = $msg; @@ -195,9 +202,9 @@ class mail_ui $this->mail_bo->restoreSessionData(); // filter is used to choose the mailbox - //if (!isset($content['nm']['foldertree'])) // maybe we fetch the folder here + //if (!isset($content[self::$nm_index]['foldertree'])) // maybe we fetch the folder here /* - $sel_options['nm']['foldertree'] = array('id' => 0, 'item' => array( + $sel_options[self::$nm_index]['foldertree'] = array('id' => 0, 'item' => array( array('id' => '/INBOX', 'text' => 'INBOX', 'im0' => 'kfm_home.png', 'child' => '1', 'item' => array( array('id' => '/INBOX/sub', 'text' => 'sub'), array('id' => '/INBOX/sub2', 'text' => 'sub2'), @@ -207,15 +214,15 @@ class mail_ui )), )); - $content['nm']['foldertree'] = '/INBOX/sub'; + $content[self::$nm_index]['foldertree'] = '/INBOX/sub'; */ - $sel_options['nm']['foldertree'] = $this->getFolderTree(false); + $sel_options[self::$nm_index]['foldertree'] = $this->getFolderTree(false); $sessionFolder = $this->mail_bo->sessionData['maibox']; if ($this->mail_bo->folderExists($sessionFolder)) { - $content['nm']['selectedFolder'] = $this->mail_bo->profileID.self::$delimiter.$this->mail_bo->sessionData['maibox']; + $content[self::$nm_index]['selectedFolder'] = $this->mail_bo->profileID.self::$delimiter.$this->mail_bo->sessionData['maibox']; $this->mail_bo->reopen($sessionFolder); // needed to fetch full set of capabilities } // since we are connected,(and selected the folder) we check for capabilities SUPPORTS_KEYWORDS to eventually add the keyword filters @@ -230,19 +237,18 @@ class mail_ui )); } - if (!isset($content['nm']['foldertree'])) $content['nm']['foldertree'] = $this->mail_bo->profileID.self::$delimiter.'INBOX'; - if (!isset($content['nm']['selectedFolder'])) $content['nm']['selectedFolder'] = $this->mail_bo->profileID.self::$delimiter.'INBOX'; - $content['nm']['foldertree'] = $content['nm']['selectedFolder']; + if (!isset($content[self::$nm_index]['foldertree'])) $content[self::$nm_index]['foldertree'] = $this->mail_bo->profileID.self::$delimiter.'INBOX'; + if (!isset($content[self::$nm_index]['selectedFolder'])) $content[self::$nm_index]['selectedFolder'] = $this->mail_bo->profileID.self::$delimiter.'INBOX'; + $content[self::$nm_index]['foldertree'] = $content[self::$nm_index]['selectedFolder']; //$sel_options['cat_id'] = array(1=>'none'); $sel_options['filter2'] = $this->searchTypes; $sel_options['filter'] = $this->statusTypes; - //if (!isset($content['nm']['cat_id'])) $content['nm']['cat_id'] = 'All'; + //if (!isset($content[self::$nm_index]['cat_id'])) $content[self::$nm_index]['cat_id'] = 'All'; $etpl = new etemplate_new('mail.index'); // Set tree actions - $etpl->set_cell_attribute('nm[foldertree]','actions', array( - + $etpl->setElementAttribute(self::$nm_index.'[foldertree]','actions', array( 'drop_move_mail' => array( 'type' => 'drop', 'acceptedTypes' => 'mail', @@ -277,7 +283,7 @@ class mail_ui ) )); //error_log(__METHOD__.__LINE__.array2string($content)); - if (empty($content['nm']['filter2']) || empty($content['nm']['search'])) $content['nm']['filter2']='quick'; + if (empty($content[self::$nm_index]['filter2']) || empty($content[self::$nm_index]['search'])) $content[self::$nm_index]['filter2']='quick'; $readonlys = $preserv = $sel_options; return $etpl->exec('mail.mail_ui.index',$content,$sel_options,$readonlys,$preserv); } @@ -686,7 +692,7 @@ class mail_ui /** * Get actions / context menu for index * - * Changes here, require to log out, as $content['nm'] get stored in session! + * Changes here, require to log out, as $content[self::$nm_index] get stored in session! * @var &$action_links * * @return array see nextmatch_widget::egw_actions() @@ -1593,9 +1599,13 @@ unset($query['actions']); ), )); */ - egw_framework::set_onload(""); - $subject = mail_bo::htmlspecialchars($this->mail_bo->decode_subject(preg_replace($nonDisplayAbleCharacters,'',$envelope['SUBJECT']),false), - mail_bo::$displayCharset); + egw_framework::set_onload('$j(document).ready(function() { +var subject = etemplate2.getByApplication(\'mail\')[0].widgetContainer.getWidgetById(\'mail_displaysubject\'); +var body = etemplate2.getByApplication(\'mail\')[0].widgetContainer.getWidgetById(\'mail_displaybody\'); +body.node.parentNode.style.top=subject.node.offsetTop+40+\'px\'; +});'); + $subject = /*mail_bo::htmlspecialchars(*/$this->mail_bo->decode_subject(preg_replace($nonDisplayAbleCharacters,'',$envelope['SUBJECT']),false)/*, + mail_bo::$displayCharset)*/; if($envelope['FROM'][0] != $envelope['SENDER'][0]) { $content['mail_displayfromaddress'] = self::emailAddressToHTML($envelope['SENDER'],'',false,true,false); $content['mail_displayonbehalfofaddress'] = self::emailAddressToHTML($envelope['FROM'], $organization,false,true,false); @@ -2158,8 +2168,22 @@ unset($query['actions']); !fwrite($fp,$message)) { $err .= 'alert("'.addslashes(lang('Error saving %1!',$file)).'");'; + $succeeded = false; + } + else + { + $succeeded = true; } if ($fp) fclose($fp); + if ($succeeded) + { + translation::add_app('mail'); + $headers = $this->bmail_bo->getMessageHeader($uid,$partID,true); + unset($headers['SUBJECT']);//already in filename + $infoSection = mail_bo::createHeaderInfoSection($headers, 'SUPPRESS', false); + $props = array(array('name' => 'comment','val' => $infoSection)); + egw_vfs::proppatch($file,$props); + } } //$this->mail_bo->closeConnection(); diff --git a/mail/js/app.js b/mail/js/app.js index f1125ca133..5720d7fd11 100644 --- a/mail/js/app.js +++ b/mail/js/app.js @@ -11,6 +11,7 @@ app.mail = AppJS.extend( { appname: 'mail', + /** * et2 widget container */ @@ -26,6 +27,8 @@ app.mail = AppJS.extend( mail_currentlyFocussed: '', mail_previewAreaActive: true, // we start with the area active + nm_index: 'nm', // nm nome of index + /** * Initialize javascript for this application * @@ -87,7 +90,7 @@ app.mail = AppJS.extend( { if (_reset == true) { - //var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); + //var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(nm_index); //if (this.mail_currentlyFocussed!='') nm.refresh([this.mail_currentlyFocussed],'delete');//egw.dataDeleteUID(this.mail_currentlyFocussed); if (this.mail_currentlyFocussed!='') egw.dataDeleteUID(this.mail_currentlyFocussed); for(var k = 0; k < this.mail_selectedMails.length; k++) egw.dataDeleteUID(this.mail_selectedMails[k]); @@ -233,6 +236,19 @@ app.mail = AppJS.extend( } }, + /** + * Compose, reply or forward a message + * + * @param _action _action.id is 'compose', 'composeasnew', 'reply', 'reply_all' or 'forward' (forward can be multiple messages) + * @param _elems _elems[0].id is the row-id + */ + mail_testhtmlarea: function(_action, _elems) + { + var url = window.egw_webserverUrl+'/index.php?'; + url += 'menuaction=mail.mail_compose.testhtmlarea'; + egw_openWindowCentered(url); + }, + /** * Compose, reply or forward a message * @@ -414,7 +430,7 @@ app.mail = AppJS.extend( } try { - var tree_wdg = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); + var tree_wdg = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]'); var activeFolders = tree_wdg.getTreeNodeOpenItems(nodeToRefresh,mode2use); //alert(activeFolders.join('#,#')); @@ -456,7 +472,7 @@ app.mail = AppJS.extend( * mail_setFolderStatus, function to set the status for the visible folders */ mail_setFolderStatus: function(_status) { - var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); + var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]'); for (var i in _status) ftree.setLabel(i,_status[i]);//alert(i +'->'+_status[i]); }, @@ -468,7 +484,7 @@ app.mail = AppJS.extend( */ mail_setLeaf: function(_status) { //console.log('mail_setLeaf',_status); - var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); + var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]'); var selectedNode = ftree.getSelectedNode(); for (var i in _status) { @@ -478,7 +494,7 @@ app.mail = AppJS.extend( //alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']); if (_status[i]['id']==selectedNode.id) { - var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); + var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index); nm.activeFilters["selectedFolder"] = _status[i]['id']; nm.applyFilters(); } @@ -493,7 +509,7 @@ app.mail = AppJS.extend( */ mail_removeLeaf: function(_status) { //console.log('mail_removeLeaf',_status); - var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); + var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]'); var selectedNode = ftree.getSelectedNode(); for (var i in _status) { @@ -504,7 +520,7 @@ app.mail = AppJS.extend( //alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']); if (selectedNodeAfter.id!=selectedNode.id && selectedNode.id==i) { - var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); + var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index); nm.activeFilters["selectedFolder"] = selectedNodeAfter.id; nm.applyFilters(); } @@ -519,7 +535,7 @@ app.mail = AppJS.extend( */ mail_reloadNode: function(_status) { //console.log('mail_reloadNode',_status); - var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); + var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]'); var selectedNode = ftree.getSelectedNode(); for (var i in _status) { @@ -530,7 +546,7 @@ app.mail = AppJS.extend( //alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']); if (selectedNodeAfter.id!=selectedNode.id && selectedNode.id==i) { - var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); + var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index); nm.activeFilters["selectedFolder"] = selectedNodeAfter.id; nm.applyFilters(); } @@ -541,7 +557,7 @@ app.mail = AppJS.extend( * mail_refreshMessageGrid, function to call to reread ofthe current folder */ mail_refreshMessageGrid: function() { - var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); + var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index); nm.applyFilters(); // this should refresh the active folder }, @@ -744,7 +760,7 @@ app.mail = AppJS.extend( _widget.set_value(''); } } - var nm = _widget.getRoot().getWidgetById('nm'); + var nm = _widget.getRoot().getWidgetById(this.nm_index); nm.activeFilters["selectedFolder"] = folder; //nm.applyFilters();// its done in refrefreshMessageGrid var msg = _widget.getRoot().getWidgetById('msg'); @@ -983,7 +999,7 @@ app.mail = AppJS.extend( } else { - var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); + var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index); var aO = nm.controller._objectManager.selectedChildren; for (var i = 0; i < _actionObjects['msg'].length; i++) { @@ -1028,7 +1044,7 @@ app.mail = AppJS.extend( // as the "onNodeSelect" function! var request = new egw_json_request('mail.mail_ui.ajax_moveMessages',[target, messages]); request.sendRequest(false); - var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm'); + var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index); this.mail_setRowClass(_senders,'deleted'); nm.refresh(messages['msg'],'delete') //for (var i = 0; i < messages['msg'].length; i++) egw.dataDeleteUID(messages['msg'][i]); @@ -1063,7 +1079,7 @@ app.mail = AppJS.extend( //console.log(action,_senders); //action.id == 'add' //_senders.iface.id == target leaf / leaf to edit - var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); + var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]'); OldFolderName = ftree.getLabel(_senders[0].iface.id); if (jQuery(OldFolderName).text().length>0) OldFolderName = jQuery(OldFolderName).text(); OldFolderName = OldFolderName.trim(); @@ -1090,7 +1106,7 @@ app.mail = AppJS.extend( //console.log(action,_senders); //action.id == 'rename' //_senders.iface.id == target leaf / leaf to edit - var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); + var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]'); OldFolderName = ftree.getLabel(_senders[0].iface.id); if (jQuery(OldFolderName).text().length>0) OldFolderName = jQuery(OldFolderName).text(); OldFolderName = OldFolderName.trim(); @@ -1117,7 +1133,7 @@ app.mail = AppJS.extend( //console.log(action,_senders); //action.id == 'delete' //_senders.iface.id == target leaf / leaf to edit - var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm[foldertree]'); + var ftree = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(this.nm_index+'[foldertree]'); OldFolderName = ftree.getLabel(_senders[0].iface.id); if (jQuery(OldFolderName).text().length>0) OldFolderName = jQuery(OldFolderName).text(); OldFolderName = OldFolderName.trim(); diff --git a/mail/templates/default/compose.xet b/mail/templates/default/compose.xet index f8586f6655..215f6d8f18 100644 --- a/mail/templates/default/compose.xet +++ b/mail/templates/default/compose.xet @@ -6,7 +6,10 @@ - + + + +