+}
+
+/* returns the references header lines */
+function get_reference_header ($imap_stream, $message) {
+ $responses = array ();
+ $sid = sqimap_session_id();
+ $results = array();
+ $references = "";
+ $query = "$sid FETCH $message BODY.PEEK[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) {
+ global $default_charset, $thread_sort_messages,
+ $internal_date_sort, $server_sort_array,
+ $sent_folder, $mailbox;
+
+ if (session_is_registered('server_sort_array')) {
+ session_unregister('server_sort_array');
+ }
+ $sid = sqimap_session_id();
+ $sort_on = array();
+ $reverse = 0;
+ $server_sort_array = array();
+ $sort_test = array();
+ $sort_query = '';
+ $sort_on = array (0=> 'DATE',
+ 1=> 'DATE',
+ 2=> 'FROM',
+ 3=> 'FROM',
+ 4=> 'SUBJECT',
+ 5=> 'SUBJECT',
+ 6=> 'DATE');
+ 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, false, $response, $message);
+ }
+ 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';
+ }
+ session_register('server_sort_array');
+ return $server_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 = "";
+ 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();
+ }
+ for ($i=0;$i<count($thread_new);$i++) {
+ if (isset($thread_new[$i][0])) {
+ if (preg_match("/(\d+)/", $thread_new[$i][0], $regs)) {
+ $parent = $regs[1];
+ }
+ }
+ $indent_array[$parent] = 0;
+ $indent = 0;
+ $go = 'stop';
+ $spaces = array ();
+ $l = 0;
+ for ($k=1;$k<(count($thread_new[$i]))-1;$k++) {
+ $chars = count_chars($thread_new[$i][$k], 1);
+ if (isset($chars['40']) && isset($chars['41'])) {
+ $l--;
+ }
+ if (isset($chars['40'])) { // (
+ $indent = $indent + $chars[40];
+ $go = 'start';
+ $l++;
+ }
+ if (isset($chars['41'])) { // )
+ if ($go == 'start') {
+ if (!isset($spaces[$l])) {
+ $spaces[$l] = 0;
+ }
+ $indent = $indent - $spaces[$l];
+ $indent = $indent - $chars[41] ;
+ $go = 'stop';
+ $l--;
+ }
+ else {
+ $indent = $indent - $chars[41];
+ }
+ }
+ if (isset($chars['32'])) { // space
+ $indent = $indent + $chars[32];
+ if ($go == 'start') {
+ if (!isset($spaces[$l])) {
+ $spaces[$l] = 0;
+ }
+ $spaces[$l] = $spaces[$l] + $chars[32];
+ }
+ }
+ if (preg_match("/(\d+)/", $thread_new[$i][$k], $regs)) {
+ $child = $regs[1];
+ }
+ $indent_array[$child] = abs($indent);
+ }
+ }
+ return $indent_array;
+}
+
+
+/* returns an array with each element as a string
+ representing one message thread as returned by
+ the IMAP server
+*/
+
+function get_thread_sort ($imap_stream) {
+ global $thread_new, $sort_by_ref, $default_charset, $server_sort_array;
+
+ if (session_is_registered('thread_new')) {
+ session_unregister('thread_new');
+ }
+ if (session_is_registered('server_sort_array')) {
+ session_unregister('server_srot_array');
+ }
+ $sid = sqimap_session_id();
+ $thread_temp = array ();
+ if ($sort_by_ref == 1) {
+ $sort_type = 'REFERENCES';
+ }
+ else {
+ $sort_type = 'ORDEREDSUBJECT';
+ }
+ $thread_query = "$sid THREAD $sort_type ".strtoupper($default_charset)." ALL\r\n";
+ fputs($imap_stream, $thread_query);
+ $thread_test = sqimap_read_data($imap_stream, $sid, false, $response, $message);
+ if (preg_match("/^\* THREAD (.+)$/", $thread_test[0], $regs)) {
+ $thread_list = trim($regs[1]);
+ }
+ else {
+ $thread_list = "";
+ }
+ if (!preg_match("/OK/", $response)) {
+ $server_sort_array = 'no';
+ return $server_sort_array;
+ }
+ $thread_temp = preg_split("//", $thread_list, -1, PREG_SPLIT_NO_EMPTY);
+ $char_count = count($thread_temp);
+ $counter = 0;
+ $thread_new = array();
+ $k = 0;
+ $thread_new[0] = "";
+ for ($i=0;$i<$char_count;$i++) {
+ if ($thread_temp[$i] != ')' && $thread_temp[$i] != '(') {
+ $thread_new[$k] = $thread_new[$k] . $thread_temp[$i];
+ }
+ elseif ($thread_temp[$i] == '(') {
+ $thread_new[$k] .= $thread_temp[$i];
+ $counter++;
+ }
+ elseif ($thread_temp[$i] == ')') {
+ if ($counter > 1) {
+ $thread_new[$k] .= $thread_temp[$i];
+ $counter = $counter - 1;
+ }
+ else {
+ $thread_new[$k] .= $thread_temp[$i];
+ $k++;
+ $thread_new[$k] = "";
+ $counter = $counter - 1;
+ }
+ }
+ }
+ session_register('$thread_new');
+ $thread_new = array_reverse($thread_new);
+ $thread_list = implode(" ", $thread_new);
+ $thread_list = str_replace("(", " ", $thread_list);
+ $thread_list = str_replace(")", " ", $thread_list);
+ $thread_list = preg_split("/\s/", $thread_list, -1, PREG_SPLIT_NO_EMPTY);
+ $server_sort_array = $thread_list;
+ session_register('server_sort_array');
+ return $thread_list;
+}
+
+