/FSN/mediatheque/zp-core/functions.php
PHP | 1651 lines | 1402 code | 51 blank | 198 comment | 148 complexity | 341fa69277a54ad1f454f8c06fda8aeb MD5 | raw file
- <?php
- /**
- * basic functions used by zenphoto
- *
- * @package core
- *
- */
- // force UTF-8 Ø
- global $_zp_current_context_stack, $_zp_HTML_cache;
- if (!function_exists("json_encode")) {
- // load the drop-in replacement library
- require_once(dirname(__FILE__) . '/lib-json.php');
- }
- require_once(dirname(__FILE__) . '/functions-basic.php');
- require_once(dirname(__FILE__) . '/functions-filter.php');
- require_once(SERVERPATH . '/' . ZENFOLDER . '/lib-kses.php');
- $_zp_captcha = new _zp_captcha(); // this will be overridden by the plugin if enabled.
- $_zp_HTML_cache = new _zp_HTML_cache(); // this will be overridden by the plugin if enabled.
- //setup session before checking for logon cookie
- require_once(dirname(__FILE__) . '/functions-i18n.php');
- if (GALLERY_SESSION) {
- zp_session_start();
- }
- define('ZENPHOTO_LOCALE', setMainDomain());
- define('SITE_LOCALE', getOptionFromDB('locale'));
- require_once(dirname(__FILE__) . '/load_objectClasses.php');
- $_zp_current_context_stack = array();
- $_zp_albumthumb_selector = array(array('field' => '', 'direction' => '', 'desc' => 'random'),
- array('field' => 'id', 'direction' => 'DESC', 'desc' => gettext('most recent')),
- array('field' => 'mtime', 'direction' => '', 'desc' => gettext('oldest')),
- array('field' => 'title', 'direction' => '', 'desc' => gettext('first alphabetically')),
- array('field' => 'hitcounter', 'direction' => 'DESC', 'desc' => gettext('most viewed'))
- );
- $_zp_missing_album = new AlbumBase(gettext('missing'), false);
- $_zp_missing_image = new Transientimage($_zp_missing_album, SERVERPATH . '/' . ZENFOLDER . '/images/err-imagenotfound.png');
- /**
- * parses the allowed HTML tags for use by htmLawed
- *
- * @param string &$source by name, contains the string with the tag options
- * @return array the allowed_tags array.
- * @since 1.1.3
- * */
- function parseAllowedTags(&$source) {
- $source = trim($source);
- if (substr($source, 0, 1) != "(") {
- return false;
- }
- $source = substr($source, 1); //strip off the open paren
- $a = array();
- while ((strlen($source) > 1) && (substr($source, 0, 1) != ")")) {
- $i = strpos($source, '=>');
- if ($i === false) {
- return false;
- }
- $tag = trim(substr($source, 0, $i));
- //strip forbidden tags from list
- if ($tag == 'script') {
- return 0;
- }
- $source = trim(substr($source, $i + 2));
- if (substr($source, 0, 1) != "(") {
- return false;
- }
- $x = parseAllowedTags($source);
- if ($x === false) {
- return false;
- }
- $a[$tag] = $x;
- }
- if (substr($source, 0, 1) != ')') {
- return false;
- }
- $source = trim(substr($source, 1)); //strip the close paren
- return $a;
- }
- /**
- * Search for a thumbnail for the image
- *
- * @param $localpath local path of the image
- * @return string
- */
- function checkObjectsThumb($localpath) {
- global $_zp_supported_images;
- $image = stripSuffix($localpath);
- $candidates = safe_glob($image . '.*');
- foreach ($candidates as $file) {
- $ext = substr($file, strrpos($file, '.') + 1);
- if (in_array(strtolower($ext), $_zp_supported_images)) {
- return basename($image . '.' . $ext);
- }
- }
- return NULL;
- }
- /**
- * Returns a truncated string
- *
- * @param string $string souirce string
- * @param int $length how long it should be
- * @param string $elipsis the text to tack on indicating shortening
- * @return string
- */
- function truncate_string($string, $length, $elipsis = '...') {
- if (mb_strlen($string) > $length) {
- $string = mb_substr($string, 0, $length);
- $pos = mb_strrpos(strtr($string, array('~' => ' ', '!' => ' ', '@' => ' ', '#' => ' ', '$' => ' ', '%' => ' ', '^' => ' ', '&' => ' ', '*' => ' ', '(' => ' ', ')' => ' ', '+' => ' ', '=' => ' ', '-' => ' ', '{' => ' ', '}' => ' ', '[' => ' ', ']' => ' ', '|' => ' ', ':' => ' ', ';' => ' ', '<' => ' ', '>' => ' ', '.' => ' ', '?' => ' ', '/' => ' ', '\\', '\\' => ' ', "'" => ' ', "`" => ' ', '"' => ' ')), ' ');
- if ($pos === FALSE) {
- $string .= $elipsis;
- } else {
- $string = mb_substr($string, 0, $pos) . $elipsis;
- }
- }
- return $string;
- }
- /**
- *
- * fixes unbalanced HTML tags. Used by shortenContent when PHP tidy is not present
- * @param string $html
- * @return string
- */
- function cleanHTML($html) {
- preg_match_all('#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
- $openedtags = $result[1];
- preg_match_all('#</([a-z]+)>#iU', $html, $result);
- $closedtags = $result[1];
- $len_opened = count($openedtags);
- if (count($closedtags) == $len_opened) {
- return $html;
- }
- $openedtags = array_reverse($openedtags);
- for ($i = 0; $i < $len_opened; $i++) {
- if (!in_array($openedtags[$i], $closedtags)) {
- $html .= '</' . $openedtags[$i] . '>';
- } else {
- unset($closedtags[array_search($openedtags[$i], $closedtags)]);
- }
- }
- return $html;
- }
- /**
- * Returns truncated html formatted content
- *
- * @param string $articlecontent the source string
- * @param int $shorten new size
- * @param string $shortenindicator
- * @param bool $forceindicator set to true to include the indicator no matter what
- * @return string
- */
- function shortenContent($articlecontent, $shorten, $shortenindicator, $forceindicator = false) {
- global $_user_tags;
- if ($shorten && ($forceindicator || (mb_strlen($articlecontent) > $shorten))) {
- $allowed_tags = getAllowedTags('allowed_tags');
- //remove script to be replaced later
- $articlecontent = preg_replace('~<script.*?/script>~is', '', $articlecontent);
- //remove HTML comments
- $articlecontent = preg_replace('~<!--.*?-->~is', '', $articlecontent);
- $short = mb_substr($articlecontent, 0, $shorten);
- $short2 = kses($short . '</p>', $allowed_tags);
- if (($l2 = mb_strlen($short2)) < $shorten) {
- $c = 0;
- $l1 = $shorten;
- $delta = $shorten - $l2;
- while ($l2 < $shorten && $c++ < 5) {
- $open = mb_strrpos($short, '<');
- if ($open > mb_strrpos($short, '>')) {
- $l1 = mb_strpos($articlecontent, '>', $l1 + 1) + $delta;
- } else {
- $l1 = $l1 + $delta;
- }
- $short = mb_substr($articlecontent, 0, $l1);
- preg_match_all('/(<p>)/', $short, $open);
- preg_match_all('/(<\/p>)/', $short, $close);
- if (count($open) > count($close))
- $short .= '</p>';
- $short2 = kses($short, $allowed_tags);
- $l2 = mb_strlen($short2);
- }
- $shorten = $l1;
- }
- $short = truncate_string($articlecontent, $shorten, '');
- if ($short != $articlecontent) { // we actually did remove some stuff
- // drop open tag strings
- $open = mb_strrpos($short, '<');
- if ($open > mb_strrpos($short, '>')) {
- $short = mb_substr($short, 0, $open);
- }
- if (class_exists('tidy')) {
- $tidy = new tidy();
- $tidy->parseString($short . $shortenindicator, array('show-body-only' => true), 'utf8');
- $tidy->cleanRepair();
- $short = trim($tidy);
- } else {
- $short = trim(cleanHTML($short . $shortenindicator));
- }
- }
- $articlecontent = $short;
- }
- if (isset($matches)) {
- //replace the script text
- foreach ($matches[0] as $script) {
- $articlecontent = $script . $articlecontent;
- }
- }
- return $articlecontent;
- }
- /**
- * Returns the oldest ancestor of an alubm;
- *
- * @param string $album an album object
- * @return object
- */
- function getUrAlbum($album) {
- if (!is_object($album))
- return NULL;
- while (true) {
- $parent = $album->getParent();
- if (is_null($parent)) {
- return $album;
- }
- $album = $parent;
- }
- }
- /**
- * Returns a sort field part for querying
- * Note: $sorttype may be a comma separated list of field names. If so,
- * these are peckmarked and returned otherwise unchanged.
- *
- * @param string $sorttype the 'Display" name of the sort
- * @param string $default the default if $sorttype is empty
- * @param string $table the database table being used.
- * @return string
- */
- function lookupSortKey($sorttype, $default, $table) {
- global $_zp_fieldLists;
- switch (strtolower($sorttype)) {
- case 'random':
- return 'RAND()';
- case "manual":
- return '`sort_order`';
- case "filename":
- switch ($table) {
- case 'images':
- return '`filename`';
- case 'albums':
- return '`folder`';
- }
- default:
- if (empty($sorttype)) {
- return '`' . $default . '`';
- }
- if (substr($sorttype, 0) == '(') {
- return $sorttype;
- }
- if (is_array($_zp_fieldLists) && isset($_zp_fieldLists[$table])) {
- $dbfields = $_zp_fieldLists[$table];
- } else {
- $result = db_list_fields($table);
- $dbfields = array();
- if ($result) {
- foreach ($result as $row) {
- $dbfields[strtolower($row['Field'])] = $row['Field'];
- }
- }
- $_zp_fieldLists[$table] = $dbfields;
- }
- $sorttype = strtolower($sorttype);
- $list = explode(',', $sorttype);
- foreach ($list as $key => $field) {
- if (array_key_exists($field, $dbfields)) {
- $list[$key] = '`' . trim($dbfields[$field]) . '`';
- }
- }
- return implode(',', $list);
- }
- }
- /**
- * Returns a formated date for output
- *
- * @param string $format the "strftime" format string
- * @param date $dt the date to be output
- * @return string
- */
- function zpFormattedDate($format, $dt) {
- global $_zp_UTF8;
- $fdate = strftime($format, $dt);
- $charset = 'ISO-8859-1';
- $outputset = LOCAL_CHARSET;
- if (function_exists('mb_internal_encoding')) {
- if (($charset = mb_internal_encoding()) == $outputset) {
- return $fdate;
- }
- }
- return $_zp_UTF8->convert($fdate, $charset, $outputset);
- }
- /**
- * Simple SQL timestamp formatting function.
- *
- * @param string $format formatting template
- * @param int $mytimestamp timestamp
- * @return string
- */
- function myts_date($format, $mytimestamp) {
- $timezoneadjust = getOption('time_offset');
- $month = substr($mytimestamp, 4, 2);
- $day = substr($mytimestamp, 6, 2);
- $year = substr($mytimestamp, 0, 4);
- $hour = substr($mytimestamp, 8, 2);
- $min = substr($mytimestamp, 10, 2);
- $sec = substr($mytimestamp, 12, 2);
- $epoch = mktime($hour + $timezoneadjust, $min, $sec, $month, $day, $year);
- $date = zpFormattedDate($format, $epoch);
- return $date;
- }
- /**
- * Determines if the input is an e-mail address. Adapted from WordPress.
- * Name changed to avoid conflicts in WP integrations.
- *
- * @param string $input_email email address?
- * @return bool
- */
- function is_valid_email_zp($input_email) {
- $chars = "/^([a-z0-9+_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}\$/i";
- if (strstr($input_email, '@') && strstr($input_email, '.')) {
- if (preg_match($chars, $input_email)) {
- return true;
- }
- }
- return false;
- }
- /**
- * Send an mail to the mailing list. We also attempt to intercept any form injection
- * attacks by slime ball spammers. Returns error message if send failure.
- *
- * @param string $subject The subject of the email.
- * @param string $message The message contents of the email.
- * @param array $email_list a list of email addresses to send to
- * @param array $cc_addresses a list of addresses to send copies to.
- * @param array $bcc_addresses a list of addresses to send blind copies to.
- * @param string $replyTo reply-to address
- *
- * @return string
- *
- * @author Todd Papaioannou (lucky@luckyspin.org)
- * @since 1.0.0
- */
- function zp_mail($subject, $message, $email_list = NULL, $cc_addresses = NULL, $bcc_addresses = NULL, $replyTo = NULL) {
- global $_zp_authority, $_zp_gallery, $_zp_UTF8;
- $result = '';
- if ($replyTo) {
- $t = $replyTo;
- if (!is_valid_email_zp($m = array_shift($t))) {
- if (empty($result)) {
- $result = gettext('Mail send failed.');
- }
- $result .= sprintf(gettext('Invalid “reply-to” mail address %s.'), $m);
- }
- }
- if (is_null($email_list)) {
- $email_list = $_zp_authority->getAdminEmail();
- } else {
- foreach ($email_list as $key => $email) {
- if (!is_valid_email_zp($email)) {
- unset($email_list[$key]);
- if (empty($result)) {
- $result = gettext('Mail send failed.');
- }
- $result .= ' ' . sprintf(gettext('Invalid “to” mail address %s.'), $email);
- }
- }
- }
- if (is_null($cc_addresses)) {
- $cc_addresses = array();
- } else {
- if (empty($email_list) && !empty($cc_addresses)) {
- if (empty($result)) {
- $result = gettext('Mail send failed.');
- }
- $result .= ' ' . gettext('“cc” list provided without “to” address list.');
- return $result;
- }
- foreach ($cc_addresses as $key => $email) {
- if (!is_valid_email_zp($email)) {
- unset($cc_addresses[$key]);
- if (empty($result)) {
- $result = gettext('Mail send failed.');
- }
- $result = ' ' . sprintf(gettext('Invalid “cc” mail address %s.'), $email);
- }
- }
- }
- if (is_null($bcc_addresses)) {
- $bcc_addresses = array();
- } else {
- foreach ($bcc_addresses as $key => $email) {
- if (!is_valid_email_zp($email)) {
- unset($bcc_addresses[$key]);
- if (empty($result)) {
- $result = gettext('Mail send failed.');
- }
- $result = ' ' . sprintf(gettext('Invalid “bcc” mail address %s.'), $email);
- }
- }
- }
- if (count($email_list) + count($bcc_addresses) > 0) {
- if (zp_has_filter('sendmail')) {
- $from_mail = getOption('site_email');
- $from_name = get_language_string(getOption('site_email_name'));
- // Convert to UTF-8
- if (LOCAL_CHARSET != 'UTF-8') {
- $subject = $_zp_UTF8->convert($subject, LOCAL_CHARSET);
- $message = $_zp_UTF8->convert($message, LOCAL_CHARSET);
- }
- // we do not support rich text
- $message = preg_replace('~<p[^>]*>~', "\n", $message); // Replace the start <p> or <p attr="">
- $message = preg_replace('~</p>~', "\n", $message); // Replace the end
- $message = preg_replace('~<br[^>]*>~', "\n", $message); // Replace <br> or <br ...>
- $message = preg_replace('~<ol[^>]*>~', "", $message); // Replace the start <ol> or <ol attr="">
- $message = preg_replace('~</ol>~', "", $message); // Replace the end
- $message = preg_replace('~<ul[^>]*>~', "", $message); // Replace the start <ul> or <ul attr="">
- $message = preg_replace('~</ul>~', "", $message); // Replace the end
- $message = preg_replace('~<li[^>]*>~', ".\t", $message); // Replace the start <li> or <li attr="">
- $message = preg_replace('~</li>~', "", $message); // Replace the end
- $message = getBare($message);
- $message = preg_replace('~\n\n\n+~', "\n\n", $message);
- // Send the mail
- if (count($email_list) > 0) {
- $result = zp_apply_filter('sendmail', '', $email_list, $subject, $message, $from_mail, $from_name, $cc_addresses, $replyTo); // will be true if all mailers succeeded
- }
- if (count($bcc_addresses) > 0) {
- foreach ($bcc_addresses as $bcc) {
- $result = zp_apply_filter('sendmail', '', array($bcc), $subject, $message, $from_mail, $from_name, array(), $replyTo); // will be true if all mailers succeeded
- }
- }
- } else {
- $result = gettext('Mail send failed. There is no mail handler configured.');
- }
- } else {
- if (empty($result)) {
- $result = gettext('Mail send failed.');
- }
- $result .= ' ' . gettext('No “to” address list provided.');
- }
- return $result;
- }
- /**
- * Sorts the results of a DB search by the current locale string for $field
- *
- * @param array $dbresult the result of the DB query
- * @param string $field the field name to sort on
- * @param bool $descending the direction of the sort
- * @return array the sorted result
- */
- function sortByMultilingual($dbresult, $field, $descending) {
- $temp = array();
- foreach ($dbresult as $key => $row) {
- $temp[$key] = get_language_string($row[$field]);
- }
- natcasesort($temp);
- if ($descending) {
- $temp = array_reverse($temp, true);
- }
- $result = array();
- foreach ($temp as $key => $v) {
- $result[] = $dbresult[$key];
- }
- return $result;
- }
- /**
- * Checks to see access is allowed to an album
- * Returns true if access is allowed.
- * There is no password dialog--you must have already had authorization via a cookie.
- *
- * @param string $album album object or name of the album
- * @param string &$hint becomes populated with the password hint.
- * @return bool
- */
- function checkAlbumPassword($album, &$hint = NULL) {
- global $_zp_pre_authorization, $_zp_gallery;
- if (is_object($album)) {
- $albumname = $album->name;
- } else {
- $album = newAlbum($albumname = $album, true, true);
- }
- if (isset($_zp_pre_authorization[$albumname])) {
- return $_zp_pre_authorization[$albumname];
- }
- $hash = $album->getPassword();
- if (empty($hash)) {
- $album = $album->getParent();
- while (!is_null($album)) {
- $hash = $album->getPassword();
- $authType = "zp_album_auth_" . $album->getID();
- $saved_auth = zp_getCookie($authType);
- if (!empty($hash)) {
- if ($saved_auth == $hash) {
- $_zp_pre_authorization[$albumname] = $authType;
- return $authType;
- } else {
- $hint = $album->getPasswordHint();
- return false;
- }
- }
- $album = $album->getParent();
- }
- // revert all tlhe way to the gallery
- $hash = $_zp_gallery->getPassword();
- $authType = 'zp_gallery_auth';
- $saved_auth = zp_getCookie($authType);
- if (empty($hash)) {
- $authType = 'zp_public_access';
- } else {
- if ($saved_auth != $hash) {
- $hint = $_zp_gallery->getPasswordHint();
- return false;
- }
- }
- } else {
- $authType = "zp_album_auth_" . $album->getID();
- $saved_auth = zp_getCookie($authType);
- if ($saved_auth != $hash) {
- $hint = $album->getPasswordHint();
- return false;
- }
- }
- $_zp_pre_authorization[$albumname] = $authType;
- return $authType;
- }
- /**
- * Returns a consolidated list of plugins
- * The array structure is key=plugin name, value=plugin path
- *
- * @param string $pattern File system wildcard matching pattern to limit the search
- * @param string $folder subfolder within the plugin folders to search
- * @param bool $stripsuffix set to true to remove the suffix from the key name in the array
- * @return array
- */
- function getPluginFiles($pattern, $folder = '', $stripsuffix = true) {
- if (!empty($folder) && substr($folder, -1) != '/')
- $folder .= '/';
- $list = array();
- $curdir = getcwd();
- $basepath = SERVERPATH . "/" . USER_PLUGIN_FOLDER . '/' . $folder;
- if (is_dir($basepath)) {
- chdir($basepath);
- $filelist = safe_glob($pattern);
- foreach ($filelist as $file) {
- $key = filesystemToInternal($file);
- if ($stripsuffix) {
- $key = stripSuffix($key);
- }
- $list[$key] = $basepath . $file;
- }
- }
- $basepath = SERVERPATH . "/" . ZENFOLDER . '/' . PLUGIN_FOLDER . '/' . $folder;
- if (file_exists($basepath)) {
- chdir($basepath);
- $filelist = safe_glob($pattern);
- foreach ($filelist as $file) {
- $key = filesystemToInternal($file);
- if ($stripsuffix) {
- $key = stripSuffix($key);
- }
- $list[$key] = $basepath . $file;
- }
- }
- chdir($curdir);
- return $list;
- }
- /**
- * Returns the fully qualified file name of the plugin file.
- *
- * Note: order of selection is:
- * 1-theme folder file (if $inTheme is set)
- * 2-user plugin folder file
- * 3-zp-extensions file
- * first file found is used
- *
- * @param string $plugin is the name of the plugin file, typically something.php
- * @param bool $inTheme tells where to find the plugin.
- * true means look in the current theme
- * false means look in the zp-core/plugins folder.
- * @param bool $webpath return a WEBPATH rather than a SERVERPATH
- *
- * @return string
- */
- function getPlugin($plugin, $inTheme = false, $webpath = false) {
- global $_zp_gallery;
- $pluginFile = NULL;
- if ($inTheme === true) {
- $inTheme = $_zp_gallery->getCurrentTheme();
- }
- if ($inTheme) {
- $pluginFile = '/' . THEMEFOLDER . '/' . internalToFilesystem($inTheme . '/' . $plugin);
- if (!file_exists(SERVERPATH . $pluginFile)) {
- $pluginFile = false;
- }
- }
- if (!$pluginFile) {
- $pluginFile = '/' . USER_PLUGIN_FOLDER . '/' . internalToFilesystem($plugin);
- if (!file_exists(SERVERPATH . $pluginFile)) {
- $pluginFile = '/' . ZENFOLDER . '/' . PLUGIN_FOLDER . '/' . internalToFilesystem($plugin);
- if (!file_exists(SERVERPATH . $pluginFile)) {
- $pluginFile = false;
- }
- }
- }
- if ($pluginFile) {
- if ($webpath) {
- if (is_string($webpath)) {
- return $webpath . filesystemToInternal($pluginFile);
- } else {
- return WEBPATH . filesystemToInternal($pluginFile);
- }
- } else {
- return SERVERPATH . $pluginFile;
- }
- }
- return false;
- }
- /**
- * Returns an array of the currently enabled plugins
- *
- * @return array
- */
- function getEnabledPlugins() {
- global $_EnabledPlugins;
- if (is_array($_EnabledPlugins)) {
- return $_EnabledPlugins;
- }
- $_EnabledPlugins = array();
- $sortlist = getPluginFiles('*.php');
- foreach ($sortlist as $extension => $path) {
- $opt = 'zp_plugin_' . $extension;
- if ($option = getOption($opt)) {
- $_EnabledPlugins[$extension] = array('priority' => $option, 'path' => $path);
- }
- }
- $_EnabledPlugins = sortMultiArray($_EnabledPlugins, 'priority', true);
- return $_EnabledPlugins;
- }
- /**
- * Returns if a plugin is enabled
- * @param string $extension
- * @return bool
- */
- function extensionEnabled($extension) {
- return getOption('zp_plugin_' . $extension);
- }
- /**
- * Enables a plugin
- * @param string $extension
- * @param int $priority
- * @param bool $persistent
- */
- function enableExtension($extension, $priority, $persistent = true) {
- setOption('zp_plugin_' . $extension, $priority, $persistent);
- }
- /**
- * Gets an array of comments for the current admin
- *
- * @param int $number how many comments desired
- * @return array
- */
- function fetchComments($number) {
- if ($number) {
- $limit = " LIMIT $number";
- } else {
- $limit = '';
- }
- $comments = array();
- if (zp_loggedin(ADMIN_RIGHTS | COMMENT_RIGHTS)) {
- if (zp_loggedin(ADMIN_RIGHTS | MANAGE_ALL_ALBUM_RIGHTS)) {
- $sql = "SELECT *, (date + 0) AS date FROM " . prefix('comments') . " ORDER BY id DESC$limit";
- $comments = query_full_array($sql);
- } else {
- $albumlist = getManagedAlbumList();
- $albumIDs = array();
- foreach ($albumlist as $albumname) {
- $subalbums = getAllSubAlbumIDs($albumname);
- foreach ($subalbums as $ID) {
- $albumIDs[] = $ID['id'];
- }
- }
- if (count($albumIDs) > 0) {
- $sql = "SELECT *, (`date` + 0) AS date FROM " . prefix('comments') . " WHERE ";
- $sql .= " (`type`='albums' AND (";
- $i = 0;
- foreach ($albumIDs as $ID) {
- if ($i > 0) {
- $sql .= " OR ";
- }
- $sql .= "(" . prefix('comments') . ".ownerid=$ID)";
- $i++;
- }
- $sql .= ")) ";
- $sql .= " ORDER BY id DESC$limit";
- $albumcomments = query($sql);
- if ($albumcomments) {
- while ($comment = db_fetch_assoc($albumcomments)) {
- $comments[$comment['id']] = $comment;
- }
- db_free_result($albumcomments);
- }
- $sql = "SELECT *, " . prefix('comments') . ".id as id, " .
- prefix('comments') . ".name as name, (" . prefix('comments') . ".date + 0) AS date, " .
- prefix('images') . ".`albumid` as albumid," .
- prefix('images') . ".`id` as imageid" .
- " FROM " . prefix('comments') . "," . prefix('images') . " WHERE ";
- $sql .= "(`type` IN (" . zp_image_types("'") . ") AND (";
- $i = 0;
- foreach ($albumIDs as $ID) {
- if ($i > 0) {
- $sql .= " OR ";
- }
- $sql .= "(" . prefix('comments') . ".ownerid=" . prefix('images') . ".id AND " . prefix('images') . ".albumid=$ID)";
- $i++;
- }
- $sql .= "))";
- $sql .= " ORDER BY " . prefix('images') . ".`id` DESC$limit";
- $imagecomments = query($sql);
- if ($imagecomments) {
- while ($comment = db_fetch_assoc($imagecomments)) {
- $comments[$comment['id']] = $comment;
- }
- db_free_result($imagecomments);
- }
- krsort($comments);
- if ($number) {
- if ($number < count($comments)) {
- $comments = array_slice($comments, 0, $number);
- }
- }
- }
- }
- }
- return $comments;
- }
- /**
- * Populates and returns the $_zp_admin_album_list array
- * @return array
- */
- function getManagedAlbumList() {
- global $_zp_admin_album_list, $_zp_current_admin_obj;
- $_zp_admin_album_list = array();
- if (zp_loggedin(MANAGE_ALL_ALBUM_RIGHTS)) {
- $sql = "SELECT `folder` FROM " . prefix('albums') . ' WHERE `parentid` IS NULL';
- $albums = query($sql);
- if ($albums) {
- while ($album = db_fetch_assoc($albums)) {
- $_zp_admin_album_list[$album['folder']] = 32767;
- }
- db_free_result($albums);
- }
- } else {
- if ($_zp_current_admin_obj) {
- $_zp_admin_album_list = array();
- $objects = $_zp_current_admin_obj->getObjects();
- foreach ($objects as $object) {
- if ($object['type'] == 'album') {
- $_zp_admin_album_list[$object['data']] = $object['edit'];
- }
- }
- }
- }
- return array_keys($_zp_admin_album_list);
- }
- /**
- * Returns a list of album names managed by $id
- *
- * @param string $type which kind of object
- * @param int $id admin ID
- * @param bool $rights set true for album sub-rights
- * @return array
- */
- function populateManagedObjectsList($type, $id, $rights = false) {
- if ($id <= 0) {
- return array();
- }
- $cv = array();
- if (empty($type) || substr($type, 0, 5) == 'album') {
- $sql = "SELECT " . prefix('albums') . ".`folder`," . prefix('albums') . ".`title`," . prefix('admin_to_object') . ".`edit` FROM " . prefix('albums') . ", " .
- prefix('admin_to_object') . " WHERE " . prefix('admin_to_object') . ".adminid=" . $id .
- " AND " . prefix('albums') . ".id=" . prefix('admin_to_object') . ".objectid AND " . prefix('admin_to_object') . ".type LIKE 'album%'";
- $currentvalues = query($sql, false);
- if ($currentvalues) {
- while ($albumitem = db_fetch_assoc($currentvalues)) {
- $folder = $albumitem['folder'];
- $name = get_language_string($albumitem['title']);
- if ($type && !$rights) {
- $cv[$name] = $folder;
- } else {
- $cv[] = array('data' => $folder, 'name' => $name, 'type' => 'album', 'edit' => $albumitem['edit'] + 0);
- }
- }
- db_free_result($currentvalues);
- }
- }
- if (empty($type) || $type == 'pages') {
- $sql = 'SELECT ' . prefix('pages') . '.`title`,' . prefix('pages') . '.`titlelink` FROM ' . prefix('pages') . ', ' .
- prefix('admin_to_object') . " WHERE " . prefix('admin_to_object') . ".adminid=" . $id .
- " AND " . prefix('pages') . ".id=" . prefix('admin_to_object') . ".objectid AND " . prefix('admin_to_object') . ".type='pages'";
- $currentvalues = query($sql, false);
- if ($currentvalues) {
- while ($item = db_fetch_assoc($currentvalues)) {
- if ($type) {
- $cv[get_language_string($item['title'])] = $item['titlelink'];
- } else {
- $cv[] = array('data' => $item['titlelink'], 'name' => $item['title'], 'type' => 'pages');
- }
- }
- db_free_result($currentvalues);
- }
- }
- if (empty($type) || $type == 'news') {
- $sql = 'SELECT ' . prefix('news_categories') . '.`titlelink`,' . prefix('news_categories') . '.`title` FROM ' . prefix('news_categories') . ', ' .
- prefix('admin_to_object') . " WHERE " . prefix('admin_to_object') . ".adminid=" . $id .
- " AND " . prefix('news_categories') . ".id=" . prefix('admin_to_object') . ".objectid AND " . prefix('admin_to_object') . ".type='news'";
- $currentvalues = query($sql, false);
- if ($currentvalues) {
- while ($item = db_fetch_assoc($currentvalues)) {
- if ($type) {
- $cv[get_language_string($item['title'])] = $item['titlelink'];
- } else {
- $cv[] = array('data' => $item['titlelink'], 'name' => $item['title'], 'type' => 'news');
- }
- }
- db_free_result($currentvalues);
- }
- }
- return $cv;
- }
- /**
- * Returns an array of album ids whose parent is the folder
- * @param string $albumfolder folder name if you want a album different >>from the current album
- * @return array
- */
- function getAllSubAlbumIDs($albumfolder = '') {
- global $_zp_current_album;
- if (empty($albumfolder)) {
- if (isset($_zp_current_album)) {
- $albumfolder = $_zp_current_album->getFileName();
- } else {
- return null;
- }
- }
- $query = "SELECT `id`,`folder`, `show` FROM " . prefix('albums') . " WHERE `folder` LIKE " . db_quote(db_LIKE_escape($albumfolder) . '%');
- $subIDs = query_full_array($query);
- return $subIDs;
- }
- /**
- * recovers search parameters from stored cookie, clears the cookie
- *
- * @param string $what the page type
- * @param string $album Name of the album
- * @param string $image Name of the image
- */
- function handleSearchParms($what, $album = NULL, $image = NULL) {
- global $_zp_current_search, $zp_request, $_zp_last_album, $_zp_current_album,
- $_zp_current_zenpage_news, $_zp_current_zenpage_page, $_zp_gallery, $_zp_loggedin;
- $_zp_last_album = zp_getCookie('zenphoto_last_album');
- if (is_object($zp_request) && get_class($zp_request) == 'SearchEngine') { // we are are on a search
- return $zp_request->getAlbumList();
- }
- $params = zp_getCookie('zenphoto_search_params');
- if (!empty($params)) {
- $context = get_context();
- $_zp_current_search = new SearchEngine();
- $_zp_current_search->setSearchParams($params);
- // check to see if we are still "in the search context"
- if (!is_null($image)) {
- $dynamic_album = $_zp_current_search->getDynamicAlbum();
- if ($_zp_current_search->getImageIndex($album->name, $image->filename) !== false) {
- if ($dynamic_album) {
- $_zp_current_album = $dynamic_album;
- }
- $context = $context | ZP_SEARCH_LINKED | ZP_IMAGE_LINKED;
- }
- }
- if (!is_null($album)) {
- $albumname = $album->name;
- zp_setCookie('zenphoto_last_album', $albumname);
- if (hasDynamicAlbumSuffix($albumname) && !is_dir(ALBUM_FOLDER_SERVERPATH . $albumname)) {
- $albumname = stripSuffix($albumname); // strip off the suffix as it will not be reflected in the search path
- }
- // see if the album is within the search context. NB for these purposes we need to look at all albums!
- $save_logon = $_zp_loggedin;
- $_zp_loggedin = $_zp_loggedin | VIEW_ALL_RIGHTS;
- $search_album_list = $_zp_current_search->getAlbums(0);
- $_zp_loggedin = $save_logon;
- foreach ($search_album_list as $searchalbum) {
- if (strpos($albumname, $searchalbum) !== false) {
- $context = $context | ZP_SEARCH_LINKED | ZP_ALBUM_LINKED;
- break;
- }
- }
- } else {
- zp_clearCookie('zenphoto_last_album');
- }
- if (!is_null($_zp_current_zenpage_page)) {
- $pages = $_zp_current_search->getPages();
- if (!empty($pages)) {
- $tltlelink = $_zp_current_zenpage_page->getTitlelink();
- foreach ($pages as $apage) {
- if ($apage == $tltlelink) {
- $context = $context | ZP_SEARCH_LINKED;
- break;
- }
- }
- }
- }
- if (!is_null($_zp_current_zenpage_news)) {
- $news = $_zp_current_search->getArticles(0, NULL, true);
- if (!empty($news)) {
- $tltlelink = $_zp_current_zenpage_news->getTitlelink();
- foreach ($news as $anews) {
- if ($anews['titlelink'] == $tltlelink) {
- $context = $context | ZP_SEARCH_LINKED;
- break;
- }
- }
- }
- }
- if (($context & ZP_SEARCH_LINKED)) {
- set_context($context);
- } else { // not an object in the current search path
- $_zp_current_search = null;
- rem_context(ZP_SEARCH);
- if (!isset($_REQUEST['preserve_serch_params'])) {
- zp_clearCookie("zenphoto_search_params");
- }
- }
- }
- }
- /**
- *
- * checks if the item has expired
- * @param array $row database row of the object
- */
- function checkPublishDates($row) {
- if (@$row['show']) {
- if (isset($row['expiredate']) && $row['expiredate'] && $row['expiredate'] != '0000-00-00 00:00:00') {
- if ($row['expiredate'] <= date('Y-m-d H:i:s')) {
- return 1;
- }
- }
- if (isset($row['publishdate']) && $row['publishdate'] && $row['publishdate'] != '0000-00-00 00:00:00') {
- if ($row['publishdate'] >= date('Y-m-d H:i:s')) {
- return 2;
- }
- }
- return null;
- }
- }
- /**
- * Returns the number of album thumbs that go on a gallery page
- *
- * @return int
- */
- function galleryAlbumsPerPage() {
- return max(1, getOption('albums_per_page'));
- }
- /**
- * Returns the theme folder
- * If there is an album theme, loads the theme options.
- *
- * @param object $album album object if override desired
- *
- * @return string
- */
- function setupTheme($album = NULL) {
- global $_zp_gallery, $_zp_current_album, $_zp_current_search, $_zp_themeroot;
- $albumtheme = '';
- if (is_null($album)) {
- if (in_context(ZP_SEARCH_LINKED)) {
- if (!$album = $_zp_current_search->getDynamicAlbum()) {
- $album = $_zp_current_album;
- }
- } else {
- $album = $_zp_current_album;
- }
- }
- $theme = $_zp_gallery->getCurrentTheme();
- $id = 0;
- if (!is_null($album)) {
- $parent = getUrAlbum($album);
- $albumtheme = $parent->getAlbumTheme();
- if (!empty($albumtheme)) {
- $theme = $albumtheme;
- $id = $parent->getID();
- }
- }
- $theme = zp_apply_filter('setupTheme', $theme);
- $_zp_gallery->setCurrentTheme($theme);
- $themeindex = getPlugin('index.php', $theme);
- if (empty($theme) || empty($themeindex)) {
- header('Last-Modified: ' . ZP_LAST_MODIFIED);
- header('Content-Type: text/html; charset=' . LOCAL_CHARSET);
- ?>
- <!DOCTYPE html>
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- </head>
- <body>
- <strong><?php printf(gettext('Zenphoto found no theme scripts. Please check the <em>%s</em> folder of your installation.'), THEMEFOLDER); ?></strong>
- </body>
- </html>
- <?php
- exitZP();
- } else {
- loadLocalOptions($id, $theme);
- $_zp_themeroot = WEBPATH . "/" . THEMEFOLDER . "/$theme";
- }
- return $theme;
- }
- /**
- * Returns an array of unique tag names
- *
- * @param bool $checkaccess Set to true if you wish to exclude tags that are assigned to items (or are not assigned at all) the visitor is not allowed to see
- * Beware that this may cause overhead on large sites. Usage of the static_html_cache plugin is strongely recommended.
- * @return array
- */
- function getAllTagsUnique($checkaccess = false) {
- global $_zp_unique_tags, $_zp_unique_tags_excluded;
- if(zp_loggedin(VIEW_ALL_RIGHTS)) {
- $checkaccess = false;
- }
- //need to cache all and filtered tags indiviually
- if ($checkaccess) {
- if (!is_null($_zp_unique_tags_excluded)) {
- return $_zp_unique_tags_excluded; // cache them.
- }
- } else {
- if (!is_null($_zp_unique_tags)) {
- return $_zp_unique_tags; // cache them.
- }
- }
- $all_unique_tags = array();
- $sql = "SELECT DISTINCT `name`, `id` FROM " . prefix('tags') . ' ORDER BY `name`';
- $unique_tags = query($sql);
- if ($unique_tags) {
- while ($tagrow = db_fetch_assoc($unique_tags)) {
- if ($checkaccess) {
- if (getTagCountByAccess($tagrow) != 0) {
- $all_unique_tags[] = $tagrow['name'];
- }
- } else {
- $all_unique_tags[] = $tagrow['name'];
- }
- }
- db_free_result($unique_tags);
- }
- if ($checkaccess) {
- $_zp_unique_tags_excluded = $all_unique_tags;
- return $_zp_unique_tags_excluded;
- } else {
- $_zp_unique_tags = $all_unique_tags;
- return $_zp_unique_tags;
- }
- }
- /**
- * Returns an array indexed by 'tag' with the element value the count of the tag
- *
- * @param bool $exclude_unassigned Set to true if you wish to exclude tags that are not assigne to any item
- * @param bool $checkaccess Set to true if you wish to exclude tags that are assigned to items (or are not assigned at all) the visitor is not allowed to see
- * If set to true it overrides the $exclude_unassigned parameter.
- * Beware that this may cause overhead on large sites. Usage of the static_html_cache plugin is strongely recommended.
- * @return array
- */
- function getAllTagsCount($exclude_unassigned = false, $checkaccess = false) {
- global $_zp_count_tags;
- if (!is_null($_zp_count_tags)) {
- return $_zp_count_tags;
- }
- if(zp_loggedin(VIEW_ALL_RIGHTS)) {
- $exclude_unassigned = false;
- $checkaccess = false;
- }
- $_zp_count_tags = array();
- $sql = "SELECT DISTINCT tags.name, tags.id, (SELECT COUNT(*) FROM " . prefix('obj_to_tag') . " as object WHERE object.tagid = tags.id) AS count FROM " . prefix('tags') . " as tags ORDER BY `name`";
- $tagresult = query($sql);
- if ($tagresult) {
- while ($tag = db_fetch_assoc($tagresult)) {
- if($checkaccess) {
- $count = getTagCountByAccess($tag);
- if($count != 0) {
- $_zp_count_tags[$tag['name']] = $count;
- }
- } else {
- if($exclude_unassigned) {
- if($tag['count'] != 0) {
- $_zp_count_tags[$tag['name']] = $tag['count'];
- }
- } else {
- $_zp_count_tags[$tag['name']] = $tag['count'];
- }
- }
- }
- db_free_result($tagresult);
- }
- return $_zp_count_tags;
- }
- /**
- * Checks if a tag is assigned at all and if it can be viewed by the current visitor and returns the corrected count
- * Helper function used optionally within getAllTagsCount() and getAllTagsUnique()
- *
- * @global obj $_zp_zenpage
- * @param array $tag Array representing a tag containing at least its name and id
- * @return int
- */
- function getTagCountByAccess($tag) {
- global $_zp_zenpage, $_zp_object_to_tags;
- if (array_key_exists('count', $tag) && $tag['count'] == 0) {
- return $tag['count'];
- }
- $hidealbums = getNotViewableAlbums();
- $hideimages = getNotViewableImages();
- $hidenews = array();
- $hidepages = array();
- if (extensionEnabled('Zenpage')) {
- $hidenews = $_zp_zenpage->getNotViewableNews();
- $hidepages = $_zp_zenpage->getNotViewablePages();
- }
- //skip checks if there are no unviewable items at all
- if (empty($hidealbums) && empty($hideimages) && empty($hidenews) && empty($hidepages)) {
- if (array_key_exists('count', $tag)) {
- return $tag['count'];
- }
- return 0;
- }
- if (is_null($_zp_object_to_tags)) {
- $sql = "SELECT tagid, type, objectid FROM " . prefix('obj_to_tag') . " ORDER BY tagid";
- $_zp_object_to_tags = query_full_array($sql);
- }
- $count = '';
- if ($_zp_object_to_tags) {
- foreach($_zp_object_to_tags as $tagcheck) {
- if ($tagcheck['tagid'] == $tag['id']) {
- switch ($tagcheck['type']) {
- case 'albums':
- if (!in_array($tagcheck['objectid'], $hidealbums)) {
- $count++;
- }
- break;
- case 'images':
- if (!in_array($tagcheck['objectid'], $hideimages)) {
- $count++;
- }
- break;
- case 'news':
- if (extensionEnabled('Zenpage') && ZP_NEWS_ENABLED) {
- if (!in_array($tagcheck['objectid'], $hidenews)) {
- $count++;
- }
- }
- break;
- case 'pages':
- if (extensionEnabled('Zenpage') && ZP_PAGES_ENABLED) {
- if (!in_array($tagcheck['objectid'], $hidepages)) {
- $count++;
- }
- }
- break;
- }
- }
- }
- }
- if (empty($count)) {
- $count = 0;
- }
- return $count;
- }
- /**
- * Stores tags for an object
- *
- * @param array $tags the tag values
- * @param int $id the record id of the album/image
- * @param string $tbl database table of the object
- */
- function storeTags($tags, $id, $tbl) {
- if ($id) {
- $tagsLC = array();
- foreach ($tags as $key => $tag) {
- $tag = trim($tag);
- if (!empty($tag)) {
- $lc_tag = mb_strtolower($tag);
- if (!in_array($lc_tag, $tagsLC)) {
- $tagsLC[$tag] = $lc_tag;
- }
- }
- }
- $sql = "SELECT `id`, `tagid` from " . prefix('obj_to_tag') . " WHERE `objectid`='" . $id . "' AND `type`='" . $tbl . "'";
- $result = query($sql);
- $existing = array();
- if ($result) {
- while ($row = db_fetch_assoc($result)) {
- $dbtag = query_single_row("SELECT `name` FROM " . prefix('tags') . " WHERE `id`='" . $row['tagid'] . "'");
- $existingLC = mb_strtolower($dbtag['name']);
- if (in_array($existingLC, $tagsLC)) { // tag already set no action needed
- $existing[] = $existingLC;
- } else { // tag no longer set, remove it
- query("DELETE FROM " . prefix('obj_to_tag') . " WHERE `id`='" . $row['id'] . "'");
- }
- }
- db_free_result($result);
- }
- $tags = array_diff($tagsLC, $existing); // new tags for the object
- foreach ($tags as $key => $tag) {
- $dbtag = query_single_row("SELECT `id` FROM " . prefix('tags') . " WHERE `name`=" . db_quote($key));
- if (!is_array($dbtag)) { // tag does not exist
- query("INSERT INTO " . prefix('tags') . " (name) VALUES (" . db_quote($key) . ")", false);
- $dbtag = array('id' => db_insert_id());
- }
- query("INSERT INTO " . prefix('obj_to_tag') . "(`objectid`, `tagid`, `type`) VALUES (" . $id . "," . $dbtag['id'] . ",'" . $tbl . "')");
- }
- }
- }
- /**
- * Retrieves the tags for an object
- * Returns them in an array
- *
- * @param int $id the record id of the album/image
- * @param string $tbl 'albums' or 'images', etc.
- * @return unknown
- */
- function readTags($id, $tbl) {
- $tags = array();
- $result = query("SELECT `tagid` FROM " . prefix('obj_to_tag') . " WHERE `type`='" . $tbl . "' AND `objectid`='" . $id . "'");
- if ($result) {
- while ($row = db_fetch_assoc($result)) {
- $dbtag = query_single_row("SELECT `name` FROM" . prefix('tags') . " WHERE `id`='" . $row['tagid'] . "'");
- if ($dbtag) {
- $tags[] = $dbtag['name'];
- }
- }
- db_free_result($result);
- }
- natcasesort($tags);
- return $tags;
- }
- /**
- * Creates the body of a select list
- *
- * @param array $currentValue list of items to be flagged as checked
- * @param array $list the elements of the select list
- * @param bool $descending set true for a reverse order sort
- */
- function generateListFromArray($currentValue, $list, $descending, $localize) {
- if ($localize) {
- $list = array_flip($list);
- if ($descending) {
- arsort($list);
- } else {
- natcasesort($list);
- }
- $list = array_flip($list);
- } else {
- if ($descending) {
- rsort($list);
- } else {
- natcasesort($list);
- }
- }
- foreach ($list as $key => $item) {
- echo '<option value="' . html_encode($item) . '"';
- if (in_array($item, $currentValue)) {
- echo ' selected="selected"';
- }
- if ($localize)
- $display = $key;
- else
- $display = $item;
- echo '>' . $display . "</option>" . "\n";
- }
- }
- /**
- * Generates a selection list from files found on disk
- *
- * @param strig $currentValue the current value of the selector
- * @param string $root directory path to search
- * @param string $suffix suffix to select for
- * @param bool $descending set true to get a reverse order sort
- */
- function generateListFromFiles($currentValue, $root, $suffix, $descending = false) {
- if (is_dir($root)) {
- $curdir = getcwd();
- chdir($root);
- $filelist = safe_glob('*' . $suffix);
- $list = array();
- foreach ($filelist as $file) {
- $file = str_replace($suffix, '', $file);
- $list[] = filesystemToInternal($file);
- }
- generateListFromArray(array($currentValue), $list, $descending, false);
- chdir($curdir);
- }
- }
- /**
- * @param string $url The link URL
- * @param string $text The text to go with the link
- * @param string $title Text for the title tag
- * @param string $class optional class
- * @param string $id optional id
- */
- function getLinkHTML($url, $text, $title = NULL, $class = NULL, $id = NULL) {
- return "<a href=\"" . html_encode($url) . "\"" .
- (($title) ? " title=\"" . html_encode(getBare($title)) . "\"" : "") .
- (($class) ? " class=\"$class\"" : "") .
- (($id) ? " id=\"$id\"" : "") . ">" .
- html_encode($text) . "</a>";
- }
- /**
- * General link printing function
- * @param string $url The link URL
- * @param string $text The text to go with the link
- * @param string $title Text for the title tag
- * @param string $class optional class
- * @param string $id optional id
- */
- function printLinkHTML($url, $text, $title = NULL, $class = NULL, $id = NULL) {
- echo getLinkHTML($url, $text, $title, $class, $id);
- }
- /**
- * shuffles an array maintaining the keys
- *
- * @param array $array
- * @return boolean
- */
- function shuffle_assoc(&$array) {
- $keys = array_keys($array);
- shuffle($keys);
- foreach ($keys as $key) {
- $new[$key] = $array[$key];
- }
- $array = $new;
- return true;
- }
- /**
- * sorts the found albums (images) by the required key(s)
- *
- * NB: this sort is sensitive to the key(s) chosen and makes
- * the appropriate sorts based on same. Some multi-key sorts
- * will not make any sense and will give unexpected results.
- * Most notably any that contain the keys "title" or "desc"
- * as these require multi-lingual sorts.
- *
- * @param array $results
- * @param string $sortkey
- * @param string $order
- */
- function sortByKey($results, $sortkey, $order) {
- $sortkey = str_replace('`', '', $sortkey);
- switch ($sortkey) {
- case 'title':
- case 'desc':
- return sortByMultilingual($results, $sortkey, $order);
- case 'RAND()':
- shuffle($results);
- return $results;
- default:
- if (preg_match('`[\/\(\)\*\+\-!\^\%\<\>\=\&\|]`', $sortkey)) {
- return $results; // We cannot deal with expressions
- }
- }
- $indicies = explode(',', $sortkey);
- foreach ($indicies as $key => $index) {
- $indicies[$key] = trim($index);
- }
- $results = sortMultiArray($results, $indicies, $order, true, false, true);
- return $results;
- }
- /**
- * multidimensional array column sort
- *
- * @param array $array The multidimensional array to be sorted
- * @param mixed $index Which key(s) should be sorted by
- * @param string $order true for descending sorts
- * @param bool $natsort If natural order should be used
- * @param bool $case_sensitive If the sort should be case sensitive
- * @return array
- *
- * @author redoc (http://codingforums.com/showthread.php?t=71904)
- */
- function sortMultiArray($array, $index, $descending = false, $natsort = true, $case_sensitive = false, $preservekeys = false, $remove_criteria = array()) {
- if (is_array($array) && count($array) > 0) {
- if (is_array($index)) {
- $indicies = $index;
- } else {
- $indicies = array($index);
- }
- if ($descending) {
- $separator = '~~';
- } else {
- $separator = ' ';
- }
- foreach ($array as $key => $row) {
- $temp[$key] = '';
- foreach ($indicies as $index) {
- if (is_array($row) && array_key_exists($index, $row)) {
- $temp[$key] .= get_language_string($row[$index]) . $separator;
- if (in_array($index, $remove_criteria)) {
- unset($array[$key][$index]);
- }
- }
- }
- $temp[$key] .= $key;
- }
- if ($natsort) {
- if ($case_sensitive) {
- natsort($temp);
- } else {
- natcasesort($temp);
- }
- if ($descending) {
- $temp = array_reverse($temp, TRUE);
- }
- } else {
- if ($descending) {
- arsort($temp);
- } else {
- asort($temp);
- }
- }
- foreach (array_keys($temp) as $key) {
- if (!$preservekeys && is_numeric($key)) {
- $sorted[] = $array[$key];
- } else {
- $sorted[$key] = $array[$key];
- }
- }
- return $sorted;
- }
- return $array;
- }
- /**
- * Returns a list of album IDs that the current viewer is not allowed to see
- *
- * @return array
- */
- function getNotViewableAlbums() {
- global $_zp_not_viewable_album_list;
- if (zp_loggedin(ADMIN_RIGHTS | MANAGE_ALL_ALBUM_RIGHTS))
- return array(); //admins can see all
- if (is_null($_zp_not_viewable_album_list)) {
- $sql = 'SELECT `folder`, `id`, `password`, `show` FROM ' . prefix('albums') . ' WHERE `show`=0 OR `password`!=""';
- $result = query($sql);
- if ($result) {
- $_zp_not_viewable_album_list = array();
- while ($row = db_fetch_assoc($result)) {
- if (checkAlbumPassword($row['folder'])) {
- $album = newAlbum($row['folder']);
- if (!($row['show'] || $album->isMyItem(LIST_RIGHTS))) {
- $_zp_not_viewable_album_list[] = $row['id'];
- }
- } else {
- $_zp_not_viewable_album_list[] = $row['id'];
- }
- }
- db_free_result($result);
- }
- }
- return $_zp_not_viewable_album_list;
- }
- /**
- * Returns a list of image IDs that the current viewer is not allowed to see
- *
- * @return array
- */
- function getNotViewableImages() {
- global $_zp_not_viewable_image_list;
- if (zp_loggedin(ADMIN_RIGHTS | MANAGE_ALL_ALBUM_RIGHTS)) {
- return array(); //admins can see all
- }
- $hidealbums = getNotViewableAlbums();
- $where = '';
- if (!is_null($hidealbums)) {
- $where = implode(',', $hidealbums);
- }
- if (is_null($_zp_not_viewable_image_list)) {
- $sql = 'SELECT DISTINCT `id` FROM ' . prefix('images') . ' WHERE `show` = 0 OR `albumid` in (' . $where . ')';
- $result = query($sql);
- if ($result) {
- $_zp_not_viewable_image_list = array();
- while ($row = db_fetch_assoc($result)) {
- $_zp_not_viewable_image_list[] = $row['id'];
- }
- }
- }
- return $_zp_not_viewable_image_list;
- }
- /**
- * Checks to see if a URL is valid
- *
- * @param string $url the URL being checked
- * @return bool
- */
- function isValidURL($url) {
- return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $url);
- }
- /**
- * pattern match function Works with characters with diacritical marks where the PHP one does not.
- *
- * @param string $pattern pattern
- * @param string $string haystack
- * @return bool
- */
- function safe_fnmatch($pattern, $string) {
- return @preg_match('/^' . strtr(addcslashes($pattern, '\\.+^$(){}=!<>|'), array('*' => '.*', '?' => '.?')) . '$/i', $string);
- }
- /**
- * returns a list of comment record 'types' for "images"
- * @param string $quote quotation mark to use
- *
- * @return string
- */
- function zp_image_types($quote) {
- global $_zp_extra_filetypes;
- $typelist = $quote . 'images' . $quote . ',' . $quote . '_images' . $quote . ',';
- $types = array_unique($_zp_extra_filetypes);
- foreach ($types as $type) {
- $typelist .= $quote . strtolower($type) . 's' . $quote . ',';
- }
- return substr($typelist, 0, -1);
- }
- /**
- * Returns video argument of the current Image.
- *
- * @param object $image optional image object
- * @return bool
- */
- function isImageVideo($image = NULL) {
- if (is_null($image)) {
- if (!in_context(ZP_IMAGE))
- return false;
- global $_zp_current_image;
- $image = $_zp_current_image;
- }
- return strtolower(get_class($image)) == 'video';
- }
- /**
- * Returns true if the image is a standard photo type
- *
- * @param object $image optional image object
- * @return bool
- */
- function isImagePhoto($image = NULL) {
- if (is_null($image)) {
- if (!in_context(ZP_IMAGE))
- return false;
- global $_zp_current_image;
- $image = $_zp_current_image;
- }
- $class = strtolower(get_class($image));
- return $class == 'image' || $class == 'transientimage';
- }
- /**
- * Copies a directory recursively
- * @param string $srcdir the source directory.
- * @param string $dstdir the destination directory.
- * @return the total number of files copied.
- */
- function dircopy($srcdir, $dstdir) {
- $num = 0;
- if (!is_dir($dstdir))
- mkdir($dstdir);
- if ($curdir = opendir($srcdir)) {
- while ($file = readdir($curdir)) {
- if ($file != '.' && $file != '..') {
- $srcfile = $srcdir . '/' . $file;
- $dstfile = $dstdir . '/' . $file;
- if (is_file($srcfile)) {
- if (is_file($dstfile))
- $ow = filemtime($srcfile) - filemtime($dstfile);
- else
- $ow = 1;
- if ($ow > 0) {
- if (copy($srcfile, $dstfile)) {
-