]> gitweb.fluxo.info Git - semanticscuttle.git/commitdiff
git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk...
authormensonge <mensonge@b3834d28-1941-0410-a4f8-b48e95affb8f>
Wed, 22 Oct 2008 14:05:59 +0000 (14:05 +0000)
committermensonge <mensonge@b3834d28-1941-0410-a4f8-b48e95affb8f>
Wed, 22 Oct 2008 14:05:59 +0000 (14:05 +0000)
about.php
ajaxGetTitle.php
index.php
services/bookmarkservice.php
users.php

index 020a3511227a2be7b06b9686d9c434919e335aee..795d0a69a36b76826e9706d94502bf4d419eb377 100644 (file)
--- a/about.php
+++ b/about.php
@@ -1,22 +1,22 @@
 <?php
 /***************************************************************************
-Copyright (C) 2004, 2005 Scuttle project
-http://sourceforge.net/projects/scuttle/
+ Copyright (C) 2004, 2005 Scuttle project
+ http://sourceforge.net/projects/scuttle/
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-***************************************************************************/
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ ***************************************************************************/
 
 require_once('header.inc.php');
 $templateservice =& ServiceFactory::getServiceInstance('TemplateService');
index 0bc142d154fd3f138bab7bf5dff1adbd544f007a..d440802612ed3f5425f5ec1c3d90248fc0488972 100644 (file)
@@ -1,23 +1,23 @@
 <?php
 /***************************************************************************
-Copyright (C) 2005 - 2006 Scuttle project
-http://sourceforge.net/projects/scuttle/
-http://scuttle.org/
+ Copyright (C) 2005 - 2006 Scuttle project
+ http://sourceforge.net/projects/scuttle/
+ http://scuttle.org/
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-***************************************************************************/
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ ***************************************************************************/
 
 header('Content-Type: text/xml; charset=UTF-8');
 header("Last-Modified: ". gmdate("D, d M Y H:i:s") ." GMT");
