// Make it DOM-traversable
     $doc_citations = new DOMDocument();
     $doc_citations->loadXML($zp_xml);
     $entries = $doc_citations->getElementsByTagName("entry");
     foreach ($entries as $entry) {
         $item_key = $entry->getElementsByTagNameNS("http://zotero.org/ns/api", "key")->item(0)->nodeValue;
         $citation_content = "";
         $citation_content_temp = new DOMDocument();
         foreach ($entry->getElementsByTagName("content") as $child) {
             foreach ($child->childNodes as $child_content) {
                 $citation_content_temp->appendChild($citation_content_temp->importNode($child_content, true));
                 $citation_content = $citation_content_temp->saveHTML();
             }
         }
         // Update style
         $wpdb->update($wpdb->prefix . 'zotpress_zoteroItems', array("style" => zp_db_prep($style), "citation" => zp_db_prep($citation_content)), array('item_key' => $item_key, 'api_user_id' => $zp_account[0]->api_user_id), array('%s', '%s'), array('%s', '%s'));
         $xml .= "<item key=\"" . $item_key . "\">" . htmlentities($citation_content) . "</item>\n";
     }
     // entry
     unset($zp_import_contents);
     unset($zp_import_url);
     unset($zp_xml);
     unset($doc_citations);
     unset($entries);
 }
 unset($zp_items_current_style);
 unset($zp_items_current_style_proceed);
 unset($query_items);
 // Display success XML
 $xml .= "<result success=\"true\" api_user_id=\"" . $api_user_id . "\" />\n";
 $wpdb->flush();
