+}
+
+/* returns the references header lines */
+function get_reference_header ($imap_stream, $message) {
+ global $uid_support;
+ $responses = array ();
+ $sid = sqimap_session_id($uid_support);
+ $results = array();
+ $references = "";
+ $query = "$sid FETCH $message BODY[HEADER.FIELDS (References)]\r\n";
+ fputs ($imap_stream, $query);
+ $responses = sqimap_read_data_list($imap_stream, $sid, true, $responses, $message);
+ if (!eregi("^\\* ([0-9]+) FETCH", $responses[0][0], $regs)) {
+ $responses = array ();
+ }
+ return $responses;
+}
+
+
+/* get sort order from server and
+ * return it as the $id array for
+ * mailbox_display
+ */
+
+function sqimap_get_sort_order ($imap_stream, $sort, $mbxresponse) {
+ global $default_charset, $thread_sort_messages,
+ $internal_date_sort, $server_sort_array,
+ $sent_folder, $mailbox, $uid_support;
+
+ if (sqsession_is_registered('server_sort_array')) {
+ sqsession_unregister('server_sort_array');
+ }
+
+ $sid = sqimap_session_id($uid_support);
+ $sort_on = array();
+ $reverse = 0;
+ $server_sort_array = array();
+ $sort_test = array();
+ $sort_query = '';
+
+ if ($sort == 6) {
+ if ($uid_support) {
+ if (isset($mbxresponse['UIDNEXT']) && $mbxresponse['UIDNEXT']) {
+ $uidnext = $mbxresponse['UIDNEXT']-1;
+ } else {
+ $uidnext = '*';
+ }
+ $uid_query = "$sid SEARCH UID 1:$uidnext\r\n";
+ fputs($imap_stream, $uid_query);
+ $uids = sqimap_read_data($imap_stream, $sid, true ,$response, $message);
+ if (isset($uids[0])) {
+ if (preg_match("/^\* SEARCH (.+)$/", $uids[0], $regs)) {
+ $server_sort_array = preg_split("/ /", trim($regs[1]));
+ }
+ }
+ if (!preg_match("/OK/", $response)) {
+ $server_sort_array = 'no';
+ }
+ } else {
+ $qty = $mbxresponse['EXISTS'];
+ $server_sort_array = range(1, $qty);
+ }
+ sqsession_register($server_sort_array, 'server_sort_array');
+ return $server_sort_array;
+ }
+
+ $sort_on = array (0=> 'DATE',
+ 1=> 'DATE',
+ 2=> 'FROM',
+ 3=> 'FROM',
+ 4=> 'SUBJECT',
+ 5=> 'SUBJECT');
+ if ($internal_date_sort == true) {
+ $sort_on[0] = 'ARRIVAL';
+ $sort_on[1] = 'ARRIVAL';
+ }
+ if ($sent_folder == $mailbox) {
+ $sort_on[2] = 'TO';
+ $sort_on[3] = 'TO';
+ }
+ if (!empty($sort_on[$sort])) {
+ $sort_query = "$sid SORT ($sort_on[$sort]) ".strtoupper($default_charset)." ALL\r\n";
+ fputs($imap_stream, $sort_query);
+ $sort_test = sqimap_read_data($imap_stream, $sid, true ,$response, $message);
+ }
+ if (isset($sort_test[0])) {
+ if (preg_match("/^\* SORT (.+)$/", $sort_test[0], $regs)) {
+ $server_sort_array = preg_split("/ /", trim($regs[1]));
+ }
+ }
+ if ($sort == 0 || $sort == 2 || $sort == 4) {
+ $server_sort_array = array_reverse($server_sort_array);
+ }
+ if (!preg_match("/OK/", $response)) {
+ $server_sort_array = 'no';
+ }
+ sqsession_register($server_sort_array, 'server_sort_array');
+ return $server_sort_array;
+}
+
+
+function sqimap_get_php_sort_order ($imap_stream, $mbxresponse) {
+ global $uid_support;
+
+ if (sqsession_is_registered('php_sort_array')) {
+ sqsession_unregister('php_sort_array');
+ }
+
+ $sid = sqimap_session_id($uid_support);
+ $php_sort_array = array();
+
+ if ($uid_support) {
+ if (isset($mbxresponse['UIDNEXT']) && $mbxresponse['UIDNEXT']) {
+ $uidnext = $mbxresponse['UIDNEXT']-1;
+ } else {
+ $uidnext = '*';
+ }
+ $uid_query = "$sid SEARCH UID 1:$uidnext\r\n";
+ fputs($imap_stream, $uid_query);
+ $uids = sqimap_read_data($imap_stream, $sid, true ,$response, $message);
+ if (isset($uids[0])) {
+ if (preg_match("/^\* SEARCH (.+)$/", $uids[0], $regs)) {
+ $php_sort_array = preg_split("/ /", trim($regs[1]));
+ }
+ }
+ if (!preg_match("/OK/", $response)) {
+ $php_sort_array = 'no';
+ }
+ } else {
+ $qty = $mbxresponse['EXISTS'];
+ $php_sort_array = range(1, $qty);
+ }
+ sqsession_register($php_sort_array, 'php_sort_array');
+ return $php_sort_array;
+}
+
+
+/* returns an indent array for printMessageinfo()
+ this represents the amount of indent needed (value)
+ for this message number (key)
+*/
+
+function get_parent_level ($imap_stream) {
+ global $sort_by_ref, $default_charset, $thread_new;
+ $parent = "";
+ $child = "";
+ $cutoff = 0;
+
+ /* loop through the threads and take unwanted characters out
+ of the thread string then chop it up
+ */
+ for ($i=0;$i<count($thread_new);$i++) {
+ $thread_new[$i] = preg_replace("/\s\(/", "(", $thread_new[$i]);
+ $thread_new[$i] = preg_replace("/(\d+)/", "$1|", $thread_new[$i]);
+ $thread_new[$i] = preg_split("/\|/", $thread_new[$i], -1, PREG_SPLIT_NO_EMPTY);
+ }
+ $indent_array = array();
+ if (!$thread_new) {
+ $thread_new = array();
+ }
+ /* looping through the parts of one message thread */
+
+ for ($i=0;$i<count($thread_new);$i++) {
+ /* first grab the parent, it does not indent */
+
+ if (isset($thread_new[$i][0])) {
+ if (preg_match("/(\d+)/", $thread_new[$i][0], $regs)) {
+ $parent = $regs[1];
+ }
+ }
+ $indent_array[$parent] = 0;
+
+ /* now the children, checking each thread portion for
+ ),(, and space, adjusting the level and space values
+ to get the indent level
+ */
+ $level = 0;
+ $spaces = array();
+ $spaces_total = 0;
+ $indent = 0;
+ $fake = FALSE;
+ for ($k=1;$k<(count($thread_new[$i]))-1;$k++) {
+ $chars = count_chars($thread_new[$i][$k], 1);
+ if (isset($chars['40'])) { /* testing for ( */
+ $level = $level + $chars['40'];
+ }
+ if (isset($chars['41'])) { /* testing for ) */
+ $level = $level - $chars['41'];
+ $spaces[$level] = 0;
+ /* if we were faking lets stop, this portion
+ of the thread is over
+ */
+ if ($level == $cutoff) {
+ $fake = FALSE;
+ }
+ }
+ if (isset($chars['32'])) { /* testing for space */
+ if (!isset($spaces[$level])) {
+ $spaces[$level] = 0;
+ }
+ $spaces[$level] = $spaces[$level] + $chars['32'];
+ }
+ for ($x=0;$x<=$level;$x++) {
+ if (isset($spaces[$x])) {
+ $spaces_total = $spaces_total + $spaces[$x];
+ }
+ }
+ $indent = $level + $spaces_total;
+ /* must have run into a message that broke the thread
+ so we are adjusting for that portion
+ */
+ if ($fake == TRUE) {
+ $indent = $indent +1;
+ }
+ if (preg_match("/(\d+)/", $thread_new[$i][$k], $regs)) {
+ $child = $regs[1];
+ }
+ /* the thread must be broken if $indent == 0
+ so indent the message once and start faking it
+ */
+ if ($indent == 0) {
+ $indent = 1;
+ $fake = TRUE;
+ $cutoff = $level;
+ }
+ /* dont need abs but if indent was negative
+ errors would occur
+ */
+ $indent_array[$child] = abs($indent);
+ $spaces_total = 0;
+ }
+ }
+ return $indent_array;
+}
+