@@ -26,41 +26,45 @@ header("Cache-Control: no-cache, must-revalidate");
 require_once('header.inc.php');
 
 function getTitle($url) {
-    $fd = @fopen($url, 'r');
-    if ($fd) {
-        $html = fread($fd, 1750);
-        fclose($fd);
+       $fd = @fopen($url, 'r');
+       if ($fd) {
+               $html = fread($fd, 1750);
+               fclose($fd);
 
-        // Get title from title tag
-        preg_match_all('/<title>(.*)<\/title>/si', $html, $matches);
-        $title = $matches[1][0];
+               // Get title from title tag
+               preg_match_all('/<title>(.*)<\/title>/si', $html, $matches);
+               $title = $matches[1][0];
 
-        // Get encoding from charset attribute
-        preg_match_all('/<meta.*charset=([^;"]*)">/i', $html, $matches);
-        $encoding = strtoupper($matches[1][0]);
+               // Get encoding from charset attribute
+               preg_match_all('/<meta.*charset=([^;"]*)">/i', $html, $matches);
+               $encoding = strtoupper($matches[1][0]);
 
-        // Convert to UTF-8 from the original encoding
-        if (function_exists('mb_convert_encoding') {
-            $title = @mb_convert_encoding($title, 'UTF-8', $encoding);
-        }
+               // Convert to UTF-8 from the original encoding
+               if (function_exists("mb_convert_encoding") {
+                       $title = @mb_convert_encoding($title, 'UTF-8', $encoding);
+               }
 
-        if (utf8_strlen($title) > 0) {
-            return $title;
-        } else {
-            // No title, so return filename
-            $uriparts = explode('/', $url);
-            $filename = end($uriparts);
-            unset($uriparts);
+               if (utf8_strlen($title) > 0) {
+                       return $title;
+               } else {
+                       // No title, so return filename
+                       $uriparts = explode('/', $url);
+                       $filename = end($uriparts);
+                       unset($uriparts);
 
-            return $filename;
-        }
-    } else {
-        return false;
-    }
+                       return $filename;
+               }
+       } else {
+               return false;
+       }
 }
 echo '<?xml version="1.0" encoding="utf-8"?>';
 ?>
 <response>
-  <method>getTitle</method>
-  <result><?php echo getTitle($_GET['url']); ?></result>
-</response>
\ No newline at end of file
+<method>
+getTitle
+</method>
+<result>
+<?php echo getTitle($_GET['url']); ?>
+</result>
+</response>
index 9684fdf6e0a89d9f660429c690f58132188cd418..2b5eda2e6f6d30beae208cd6d9b03abacff61f23 100644 (file)
--- a/index.php
+++ b/index.php
@@ -1,23 +1,23 @@
 <?php
 /***************************************************************************
-Copyright (C) 2004 - 2006 Scuttle project
-http://sourceforge.net/projects/scuttle/
-http://scuttle.org/
+ Copyright (C) 2004 - 2006 Scuttle project
+ http://sourceforge.net/projects/scuttle/
+ http://scuttle.org/
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-***************************************************************************/
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ ***************************************************************************/
 
 require_once('header.inc.php');
 $bookmarkservice =& ServiceFactory::getServiceInstance('BookmarkService');
@@ -27,38 +27,38 @@ $cacheservice =& ServiceFactory::getServiceInstance('CacheService');
 
 $tplvars = array();
 if (isset($_GET['action'])){
-    if ($_GET['action'] == "logout") {
-        $userservice->logout();
-        $tplvars['msg'] = T_('You have now logged out');
-    }
+       if ($_GET['action'] == "logout") {
+               $userservice->logout();
+               $tplvars['msg'] = T_('You have now logged out');
+       }
 }
 
 // Header variables
 $tplVars['loadjs'] = true;
 $tplVars['rsschannels'] = array(
-    array(sprintf(T_('%s: Recent bookmarks'), $sitename), createURL('rss').'?sort='.getSortOrder())
+array(sprintf(T_('%s: Recent bookmarks'), $sitename), createURL('rss').'?sort='.getSortOrder())
 );
 
 if ($usecache) {
-    // Generate hash for caching on
-    $hashtext = $_SERVER['REQUEST_URI'];
-    if ($userservice->isLoggedOn()) {
-        $hashtext .= $userservice->getCurrentUserID();
-    }
-    $hash = md5($hashtext);
+       // Generate hash for caching on
+       $hashtext = $_SERVER['REQUEST_URI'];
+       if ($userservice->isLoggedOn()) {
+               $hashtext .= $userservice->getCurrentUserID();
+       }
+       $hash = md5($hashtext);
 
-    // Cache for 15 minutes
-    $cacheservice->Start($hash, 900);
+       // Cache for 15 minutes
+       $cacheservice->Start($hash, 900);
 }
 
 // Pagination
 $perpage = getPerPageCount();
 if (isset($_GET['page']) && intval($_GET['page']) > 1) {
-    $page = $_GET['page'];
-    $start = ($page - 1) * $perpage;
+       $page = $_GET['page'];
+       $start = ($page - 1) * $perpage;
 } else {
-    $page = 0;
-    $start = 0;
+       $page = 0;
+       $start = 0;
 }
 
 $dtend = date('Y-m-d H:i:s', strtotime('tomorrow'));
@@ -84,7 +84,7 @@ $tplVars['pageName'] = PAGE_INDEX;
 $templateservice->loadTemplate('bookmarks.tpl', $tplVars);
 
 if ($usecache) {
-    // Cache output if existing copy has expired
-    $cacheservice->End($hash);
+       // Cache output if existing copy has expired
+       $cacheservice->End($hash);
 }
 ?>
index 150abc38172619e09ceacaf9a97d4834aa7452e3..9127c12dc5a922804a19ecd8e74aa42abdd7d112 100644 (file)
 <?php
 class BookmarkService {
-    var $db;
-    var $tablename;
-
-    function & getInstance(& $db) {
-        static $instance;
-        if (!isset ($instance))
-            $instance = & new BookmarkService($db);
-        return $instance;
-    }
-
-    function BookmarkService(& $db) {
-        $this->db = & $db;
-       $this->tablename = $GLOBALS['tableprefix'] .'bookmarks';
-    }
-
-    function _getbookmark($fieldname, $value, $all = false) {
-        if (!$all) {
-            $userservice = & ServiceFactory :: getServiceInstance('UserService');
-            $sId = $userservice->getCurrentUserId();
-            $range = ' AND uId = '. $sId;
-        }
-
-        $query = 'SELECT * FROM '. $this->getTableName() .' WHERE '. $fieldname .' = "'. $this->db->sql_escape($value) .'"'. $range;
-
-        if (!($dbresult = & $this->db->sql_query_limit($query, 1, 0))) {
-            message_die(GENERAL_ERROR, 'Could not get bookmark', '', __LINE__, __FILE__, $query, $this->db);
-            return false;
-        }
-
-        if ($row =& $this->db->sql_fetchrow($dbresult)) {
-            return $row;
-        } else {
-            return false;
-        }
-    }
-
-    function & getBookmark($bid, $include_tags = false) {
-        if (!is_numeric($bid))
-            return;
-
-        $sql = 'SELECT * FROM '. $this->getTableName() .' WHERE bId = '. $this->db->sql_escape($bid);
-
-        if (!($dbresult = & $this->db->sql_query($sql)))
-            message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
-
-        if ($row = & $this->db->sql_fetchrow($dbresult)) {
-            if ($include_tags) {
-                $b2tservice = & ServiceFactory :: getServiceInstance('Bookmark2TagService');
-                $row['tags'] = $b2tservice->getTagsForBookmark($bid);
-            }
-            return $row;
-        } else {
-            return false;
-        }
-    }
-
-    function getBookmarkByAddress($address) {
-        $hash = md5($address);
-        return $this->getBookmarkByHash($hash);
-    }
-
-    function getBookmarkByHash($hash) {
-        return $this->_getbookmark('bHash', $hash, true);
-    }
-
-    function editAllowed($bookmark) {
-        if (!is_numeric($bookmark) && (!is_array($bookmark) || !is_numeric($bookmark['bId'])))
-            return false;
-
-        if (!is_array($bookmark))
-            if (!($bookmark = $this->getBookmark($bookmark)))
-                return false;
-
-        $userservice = & ServiceFactory :: getServiceInstance('UserService');
-        $userid = $userservice->getCurrentUserId();
-        if ($userservice->isAdmin($userid))
-            return true;
-        else
-            return ($bookmark['uId'] == $userid);
-    }
-
-    function bookmarkExists($address = false, $uid = NULL) {
-        if (!$address) {
-            return;
-        }
-
-        // If address doesn't contain ":", add "http://" as the default protocol
-        if (strpos($address, ':') === false) {
-            $address = 'http://'. $address;
-        }
-
-        $crit = array ('bHash' => md5($address));
-        if (isset ($uid)) {
-            $crit['uId'] = $uid;
-        }
-
-        $sql = 'SELECT COUNT(*) FROM '. $GLOBALS['tableprefix'] .'bookmarks WHERE '. $this->db->sql_build_array('SELECT', $crit);
-        if (!($dbresult = & $this->db->sql_query($sql))) {
-            message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
-        }
-        return ($this->db->sql_fetchfield(0, 0) > 0);
-    }
-
-    // Adds a bookmark to the database.
-    // Note that date is expected to be a string that's interpretable by strtotime().
-    function addBookmark($address, $title, $description, $status, $categories, $date = NULL, $fromApi = false, $fromImport = false, $sId = -1) {
-       if($sId == -1) {
-           $userservice = & ServiceFactory :: getServiceInstance('UserService');
-            $sId = $userservice->getCurrentUserId();
+       var $db;
+       var $tablename;
+
+       function & getInstance(& $db) {
+               static $instance;
+               if (!isset ($instance))
+               $instance = & new BookmarkService($db);
+               return $instance;
        }
 
-        // If bookmark address doesn't contain ":", add "http://" to the start as a default protocol
-        if (strpos($address, ':') === false) {
-            $address = 'http://'. $address;
-        }
-       if (substr($address, -1) == '/') {
-           $address = substr($address, 0, count($address)-2);
+       function BookmarkService(& $db) {
+               $this->db = & $db;
+               $this->tablename = $GLOBALS['tableprefix'] .'bookmarks';
        }
 
-        // Get the client's IP address and the date; note that the date is in GMT.
-        if (getenv('HTTP_CLIENT_IP'))
-            $ip = getenv('HTTP_CLIENT_IP');
-        else
-            if (getenv('REMOTE_ADDR'))
-                $ip = getenv('REMOTE_ADDR');
-            else
-                $ip = getenv('HTTP_X_FORWARDED_FOR');
-
-        // Note that if date is NULL, then it's added with a date and time of now, and if it's present,
-        // it's expected to be a string that's interpretable by strtotime().
-        if (is_null($date))
-            $time = time();
-        else
-            $time = strtotime($date);
-        $datetime = gmdate('Y-m-d H:i:s', $time);
-
-        // Set up the SQL insert statement and execute it.
-        $values = array('uId' => intval($sId), 'bIp' => $ip, 'bDatetime' => $datetime, 'bModified' => $datetime, 'bTitle' => $title, 'bAddress' => $address, 'bDescription' => $description, 'bStatus' => intval($status), 'bHash' => md5($address));
-        $sql = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
-        $this->db->sql_transaction('begin');
-        if (!($dbresult = & $this->db->sql_query($sql))) {
-            $this->db->sql_transaction('rollback');
-            message_die(GENERAL_ERROR, 'Could not insert bookmark', '', __LINE__, __FILE__, $sql, $this->db);
-            return false;
-        }
-        // Get the resultant row ID for the bookmark.
-        $bId = $this->db->sql_nextid($dbresult);
-        if (!isset($bId) || !is_int($bId)) {
-            $this->db->sql_transaction('rollback');
-            message_die(GENERAL_ERROR, 'Could not insert bookmark', '', __LINE__, __FILE__, $sql, $this->db);
-            return false;
-        }
-
-        $uriparts = explode('.', $address);
-        $extension = end($uriparts);
-        unset($uriparts);
-
-        $b2tservice = & ServiceFactory :: getServiceInstance('Bookmark2TagService');
-        if (!$b2tservice->attachTags($bId, $categories, $fromApi, $extension, false, $fromImport)) {
-            $this->db->sql_transaction('rollback');
-            message_die(GENERAL_ERROR, 'Could not insert bookmark', '', __LINE__, __FILE__, $sql, $this->db);
-            return false;
-        }
-        $this->db->sql_transaction('commit');
-        // Everything worked out, so return the new bookmark's bId.
-        return $bId;
-    }
-
-    function updateBookmark($bId, $address, $title, $description, $status, $categories, $date = NULL, $fromApi = false) {
-        if (!is_numeric($bId))
-            return false;
-
-        // Get the client's IP address and the date; note that the date is in GMT.
-        if (getenv('HTTP_CLIENT_IP'))
-            $ip = getenv('HTTP_CLIENT_IP');
-        else
-            if (getenv('REMOTE_ADDR'))
-                $ip = getenv('REMOTE_ADDR');
-            else
-                $ip = getenv('HTTP_X_FORWARDED_FOR');
-
-        $moddatetime = gmdate('Y-m-d H:i:s', time());
-
-        // Set up the SQL update statement and execute it.
-        $updates = array('bModified' => $moddatetime, 'bTitle' => $title, 'bAddress' => $address, 'bDescription' => $description, 'bStatus' => $status, 'bHash' => md5($address));
-
-        if (!is_null($date)) {
-            $datetime = gmdate('Y-m-d H:i:s', strtotime($date));
-            $updates[] = array('bDateTime' => $datetime);
-        }
-
-        $sql = 'UPDATE '. $GLOBALS['tableprefix'] .'bookmarks SET '. $this->db->sql_build_array('UPDATE', $updates) .' WHERE bId = '. intval($bId);
-        $this->db->sql_transaction('begin');
-
-        if (!($dbresult = & $this->db->sql_query($sql))) {
-            $this->db->sql_transaction('rollback');
-            message_die(GENERAL_ERROR, 'Could not update bookmark', '', __LINE__, __FILE__, $sql, $this->db);
-            return false;
-        }
-
-        $uriparts = explode('.', $address);
-        $extension = end($uriparts);
-        unset($uriparts);
-
-        $b2tservice = & ServiceFactory :: getServiceInstance('Bookmark2TagService');
-        if (!$b2tservice->attachTags($bId, $categories, $fromApi, $extension)) {
-            $this->db->sql_transaction('rollback');
-            message_die(GENERAL_ERROR, 'Could not update bookmark', '', __LINE__, __FILE__, $sql, $this->db);
-            return false;
-        }
-
-        $this->db->sql_transaction('commit');
-        // Everything worked out, so return true.
-        return true;
-    }
-
-    function & getBookmarks($start = 0, $perpage = NULL, $user = NULL, $tags = NULL, $terms = NULL, $sortOrder = NULL, $watched = NULL, $startdate = NULL, $enddate = NULL, $hash = NULL) {
-        // Only get the bookmarks that are visible to the current user.  Our rules:
-        //  - if the $user is NULL, that means get bookmarks from ALL users, so we need to make
-        //    sure to check the logged-in user's watchlist and get the contacts-only bookmarks from
-        //    those users. If the user isn't logged-in, just get the public bookmarks.
-        //  - if the $user is set and isn't the logged-in user, then get that user's bookmarks, and
-        //    if that user is on the logged-in user's watchlist, get the public AND contacts-only
-        //    bookmarks; otherwise, just get the public bookmarks.
-        //  - if the $user is set and IS the logged-in user, then get all bookmarks.
-        $userservice =& ServiceFactory::getServiceInstance('UserService');
-        $b2tservice =& ServiceFactory::getServiceInstance('Bookmark2TagService');
-       $tag2tagservice =& ServiceFactory::getServiceInstance('Tag2TagService');
-        $sId = $userservice->getCurrentUserId();
-
-        if ($userservice->isLoggedOn()) {
-            // All public bookmarks, user's own bookmarks and any shared with user
-            $privacy = ' AND ((B.bStatus = 0) OR (B.uId = '. $sId .')';
-            $watchnames = $userservice->getWatchNames($sId, true);
-            foreach($watchnames as $watchuser) {
-                $privacy .= ' OR (U.username = "'. $watchuser .'" AND B.bStatus = 1)'; 
-            }
-            $privacy .= ')';
-        } else {
-            // Just public bookmarks
-            $privacy = ' AND B.bStatus = 0';
-        }
-
-        // Set up the tags, if need be.
-        if (!is_array($tags) && !is_null($tags)) {
-            $tags = explode('+', trim($tags));
-        }
-
-        $tagcount = count($tags);
-        for ($i = 0; $i < $tagcount; $i ++) {
-            $tags[$i] = trim($tags[$i]);
-        }
-
-        // Set up the SQL query.
-        $query_1 = 'SELECT DISTINCT ';
-        if (SQL_LAYER == 'mysql4') {
-            $query_1 .= 'SQL_CALC_FOUND_ROWS ';
-        }
-        $query_1 .= 'B.*, U.'. $userservice->getFieldName('username');
-
-        $query_2 = ' FROM '. $userservice->getTableName() .' AS U, '. $this->getTableName() .' AS B';
-
-        $query_3 = ' WHERE B.uId = U.'. $userservice->getFieldName('primary') . $privacy;
-        if (is_null($watched)) {
-            if (!is_null($user)) {
-                $query_3 .= ' AND B.uId = '. $user;
-            }
-        } else {
-            $arrWatch = $userservice->getWatchlist($user);
-            if (count($arrWatch) > 0) {
-                foreach($arrWatch as $row) {
-                    $query_3_1 .= 'B.uId = '. intval($row) .' OR ';
-                }
-                $query_3_1 = substr($query_3_1, 0, -3);
-            } else {
-                $query_3_1 = 'B.uId = -1';
-            }
-            $query_3 .= ' AND ('. $query_3_1 .') AND B.bStatus IN (0, 1)';
-        }
-
-       $query_5 = '';
-       if($hash == null) {
-           $query_5.= ' GROUP BY B.bHash';
+       function _getbookmark($fieldname, $value, $all = false) {
+               if (!$all) {
+                       $userservice = & ServiceFactory :: getServiceInstance('UserService');
+                       $sId = $userservice->getCurrentUserId();
+                       $range = ' AND uId = '. $sId;
+               }
+
+               $query = 'SELECT * FROM '. $this->getTableName() .' WHERE '. $fieldname .' = "'. $this->db->sql_escape($value) .'"'. $range;
+
+               if (!($dbresult = & $this->db->sql_query_limit($query, 1, 0))) {
+                       message_die(GENERAL_ERROR, 'Could not get bookmark', '', __LINE__, __FILE__, $query, $this->db);
+                       return false;
+               }
+
+               if ($row =& $this->db->sql_fetchrow($dbresult)) {
+                       return $row;
+               } else {
+                       return false;
+               }
        }
 
-        switch($sortOrder) {
-            case 'date_asc':
-                $query_5.= ' ORDER BY B.bDatetime ASC ';
-                break;
-            case 'title_desc':
-                $query_5.= ' ORDER BY B.bTitle DESC ';
-                break;
-            case 'title_asc':
-                $query_5.= ' ORDER BY B.bTitle ASC ';
-                break;
-            case 'url_desc':
-                $query_5.= ' ORDER BY B.bAddress DESC ';
-                break;
-            case 'url_asc':
-                $query_5.= ' ORDER BY B.bAddress ASC ';
-                break;
-            default:
-                $query_5.= ' ORDER BY B.bDatetime DESC ';
-        }
-
-        // Handle the parts of the query that depend on any tags that are present.
-        $query_4 = '';
-        for ($i = 0; $i < $tagcount; $i ++) {
-            $query_2 .= ', '. $b2tservice->getTableName() .' AS T'. $i;
-            $query_4 .= ' AND (';
-
-           $allLinkedTags = $tag2tagservice->getAllLinkedTags($this->db->sql_escape($tags[$i]), '>', $user);
-
-           while (is_array($allLinkedTags) && count($allLinkedTags)>0) {
-               $query_4 .= ' T'. $i .'.tag = "'. array_pop($allLinkedTags) .'"';
-               $query_4 .= ' OR';
-           }
-
-           $query_4 .= ' T'. $i .'.tag = "'. $this->db->sql_escape($tags[$i]) .'"';
-            
-            $query_4 .= ') AND T'. $i .'.bId = B.bId';
-//die($query_4);
-        }
-
-        // Search terms
-        if ($terms) {
-            // Multiple search terms okay
-            $aTerms = explode(' ', $terms);
-            $aTerms = array_map('trim', $aTerms);
-
-            // Search terms in tags as well when none given
-            if (!count($tags)) {
-                $query_2 .= ' LEFT JOIN '. $b2tservice->getTableName() .' AS T ON B.bId = T.bId';
-                $dotags = true;
-            } else {
-                $dotags = false;
-            }
-
-            $query_4 = '';
-            for ($i = 0; $i < count($aTerms); $i++) {
-                $query_4 .= ' AND (B.bTitle LIKE "%'. $this->db->sql_escape($aTerms[$i]) .'%"';
-                $query_4 .= ' OR B.bDescription LIKE "%'. $this->db->sql_escape($aTerms[$i]) .'%"';
-                if ($dotags) {
-                    $query_4 .= ' OR T.tag = "'. $this->db->sql_escape($aTerms[$i]) .'"';
-                }
-                $query_4 .= ')';
-            }
-        }
-
-        // Start and end dates
-        if ($startdate) {
-            $query_4 .= ' AND B.bDatetime > "'. $startdate .'"';
-        }
-        if ($enddate) {
-            $query_4 .= ' AND B.bDatetime < "'. $enddate .'"';
-        }
-
-        // Hash
-        if ($hash) {
-            $query_4 .= ' AND B.bHash = "'. $hash .'"';
-        }
-        $query = $query_1 . $query_2 . $query_3 . $query_4 . $query_5;
-//die($query);
-        if (!($dbresult = & $this->db->sql_query_limit($query, intval($perpage), intval($start)))) {
-            message_die(GENERAL_ERROR, 'Could not get bookmarks', '', __LINE__, __FILE__, $query, $this->db);
-            return false;
-        }
-
-        if (SQL_LAYER == 'mysql4') {
-            $totalquery = 'SELECT FOUND_ROWS() AS total';
-        } else {
-           if ($hash) {
-                $totalquery = 'SELECT COUNT(*) AS total'. $query_2 . $query_3 . $query_4;
-           } else {
-               $totalquery = 'SELECT COUNT(DISTINCT bAddress) AS total'. $query_2 . $query_3 . $query_4;
-           }
-        }
-
-        if (!($totalresult = & $this->db->sql_query($totalquery)) || (!($row = & $this->db->sql_fetchrow($totalresult)))) {
-            message_die(GENERAL_ERROR, 'Could not get total bookmarks', '', __LINE__, __FILE__, $totalquery, $this->db);
-            return false;
-        }
-
-        $total = $row['total'];
-
-        $bookmarks = array();
-        while ($row = & $this->db->sql_fetchrow($dbresult)) {
-            $row['tags'] = $b2tservice->getTagsForBookmark(intval($row['bId']));
-            $bookmarks[] = $row;
-        }
-
-       $output = array ('bookmarks' => $bookmarks, 'total' => $total);
-        return $output;
-    }
-
-    function deleteBookmark($bookmarkid) {
-        $query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'bookmarks WHERE bId = '. intval($bookmarkid);
-        $this->db->sql_transaction('begin');
-        if (!($dbresult = & $this->db->sql_query($query))) {
-            $this->db->sql_transaction('rollback');
-            message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db);
-            return false;
-        }
-
-        $query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'tags WHERE bId = '. intval($bookmarkid);
-        $this->db->sql_transaction('begin');
-        if (!($dbresult = & $this->db->sql_query($query))) {
-            $this->db->sql_transaction('rollback');
-            message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db);
-            return false;
-        }
-
-        $this->db->sql_transaction('commit');
-        return true;
-    }
-
-    function deleteBookmarksForUser($uId) {\r
-        $query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'bookmarks WHERE uId = '. intval($uId);\r
+       function & getBookmark($bid, $include_tags = false) {
+               if (!is_numeric($bid))
+               return;
+
+               $sql = 'SELECT * FROM '. $this->getTableName() .' WHERE bId = '. $this->db->sql_escape($bid);
+
+               if (!($dbresult = & $this->db->sql_query($sql)))
+               message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
+
+               if ($row = & $this->db->sql_fetchrow($dbresult)) {
+                       if ($include_tags) {
+                               $b2tservice = & ServiceFactory :: getServiceInstance('Bookmark2TagService');
+                               $row['tags'] = $b2tservice->getTagsForBookmark($bid);
+                       }
+                       return $row;
+               } else {
+                       return false;
+               }
+       }
+
+       function getBookmarkByAddress($address) {
+               $hash = md5($address);
+               return $this->getBookmarkByHash($hash);
+       }
+
+       function getBookmarkByHash($hash) {
+               return $this->_getbookmark('bHash', $hash, true);
+       }
+
+       function editAllowed($bookmark) {
+               if (!is_numeric($bookmark) && (!is_array($bookmark) || !is_numeric($bookmark['bId'])))
+               return false;
+
+               if (!is_array($bookmark))
+               if (!($bookmark = $this->getBookmark($bookmark)))
+               return false;
+
+               $userservice = & ServiceFactory :: getServiceInstance('UserService');
+               $userid = $userservice->getCurrentUserId();
+               if ($userservice->isAdmin($userid))
+               return true;
+               else
+               return ($bookmark['uId'] == $userid);
+       }
+
+       function bookmarkExists($address = false, $uid = NULL) {
+               if (!$address) {
+                       return;
+               }
+
+               // If address doesn't contain ":", add "http://" as the default protocol
+               if (strpos($address, ':') === false) {
+                       $address = 'http://'. $address;
+               }
+
+               $crit = array ('bHash' => md5($address));
+               if (isset ($uid)) {
+                       $crit['uId'] = $uid;
+               }
+
+               $sql = 'SELECT COUNT(*) FROM '. $GLOBALS['tableprefix'] .'bookmarks WHERE '. $this->db->sql_build_array('SELECT', $crit);
+               if (!($dbresult = & $this->db->sql_query($sql))) {
+                       message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
+               }
+               return ($this->db->sql_fetchfield(0, 0) > 0);
+       }
+
+       // Adds a bookmark to the database.
+       // Note that date is expected to be a string that's interpretable by strtotime().
+       function addBookmark($address, $title, $description, $status, $categories, $date = NULL, $fromApi = false, $fromImport = false, $sId = -1) {
+               if($sId == -1) {
+                       $userservice = & ServiceFactory :: getServiceInstance('UserService');
+                       $sId = $userservice->getCurrentUserId();
+               }
+
+               // If bookmark address doesn't contain ":", add "http://" to the start as a default protocol
+               if (strpos($address, ':') === false) {
+                       $address = 'http://'. $address;
+               }
+               if (substr($address, -1) == '/') {
+                       $address = substr($address, 0, count($address)-2);
+               }
+
+               // Get the client's IP address and the date; note that the date is in GMT.
+               if (getenv('HTTP_CLIENT_IP'))
+               $ip = getenv('HTTP_CLIENT_IP');
+               else
+               if (getenv('REMOTE_ADDR'))
+               $ip = getenv('REMOTE_ADDR');
+               else
+               $ip = getenv('HTTP_X_FORWARDED_FOR');
+
+               // Note that if date is NULL, then it's added with a date and time of now, and if it's present,
+               // it's expected to be a string that's interpretable by strtotime().
+               if (is_null($date))
+               $time = time();
+               else
+               $time = strtotime($date);
+               $datetime = gmdate('Y-m-d H:i:s', $time);
+
+               // Set up the SQL insert statement and execute it.
+               $values = array('uId' => intval($sId), 'bIp' => $ip, 'bDatetime' => $datetime, 'bModified' => $datetime, 'bTitle' => $title, 'bAddress' => $address, 'bDescription' => $description, 'bStatus' => intval($status), 'bHash' => md5($address));
+               $sql = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
+               $this->db->sql_transaction('begin');
+               if (!($dbresult = & $this->db->sql_query($sql))) {
+                       $this->db->sql_transaction('rollback');
+                       message_die(GENERAL_ERROR, 'Could not insert bookmark', '', __LINE__, __FILE__, $sql, $this->db);
+                       return false;
+               }
+               // Get the resultant row ID for the bookmark.
+               $bId = $this->db->sql_nextid($dbresult);
+               if (!isset($bId) || !is_int($bId)) {
+                       $this->db->sql_transaction('rollback');
+                       message_die(GENERAL_ERROR, 'Could not insert bookmark', '', __LINE__, __FILE__, $sql, $this->db);
+                       return false;
+               }
+
+               $uriparts = explode('.', $address);
+               $extension = end($uriparts);
+               unset($uriparts);
+
+               $b2tservice = & ServiceFactory :: getServiceInstance('Bookmark2TagService');
+               if (!$b2tservice->attachTags($bId, $categories, $fromApi, $extension, false, $fromImport)) {
+                       $this->db->sql_transaction('rollback');
+                       message_die(GENERAL_ERROR, 'Could not insert bookmark', '', __LINE__, __FILE__, $sql, $this->db);
+                       return false;
+               }
+               $this->db->sql_transaction('commit');
+               // Everything worked out, so return the new bookmark's bId.
+               return $bId;
+       }
+
+       function updateBookmark($bId, $address, $title, $description, $status, $categories, $date = NULL, $fromApi = false) {
+               if (!is_numeric($bId))
+               return false;
+
+               // Get the client's IP address and the date; note that the date is in GMT.
+               if (getenv('HTTP_CLIENT_IP'))
+               $ip = getenv('HTTP_CLIENT_IP');
+               else
+               if (getenv('REMOTE_ADDR'))
+               $ip = getenv('REMOTE_ADDR');
+               else
+               $ip = getenv('HTTP_X_FORWARDED_FOR');
+
+               $moddatetime = gmdate('Y-m-d H:i:s', time());
+
+               // Set up the SQL update statement and execute it.
+               $updates = array('bModified' => $moddatetime, 'bTitle' => $title, 'bAddress' => $address, 'bDescription' => $description, 'bStatus' => $status, 'bHash' => md5($address));
+
+               if (!is_null($date)) {
+                       $datetime = gmdate('Y-m-d H:i:s', strtotime($date));
+                       $updates[] = array('bDateTime' => $datetime);
+               }
+
+               $sql = 'UPDATE '. $GLOBALS['tableprefix'] .'bookmarks SET '. $this->db->sql_build_array('UPDATE', $updates) .' WHERE bId = '. intval($bId);
+               $this->db->sql_transaction('begin');
+
+               if (!($dbresult = & $this->db->sql_query($sql))) {
+                       $this->db->sql_transaction('rollback');
+                       message_die(GENERAL_ERROR, 'Could not update bookmark', '', __LINE__, __FILE__, $sql, $this->db);
+                       return false;
+               }
+
+               $uriparts = explode('.', $address);
+               $extension = end($uriparts);
+               unset($uriparts);
+
+               $b2tservice = & ServiceFactory :: getServiceInstance('Bookmark2TagService');
+               if (!$b2tservice->attachTags($bId, $categories, $fromApi, $extension)) {
+                       $this->db->sql_transaction('rollback');
+                       message_die(GENERAL_ERROR, 'Could not update bookmark', '', __LINE__, __FILE__, $sql, $this->db);
+                       return false;
+               }
+
+               $this->db->sql_transaction('commit');
+               // Everything worked out, so return true.
+               return true;
+       }
+
+       function & getBookmarks($start = 0, $perpage = NULL, $user = NULL, $tags = NULL, $terms = NULL, $sortOrder = NULL, $watched = NULL, $startdate = NULL, $enddate = NULL, $hash = NULL) {
+               // Only get the bookmarks that are visible to the current user.  Our rules:
+               //  - if the $user is NULL, that means get bookmarks from ALL users, so we need to make
+               //    sure to check the logged-in user's watchlist and get the contacts-only bookmarks from
+               //    those users. If the user isn't logged-in, just get the public bookmarks.
+               //  - if the $user is set and isn't the logged-in user, then get that user's bookmarks, and
+               //    if that user is on the logged-in user's watchlist, get the public AND contacts-only
+               //    bookmarks; otherwise, just get the public bookmarks.
+               //  - if the $user is set and IS the logged-in user, then get all bookmarks.
+               
+               $userservice =& ServiceFactory::getServiceInstance('UserService');
+               $b2tservice =& ServiceFactory::getServiceInstance('Bookmark2TagService');
+               $tag2tagservice =& ServiceFactory::getServiceInstance('Tag2TagService');
+               $sId = $userservice->getCurrentUserId();
+
+               if ($userservice->isLoggedOn()) {
+                       // All public bookmarks, user's own bookmarks and any shared with user
+                       $privacy = ' AND ((B.bStatus = 0) OR (B.uId = '. $sId .')';
+                       $watchnames = $userservice->getWatchNames($sId, true);
+                       foreach($watchnames as $watchuser) {
+                               $privacy .= ' OR (U.username = "'. $watchuser .'" AND B.bStatus = 1)';
+                       }
+                       $privacy .= ')';
+               } else {
+                       // Just public bookmarks
+                       $privacy = ' AND B.bStatus = 0';
+               }
+
+               // Set up the tags, if need be.
+               if (!is_array($tags) && !is_null($tags)) {
+                       $tags = explode('+', trim($tags));
+               }
+
+               $tagcount = count($tags);
+               for ($i = 0; $i < $tagcount; $i ++) {
+                       $tags[$i] = trim($tags[$i]);
+               }
+
+               // Set up the SQL query.
+               $query_1 = 'SELECT DISTINCT ';
+               if (SQL_LAYER == 'mysql4') {
+                       $query_1 .= 'SQL_CALC_FOUND_ROWS ';
+               }
+               $query_1 .= 'B.*, U.'. $userservice->getFieldName('username');
+
+               $query_2 = ' FROM '. $userservice->getTableName() .' AS U, '. $this->getTableName() .' AS B';
+
+               $query_3 = ' WHERE B.uId = U.'. $userservice->getFieldName('primary') . $privacy;
+               if (is_null($watched)) {
+                       if (!is_null($user)) {
+                               $query_3 .= ' AND B.uId = '. $user;
+                       }
+               } else {
+                       $arrWatch = $userservice->getWatchlist($user);
+                       if (count($arrWatch) > 0) {
+                               foreach($arrWatch as $row) {
+                                       $query_3_1 .= 'B.uId = '. intval($row) .' OR ';
+                               }
+                               $query_3_1 = substr($query_3_1, 0, -3);
+                       } else {
+                               $query_3_1 = 'B.uId = -1';
+                       }
+                       $query_3 .= ' AND ('. $query_3_1 .') AND B.bStatus IN (0, 1)';
+               }
+
+               $query_5 = '';
+               if($hash == null) {
+                       $query_5.= ' GROUP BY B.bHash';
+               }
+
+               switch($sortOrder) {
+                       case 'date_asc':
+                               $query_5.= ' ORDER BY B.bDatetime ASC ';
+                               break;
+                       case 'title_desc':
+                               $query_5.= ' ORDER BY B.bTitle DESC ';
+                               break;
+                       case 'title_asc':
+                               $query_5.= ' ORDER BY B.bTitle ASC ';
+                               break;
+                       case 'url_desc':
+                               $query_5.= ' ORDER BY B.bAddress DESC ';
+                               break;
+                       case 'url_asc':
+                               $query_5.= ' ORDER BY B.bAddress ASC ';
+                               break;
+                       default:
+                               $query_5.= ' ORDER BY B.bDatetime DESC ';
+               }
+
+               // Handle the parts of the query that depend on any tags that are present.
+               $query_4 = '';
+               for ($i = 0; $i < $tagcount; $i ++) {
+                       $query_2 .= ', '. $b2tservice->getTableName() .' AS T'. $i;
+                       $query_4 .= ' AND (';
+
+                       $allLinkedTags = $tag2tagservice->getAllLinkedTags($this->db->sql_escape($tags[$i]), '>', $user);
+
+                       while (is_array($allLinkedTags) && count($allLinkedTags)>0) {
+                               $query_4 .= ' T'. $i .'.tag = "'. array_pop($allLinkedTags) .'"';
+                               $query_4 .= ' OR';
+                       }
+
+                       $query_4 .= ' T'. $i .'.tag = "'. $this->db->sql_escape($tags[$i]) .'"';
+
+                       $query_4 .= ') AND T'. $i .'.bId = B.bId';
+                       //die($query_4);
+               }
+
+               // Search terms
+               if ($terms) {
+                       // Multiple search terms okay
+                       $aTerms = explode(' ', $terms);
+                       $aTerms = array_map('trim', $aTerms);
+
+                       // Search terms in tags as well when none given
+                       if (!count($tags)) {
+                               $query_2 .= ' LEFT JOIN '. $b2tservice->getTableName() .' AS T ON B.bId = T.bId';
+                               $dotags = true;
+                       } else {
+                               $dotags = false;
+                       }
+
+                       $query_4 = '';
+                       for ($i = 0; $i < count($aTerms); $i++) {
+                               $query_4 .= ' AND (B.bTitle LIKE "%'. $this->db->sql_escape($aTerms[$i]) .'%"';
+                               $query_4 .= ' OR B.bDescription LIKE "%'. $this->db->sql_escape($aTerms[$i]) .'%"';
+                               if ($dotags) {
+                                       $query_4 .= ' OR T.tag = "'. $this->db->sql_escape($aTerms[$i]) .'"';
+                               }
+                               $query_4 .= ')';
+                       }
+               }
+
+               // Start and end dates
+               if ($startdate) {
+                       $query_4 .= ' AND B.bDatetime > "'. $startdate .'"';
+               }
+               if ($enddate) {
+                       $query_4 .= ' AND B.bDatetime < "'. $enddate .'"';
+               }
+
+               // Hash
+               if ($hash) {
+                       $query_4 .= ' AND B.bHash = "'. $hash .'"';
+               }
+               $query = $query_1 . $query_2 . $query_3 . $query_4 . $query_5;
+               //die($query);
+               if (!($dbresult = & $this->db->sql_query_limit($query, intval($perpage), intval($start)))) {
+                       message_die(GENERAL_ERROR, 'Could not get bookmarks', '', __LINE__, __FILE__, $query, $this->db);
+                       return false;
+               }
+
+               if (SQL_LAYER == 'mysql4') {
+                       $totalquery = 'SELECT FOUND_ROWS() AS total';
+               } else {
+                       if ($hash) {
+                               $totalquery = 'SELECT COUNT(*) AS total'. $query_2 . $query_3 . $query_4;
+                       } else {
+                               $totalquery = 'SELECT COUNT(DISTINCT bAddress) AS total'. $query_2 . $query_3 . $query_4;
+                       }
+               }
+
+               if (!($totalresult = & $this->db->sql_query($totalquery)) || (!($row = & $this->db->sql_fetchrow($totalresult)))) {
+                       message_die(GENERAL_ERROR, 'Could not get total bookmarks', '', __LINE__, __FILE__, $totalquery, $this->db);
+                       return false;
+               }
+
+               $total = $row['total'];
+
+               $bookmarks = array();
+               while ($row = & $this->db->sql_fetchrow($dbresult)) {
+                       $row['tags'] = $b2tservice->getTagsForBookmark(intval($row['bId']));
+                       $bookmarks[] = $row;
+               }
+
+               $output = array ('bookmarks' => $bookmarks, 'total' => $total);
+               return $output;
+       }
+
+       function deleteBookmark($bookmarkid) {
+               $query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'bookmarks WHERE bId = '. intval($bookmarkid);
+               $this->db->sql_transaction('begin');
+               if (!($dbresult = & $this->db->sql_query($query))) {
+                       $this->db->sql_transaction('rollback');
+                       message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db);
+                       return false;
+               }
+
+               $query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'tags WHERE bId = '. intval($bookmarkid);
+               $this->db->sql_transaction('begin');
+               if (!($dbresult = & $this->db->sql_query($query))) {
+                       $this->db->sql_transaction('rollback');
+                       message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db);
+                       return false;
+               }
+
+               $this->db->sql_transaction('commit');
+               return true;
+       }
+
+       function deleteBookmarksForUser($uId) {\r
+               $query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'bookmarks WHERE uId = '. intval($uId);\r
 \r
-        if (!($dbresult = & $this->db->sql_query($query))) {\r
-            message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db);\r
-            return false;\r
-        }\r
+               if (!($dbresult = & $this->db->sql_query($query))) {\r
+                       message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db);\r
+                       return false;\r
+               }\r
 \r
-        return true;\r
-    }
-
-    function countOthers($address) {
-        if (!$address) {
-            return false;
-        }
-
-        $userservice = & ServiceFactory :: getServiceInstance('UserService');
-        $sId = $userservice->getCurrentUserId();
-
-        if ($userservice->isLoggedOn()) {
-            // All public bookmarks, user's own bookmarks and any shared with user
-            $privacy = ' AND ((B.bStatus = 0) OR (B.uId = '. $sId .')';
-            $watchnames = $userservice->getWatchNames($sId, true);
-            foreach($watchnames as $watchuser) {
-                $privacy .= ' OR (U.username = "'. $watchuser .'" AND B.bStatus = 1)'; 
-            }
-            $privacy .= ')';
-        } else {
-            // Just public bookmarks
-            $privacy = ' AND B.bStatus = 0';
-        }
-
-        $sql = 'SELECT COUNT(*) FROM '. $userservice->getTableName() .' AS U, '. $GLOBALS['tableprefix'] .'bookmarks AS B WHERE U.'. $userservice->getFieldName('primary') .' = B.uId AND B.bHash = "'. md5($address) .'"'. $privacy;
-        if (!($dbresult = & $this->db->sql_query($sql))) {
-            message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
-        }
-        return $this->db->sql_fetchfield(0, 0) - 1;
-    }
-
-    function deleteAll() {
-       $query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
-       $this->db->sql_query($query);
-    }
-
-    // Properties
-    function getTableName()       { return $this->tablename; }
-    function setTableName($value) { $this->tablename = $value; }
+               return true;\r
+       }
+
+       function countOthers($address) {
+               if (!$address) {
+                       return false;
+               }
+
+               $userservice = & ServiceFactory :: getServiceInstance('UserService');
+               $sId = $userservice->getCurrentUserId();
+
+               if ($userservice->isLoggedOn()) {
+                       // All public bookmarks, user's own bookmarks and any shared with user
+                       $privacy = ' AND ((B.bStatus = 0) OR (B.uId = '. $sId .')';
+                       $watchnames = $userservice->getWatchNames($sId, true);
+                       foreach($watchnames as $watchuser) {
+                               $privacy .= ' OR (U.username = "'. $watchuser .'" AND B.bStatus = 1)';
+                       }
+                       $privacy .= ')';
+               } else {
+                       // Just public bookmarks
+                       $privacy = ' AND B.bStatus = 0';
+               }
+
+               $sql = 'SELECT COUNT(*) FROM '. $userservice->getTableName() .' AS U, '. $GLOBALS['tableprefix'] .'bookmarks AS B WHERE U.'. $userservice->getFieldName('primary') .' = B.uId AND B.bHash = "'. md5($address) .'"'. $privacy;
+               if (!($dbresult = & $this->db->sql_query($sql))) {
+                       message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
+               }
+               return $this->db->sql_fetchfield(0, 0) - 1;
+       }
+
+       function deleteAll() {
+               $query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
+               $this->db->sql_query($query);
+       }
+
+       // Properties
+       function getTableName()       { return $this->tablename; }
+       function setTableName($value) { $this->tablename = $value; }
 
 }
 
