static function domnode_to_array($node)
 {
     $output = array();
     switch ($node->nodeType) {
         case XML_CDATA_SECTION_NODE:
         case XML_TEXT_NODE:
         case XML_ELEMENT_NODE:
             if (!$node->childNodes) {
                 return;
             }
             for ($i = 0, $m = $node->childNodes->length; $i < $m; $i++) {
                 $child = $node->childNodes->item($i);
                 $v = xml_utils::domnode_to_array($child);
                 if (isset($child->tagName)) {
                     $t = $child->tagName;
                     if (!isset($output[$t])) {
                         $output[$t] = array();
                     }
                     $output[$t][] = $v;
                 } elseif ($v) {
                     $output = $v;
                 }
             }
             if (is_array($output)) {
                 if ($node->attributes->length) {
                     $a = array();
                     foreach ($node->attributes as $attrName => $attrNode) {
                         $a[$attrName] = (string) $attrNode->value;
                     }
                     $output['@attributes'] = $a;
                 }
                 if ($node->nodeType == XML_ELEMENT_NODE) {
                     $output['@text'] = trim($node->textContent);
                 }
                 foreach ($output as $t => $v) {
                     if (is_array($v) && count($v) == 1 && $t != '@attributes') {
                         //$output[$t] = $v[0];
                     }
                 }
             }
             break;
     }
     return $output;
 }
 static function google_sync_contacts($user)
 {
     $rcmail = rcmail::get_instance();
     $client = google_func::get_client();
     $auth_res = google_func::google_authenticate($client, $user);
     if (!$auth_res['success']) {
         return $auth_res;
     }
     $feed = 'https://www.google.com/m8/feeds/groups/default/full' . '?v=3.0';
     $val = $client->getAuth()->authenticatedRequest(new Google_Http_Request($feed));
     if ($val->getResponseHttpCode() == 401) {
         return array('success' => false, 'message' => "Authentication failed.");
     } else {
         if ($val->getResponseHttpCode() == 403) {
             return array('success' => false, 'message' => $rcmail->gettext('googleforbidden', 'google_addressbook'));
         } else {
             if ($val->getResponseHttpCode() != 200) {
                 return array('success' => false, 'message' => $rcmail->gettext('googleunreachable', 'google_addressbook'));
             }
         }
     }
     $xml = xml_utils::xmlstr_to_array($val->getResponseBody());
     $gid = $xml['entry'][0]['id'][0]['@text'];
     $feed = 'https://www.google.com/m8/feeds/contacts/default/full' . '?max-results=9999' . '&v=3.0' . '&group=' . urlencode($gid);
     $val = $client->getAuth()->authenticatedRequest(new Google_Http_Request($feed));
     if ($val->getResponseHttpCode() == 401) {
         return array('success' => false, 'message' => "Authentication failed.");
     } else {
         if ($val->getResponseHttpCode() == 403) {
             return array('success' => false, 'message' => $rcmail->gettext('googleforbidden', 'google_addressbook'));
         } else {
             if ($val->getResponseHttpCode() != 200) {
                 return array('success' => false, 'message' => $rcmail->gettext('googleunreachable', 'google_addressbook'));
             }
         }
     }
     $xml = xml_utils::xmlstr_to_array($val->getResponseBody());
     $backend = new google_addressbook_backend($rcmail->get_dbh(), $user->ID);
     $backend->delete_all();
     $num_entries = 0;
     foreach ($xml['entry'] as $entry) {
         //write_log('google_addressbook', 'getting contact: '.$entry['title'][0]['@text']);
         $record = array();
         $name = $entry['gd:name'][0];
         $record['name'] = trim($name['gd:fullName'][0]['@text']);
         $record['firstname'] = trim($name['gd:givenName'][0]['@text']);
         $record['surname'] = trim($name['gd:familyName'][0]['@text']);
         $record['middlename'] = trim($name['gd:additionalName'][0]['@text']);
         $record['prefix'] = $name['gd:namePrefix'][0]['@text'];
         $record['suffix'] = $name['gd:nameSuffix'][0]['@text'];
         if (empty($record['name'])) {
             $record['name'] = $entry['title'][0]['@text'];
         }
         if (empty($record['name']) && empty($record['firstname']) && empty($record['surname']) && empty($record['middlename']) && !array_key_exists('gd:email', $entry)) {
             continue;
         }
         if (array_key_exists('gd:email', $entry)) {
             foreach ($entry['gd:email'] as $email) {
                 list($rel, $type) = explode('#', $email['@attributes']['rel'], 2);
                 $type = empty($type) ? '' : ':' . $type;
                 $record['email' . $type][] = $email['@attributes']['address'];
             }
         }
         if (array_key_exists('gd:phoneNumber', $entry)) {
             foreach ($entry['gd:phoneNumber'] as $phone) {
                 list($rel, $type) = explode('#', $phone['@attributes']['rel'], 2);
                 $type = empty($type) ? '' : ':' . $type;
                 $record['phone' . $type][] = $phone['@text'];
             }
         }
         if (array_key_exists('link', $entry)) {
             foreach ($entry['link'] as $link) {
                 $rel = $link['@attributes']['rel'];
                 $href = $link['@attributes']['href'];
                 if ($rel == 'http://schemas.google.com/contacts/2008/rel#photo') {
                     // etag is only set if image is available
                     if (isset($link['@attributes']['etag'])) {
                         $resp = $client->getAuth()->authenticatedRequest(new Google_Http_Request($href));
                         if ($resp->getResponseHttpCode() == 200) {
                             $record['photo'] = $resp->getResponseBody();
                         }
                     }
                     break;
                 }
             }
         }
         $num_entries++;
         $backend->insert($record, false);
     }
     return array('success' => true, 'message' => $num_entries . $rcmail->gettext('contactsfound', 'google_addressbook'));
 }