function zp_get_server_tags($wpdb, $api_user_id, $zp_start)
{
    $zp_import_contents = new ZotpressRequest();
    $zp_account = zp_get_account($wpdb, $api_user_id);
    //$zp_account = $GLOBALS['zp_session'][$api_user_id]['zp_account'];
    // Build request URL
    $zp_import_url = "https://api.zotero.org/" . $zp_account[0]->account_type . "/" . $zp_account[0]->api_user_id . "/tags?limit=50&start=" . $zp_start;
    if (is_null($zp_account[0]->public_key) === false && trim($zp_account[0]->public_key) != "") {
        $zp_import_url .= "&key=" . $zp_account[0]->public_key;
    }
    $zp_xml = $zp_import_contents->get_request_contents($zp_import_url, false);
    // Make it DOM-traversable
    $doc_citations = new DOMDocument();
    $doc_citations->loadXML($zp_xml);
    // Get last set
    if (!isset($GLOBALS['zp_session'][$api_user_id]['tags']['last_set'])) {
        $last_set = "";
        $links = $doc_citations->getElementsByTagName("link");
        foreach ($links as $link) {
            if ($link->getAttribute('rel') == "last") {
                if (stripos($link->getAttribute('href'), "start=") !== false) {
                    $last_set = explode("start=", $link->getAttribute('href'));
                    $GLOBALS['zp_session'][$api_user_id]['tags']['last_set'] = intval($last_set[1]);
                } else {
                    $GLOBALS['zp_session'][$api_user_id]['tags']['last_set'] = 0;
                }
            }
        }
    }
    $entries = $doc_citations->getElementsByTagName("entry");
    foreach ($entries as $entry) {
        $title = $entry->getElementsByTagName("title")->item(0)->nodeValue;
        $retrieved = $entry->getElementsByTagName("updated")->item(0)->nodeValue;
        // Check to see if tags exists in local
        if (array_key_exists(trim($title), $GLOBALS['zp_session'][$api_user_id]['tags']['zp_local_tags'])) {
            // Check to see if it needs updating
            if ($retrieved != $GLOBALS['zp_session'][$api_user_id]['tags']['zp_local_tags'][trim($title)]->retrieved) {
                $GLOBALS['zp_session'][$api_user_id]['tags']['zp_tags_to_update'][trim($title)] = $GLOBALS['zp_session'][$api_user_id]['tags']['zp_local_tags'][trim($title)]->id;
                //unset($GLOBALS['zp_session'][$api_user_id]['tags']['zp_local_tags'][trim($title)]); // Leave only the local ones that should be deleted
                update_option('ZOTPRESS_DELETE_' . $api_user_id, get_option('ZOTPRESS_DELETE_' . $api_user_id) . "," . $item_key);
            } else {
                //unset($GLOBALS['zp_session'][$api_user_id]['tags']['zp_local_tags'][trim($title)]); // Leave only the local ones that should be deleted
                update_option('ZOTPRESS_DELETE_' . $api_user_id, get_option('ZOTPRESS_DELETE_' . $api_user_id) . "," . $item_key);
                continue;
            }
        }
        $numItems = $entry->getElementsByTagNameNS("http://zotero.org/ns/api", "numItems")->item(0)->nodeValue;
        unset($zp_import_contents);
        unset($zp_import_url);
        unset($zp_xml);
        // GET LIST OF ITEM KEYS
        $zp_import_contents = new ZotpressRequest();
        $zp_import_url = "https://api.zotero.org/" . $zp_account[0]->account_type . "/" . $zp_account[0]->api_user_id . "/tags/" . urlencode($title) . "/items?format=keys";
        if (is_null($zp_account[0]->public_key) === false && trim($zp_account[0]->public_key) != "") {
            $zp_import_url .= "&key=" . $zp_account[0]->public_key;
        }
        // Import content
        $zp_xml = $zp_import_contents->get_request_contents($zp_import_url, false);
        $zp_tag_itemkeys = rtrim(str_replace("\n", ",", $zp_xml), ",");
        // If item key needs updating
        if (array_key_exists(trim($title), $GLOBALS['zp_session'][$api_user_id]['tags']['zp_tags_to_update'])) {
            $GLOBALS['zp_session'][$api_user_id]['tags']['zp_tags_to_update'][trim($title)] = array("api_user_id" => $zp_account[0]->api_user_id, "title" => zp_db_prep($title), "retrieved" => zp_db_prep($retrieved), "numItems" => $numItems, "listItems" => zp_db_prep($zp_tag_itemkeys));
        } else {
            if (!array_key_exists(trim($title), $GLOBALS['zp_session'][$api_user_id]['tags']['zp_local_tags'])) {
                array_push($GLOBALS['zp_session'][$api_user_id]['tags']['zp_tags_to_add'], $zp_account[0]->api_user_id, zp_db_prep($title), zp_db_prep($retrieved), $numItems, zp_db_prep($zp_tag_itemkeys));
                $GLOBALS['zp_session'][$api_user_id]['tags']['query_total_tags_to_add']++;
            }
        }
        unset($title);
        unset($retrieved);
        unset($numItems);
        unset($zp_tag_itemkeys);
    }
    // entry
    // LAST SET
    if ($GLOBALS['zp_session'][$api_user_id]['tags']['last_set'] == $zp_start) {
        return false;
    } else {
        return true;
    }
    unset($zp_import_contents);
    unset($zp_import_url);
    unset($zp_xml);
    unset($doc_citations);
    unset($entries);
}
function zp_get_tags($wpdb, $api_user_id, $zp_start, $zp_collection = false)
{
    $zp_import_contents = new ZotpressRequest();
    $zp_account = zp_get_account($wpdb, $api_user_id);
    // Get import url
    if ($zp_collection) {
        $zp_collection = '/collections/' . $zp_collection;
    } else {
        $zp_collection = '';
    }
    $zp_import_url = "https://api.zotero.org/" . $zp_account[0]->account_type . "/" . $zp_account[0]->api_user_id . $zp_collection . "/tags?limit=50&start=" . $zp_start;
    if (is_null($zp_account[0]->public_key) === false && trim($zp_account[0]->public_key) != "") {
        $zp_import_url .= "&key=" . $zp_account[0]->public_key;
    }
    // Import content
    $zp_xml = $zp_import_contents->get_request_contents($zp_import_url, false);
    // Report any errors returned from Zotero
    if (trim(strtolower($zp_xml)) == "forbidden") {
        return "Zotero is telling Zotpress that access is forbidden. Are you sure that the Zotero API key you're using for this account is correct?";
    }
    // Make it DOM-traversable
    $doc_citations = new DOMDocument();
    $doc_citations->loadXML($zp_xml);
    // Get last set
    if (!isset($GLOBALS['zp_session'][$api_user_id]['tags']['last_set'])) {
        $last_set = "";
        $links = $doc_citations->getElementsByTagName("link");
        foreach ($links as $link) {
            if ($link->getAttribute('rel') == "last") {
                if (stripos($link->getAttribute('href'), "start=") !== false) {
                    $last_set = explode("start=", $link->getAttribute('href'));
                    $GLOBALS['zp_session'][$api_user_id]['tags']['last_set'] = intval($last_set[1]);
                } else {
                    $GLOBALS['zp_session'][$api_user_id]['tags']['last_set'] = 0;
                }
            }
        }
    }
    // PREPARE EACH ENTRY FOR DB INSERT
    $entries = $doc_citations->getElementsByTagName("entry");
    foreach ($entries as $entry) {
        $title = str_replace("&", "__and__", $entry->getElementsByTagName("title")->item(0)->nodeValue);
        $retrieved = $entry->getElementsByTagName("updated")->item(0)->nodeValue;
        $numItems = $entry->getElementsByTagNameNS("http://zotero.org/ns/api", "numItems")->item(0)->nodeValue;
        unset($zp_import_contents);
        unset($zp_import_url);
        unset($zp_xml);
        // GET LIST OF ITEM KEYS - now handled in Items import
        //            $zp_import_contents = new ZotpressRequest();
        //
        //            $zp_import_url = "https://api.zotero.org/".$zp_account[0]->account_type."/".$zp_account[0]->api_user_id."/tags/".urlencode($title)."/items?format=keys";
        //            if (is_null($zp_account[0]->public_key) === false && trim($zp_account[0]->public_key) != "")
        //                $zp_import_url .= "&key=".$zp_account[0]->public_key;
        //
        //            // Import content
        //			$zp_xml = $zp_import_contents->get_request_contents( $zp_import_url, false );
        //
        //            $zp_tag_itemkeys = rtrim(str_replace("\n", ",", $zp_xml), ",");
        //
        //            unset($zp_import_contents);
        //            unset($zp_import_url);
        //            unset($zp_xml);
        // Prep for insert into db
        array_push($GLOBALS['zp_session'][$api_user_id]['tags']['query_params'], $zp_account[0]->api_user_id, zp_db_prep($title), zp_db_prep($retrieved), $numItems);
        $GLOBALS['zp_session'][$api_user_id]['tags']['query_total_entries']++;
        unset($title);
        unset($retrieved);
        unset($numItems);
        //unset($zp_tag_itemkeys);
    }
    // entry
    // LAST SET
    if ($GLOBALS['zp_session'][$api_user_id]['tags']['last_set'] == $zp_start) {
        return false;
    } else {
        return true;
    }
    unset($entries);
    unset($doc_citations);
}