index 1275157c70579f85078b017cfc06dc8ba4bcccc7..f79cbfb3fa7e6136864d4fb843c1f6867266cc15 100644 (file)
--- a/users.php
+++ b/users.php
@@ -1,23 +1,23 @@
 <?php
 /***************************************************************************
-Copyright (C) 2004 - 2006 Scuttle project
-http://sourceforge.net/projects/scuttle/
-http://scuttle.org/
+ Copyright (C) 2004 - 2006 Scuttle project
+ http://sourceforge.net/projects/scuttle/
+ http://scuttle.org/
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-***************************************************************************/
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ ***************************************************************************/
 
 require_once('header.inc.php');
 
@@ -33,15 +33,15 @@ list($url, $cat) = explode('/', $_SERVER['PATH_INFO']);
 $pagetitle = T_('Users');
 
 if ($usecache) {
-    // Generate hash for caching on
-    if ($userservice->isLoggedOn()) {
-        $hash = md5($_SERVER['REQUEST_URI'] . $userservice->getCurrentUserID());
-    } else {
-        $hash = md5($_SERVER['REQUEST_URI']);
-    }
+       // Generate hash for caching on
+       if ($userservice->isLoggedOn()) {
+               $hash = md5($_SERVER['REQUEST_URI'] . $userservice->getCurrentUserID());
+       } else {
+               $hash = md5($_SERVER['REQUEST_URI']);
+       }
 
-    // Cache for 30 minutes
-    $cacheservice->Start($hash, 1800);
+       // Cache for 30 minutes
+       $cacheservice->Start($hash, 1800);
 }
 
 // Header variables
@@ -58,7 +58,7 @@ $tplVars['users'] =& $userservice->getUsers();
 $templateservice->loadTemplate('users.tpl', $tplVars);
 
 if ($usecache) {
-    // Cache output if existing copy has expired
-    $cacheservice->End($hash);
+       // Cache output if existing copy has expired
+       $cacheservice->End($hash);
 }
 ?>