Overview

Classes

  • _zp_captcha
  • _zp_HTML_cache
  • admin_approval
  • Album
  • AlbumBase
  • AlbumZip
  • AMFReader
  • AMFStream
  • AnyFile
  • AnyFile_Options
  • auto_backup
  • AVCSequenceParameterSetReader
  • bxslider
  • cacheManager
  • cachemanager_internal_deprecations
  • cacheManagerFeed
  • CI_jsmin
  • CI_load
  • cloneZenphoto
  • codeIgniter_kludge
  • colorbox
  • Combi
  • Comment
  • comment_form
  • contactformOptions
  • cookieConsent
  • crop_image
  • cycle
  • defaultCodeblocks
  • deprecated_functions
  • DownloadList
  • dynamic_locale
  • dynamicAlbum
  • elFinder
  • elFinder_options
  • elFinderConnector
  • elFinderEditor
  • elFinderEditorOnlineConvert
  • elFinderEditorZipArchive
  • elFinderEditorZohoOffice
  • elFinderLibGdBmp
  • elFinderPlugin
  • elFinderPluginAutoResize
  • elFinderPluginAutoRotate
  • elFinderPluginNormalizer
  • elFinderPluginSanitizer
  • elFinderPluginWatermark
  • elFinderSession
  • elFinderVolumeBox
  • elFinderVolumeDriver
  • elFinderVolumeDropbox
  • elFinderVolumeDropbox2
  • elFinderVolumeFlysystemGoogleDriveCache
  • elFinderVolumeFlysystemGoogleDriveNetmount
  • elFinderVolumeFTP
  • elFinderVolumeGoogleDrive
  • elFinderVolumeGroup
  • elFinderVolumeLocalFileSystem
  • elFinderVolumeMySQL
  • elFinderVolumeOneDrive
  • elFinderVolumeTrash
  • elFinderVolumeTrashMySQL
  • email_new_user
  • exampleMacros
  • external_auth
  • favorites
  • favoritesOptions
  • feed
  • fieldExtender
  • flag_thumbnail
  • Gallery
  • galleryArticles
  • getID3
  • getid3_aac
  • getid3_apetag
  • getid3_flv
  • getid3_handler
  • getid3_id3v1
  • getid3_id3v2
  • getid3_lib
  • getid3_lyrics3
  • getid3_mp3
  • getid3_mpeg
  • getid3_quicktime
  • getid3_swf
  • GoogleMap
  • Googlemaps
  • hitcounter
  • htmlmetatags
  • Image
  • internal_deprecations
  • ipBlocker
  • jPlayer
  • jplayer_options
  • jquery_rating
  • JSMin
  • lazyload
  • lib_GD_Options
  • lib_Imagick_Options
  • lib_NoGraphics
  • matomoStats
  • MediaObject
  • menu_manager
  • MergedRSS
  • MergedRSSOptions
  • mobile
  • Mobile_Detect
  • mobileTheme
  • multipleLayoutOptions
  • null_seo
  • OAuthConsumer
  • OAuthDataStore
  • OAuthRequest
  • OAuthServer
  • OAuthSignatureMethod
  • OAuthSignatureMethod_HMAC_SHA1
  • OAuthSignatureMethod_PLAINTEXT
  • OAuthSignatureMethod_RSA_SHA1
  • OAuthToken
  • OAuthUtil
  • openStreetMap
  • openStreetMapOptions
  • pagedThumbsNav
  • pagedthumbsOptions
  • PersistentObject
  • PHPMailer\PHPMailer\PHPMailer
  • PHPMailer\PHPMailer\POP3
  • PHPMailer\PHPMailer\SMTP
  • print_album_menu
  • pseudoPlayer
  • publishContent
  • quota_manager
  • reCaptcha
  • RecursiveCallbackFilterIterator
  • redirector
  • redirectorOptions
  • register_user
  • rewriteRules
  • rewriteTokens
  • RSS
  • rss_options
  • scriptlessSocialsharing
  • scriptlessSocialsharingOptions
  • search_statistics
  • SearchEngine
  • security_logger
  • securityHeaders
  • securityheadersOptions
  • seo_locale
  • Services_JSON
  • Services_JSON_Error
  • setup
  • setupMutex
  • setupRSS
  • show_not_loggedin
  • sitemap
  • sitemapOptions
  • static_html_cache
  • staticHTMLCacheOptions
  • tagsuggest
  • TextObject
  • TextObject_Options
  • ThemeObject
  • themeSwitcher
  • tinymce4Options
  • tinyURL
  • Transientimage
  • UploadHandler
  • user_expiry
  • user_groups
  • user_logout_options
  • userAddressFields
  • userDataExport
  • utf8
  • Video
  • VideoObject_Options
  • WEBdocs
  • WEBdocs_Options
  • xmpMetadata
  • Zenpage
  • Zenpage_internal_deprecations
  • ZenpageCategory
  • zenpagecms
  • ZenpageItems
  • ZenpageNews
  • ZenpagePage
  • ZenpageRoot
  • Zenphoto_Administrator
  • Zenphoto_Authority
  • zenphoto_org_news
  • zenphoto_seo
  • zenphotoDonate
  • ZipStream
  • zp_PHPMailer
  • zpFunctions
  • zpMutex
  • zpSimpleSpam
  • zpTrivialSpam

Interfaces

  • elFinderSessionInterface

Exceptions

  • elFinderAbortException
  • elFinderTriggerException
  • getid3_exception
  • JSMin_UnterminatedCommentException
  • JSMin_UnterminatedRegExpException
  • JSMin_UnterminatedStringException
  • OAuthExcept
  • PHPMailer\PHPMailer\Exception

Functions

  • access
  • accessAlbums
  • accessAllAlbums
  • accessImage
  • add_context
  • addalbumsToDatabase
  • addCategoriesToDatabase
  • addDateToTitlelink
  • addGeoCoord
  • addItem
  • addMissingDefaultRewriteTokens
  • addPagesToDatabase
  • addReconfigureNote
  • addSubalbumMenus
  • addWatermark
  • admin_album_list
  • admin_securityChecks
  • admin_showupdate
  • adminPageNav
  • adminToolbox
  • albumNumber
  • applyMacros
  • authorSelector
  • bind_textdomain_codeset
  • bindtextdomain
  • build_query
  • build_url
  • bulkActionRedirect
  • bulkTags
  • byteConvert
  • cacheImage
  • checkAccess
  • checkAlbumForImages
  • checkAlbumimagesort
  • checkAlbumParentid
  • checkAlbumPassword
  • checkChosenItemStatus
  • checkChosenMenuset
  • checked
  • checkFolder
  • checkForEmptyTitle
  • checkForGuest
  • checkForPage
  • checkForUpdate
  • checkHitcounterDisplay
  • checkIfChecked
  • checkIfLockedNews
  • checkIfLockedPage
  • checkIfNew
  • checkInstall
  • checkLayoutUseForImages
  • checkObjectsThumb
  • checkPageValidity
  • checkParentLayouts
  • checkPublishDates
  • checkRequiredField
  • checkSchedulePublishingNotes
  • checkSelectedAlbum
  • checkSignature
  • checkTitlelinkDuplicate
  • cleanAlbum
  • cleanHTML
  • clonedFrom
  • codeblocktabsJS
  • comment_form_addComment
  • comment_form_handle_comment
  • comment_form_PaginationJS
  • comment_form_postcomment
  • comment_form_print10Most
  • comment_form_visualEditor
  • commentFormUseCaptcha
  • commentReply
  • commentsAllowed
  • compressRow
  • consolidatedEditMessages
  • copyLayoutSelection
  • copyThemeDirectory
  • createMenuIfNotExists
  • createRelatedItemsResultArray
  • createTitlelink
  • cron_starter
  • curlRequest
  • currentRelativeURL
  • customOptions
  • dateDiff
  • datepickerJS
  • dateTimeConvert
  • db_affected_rows
  • db_close
  • db_collation
  • db_connect
  • db_count
  • db_create
  • db_create_table
  • db_error
  • db_fetch_assoc
  • db_fetch_row
  • db_free_result
  • db_getClientInfo
  • db_getServerInfo
  • db_getSQLmode
  • db_getVersion
  • db_insert_id
  • db_isMariaDB
  • db_LIKE_escape
  • db_list_fields
  • db_name
  • db_num_rows
  • db_permissions
  • db_quote
  • db_setSQLmode
  • db_show
  • db_software
  • db_table_update
  • db_truncate_table
  • debug404
  • debugLog
  • debugLogBacktrace
  • debuglogReconfigureNote
  • debugLogVar
  • decompressField
  • decompressRow
  • defaultCodeblocks_codebox
  • deleteArticle
  • deleteCategory
  • deleteItem
  • deleteLayoutSelection
  • deletePage
  • deleteThemeDirectory
  • dircopy
  • disableExtension
  • elFinder_admin_tabs
  • elFinder_tinymce
  • elFinderAutoloader
  • enableExtension
  • executeRSS
  • exitZP
  • exposeZenPhotoInformations
  • extendExecution
  • extensionEnabled
  • fetchComments
  • filesystemToInternal
  • fillbuffer
  • filterImageQuery
  • fix_path_redirect
  • formatList
  • fullText
  • galleryAlbumsPerPage
  • gallerystats_filesize_r
  • genAlbumList
  • generateAttributesFromArray
  • generateImageCacheFile
  • generateLanguageList
  • generateListFromArray
  • generateListFromFiles
  • generateRadiobuttonsFromArray
  • generateUnorderedListFromArray
  • get_AnyFile_suffixes
  • get_context
  • get_filterScript
  • get_instance
  • get_language_string
  • getAdminstratorsOptionsArray
  • getAdminThumb
  • getAdminThumbHTML
  • getAlbumArray
  • getAlbumBreadcrumb
  • getAlbumBreadcrumbAdmin
  • getAlbumCustomData
  • getAlbumData
  • getAlbumDate
  • getAlbumDesc
  • getAlbumFolder
  • getAlbumGeodata
  • getAlbumInherited
  • getAlbumLocation
  • getAlbumPage
  • getAlbumStatistic
  • getAlbumThumb
  • getAlbumTitle
  • getAlbumURL
  • getAllAccessibleAlbums
  • getAllAlbums
  • getAllDates
  • getAllowedTags
  • getAllSubAlbumIDs
  • getAllTagsCount
  • getAllTagsFromAlbum
  • getAllTagsFromAlbum_multi_unique
  • getAllTagsFromZenpage
  • getAllTagsUnique
  • getAllTranslations
  • getAnnotatedAlbumTitle
  • getAnnotatedImageTitle
  • getAnonymIP
  • getAuthor
  • getBare
  • getBareAlbumDesc
  • getBareAlbumTitle
  • getBareGalleryDesc
  • getBareGalleryTitle
  • getBareImageDesc
  • getBareImageTitle
  • getBareNewsTitle
  • getBarePageTitle
  • getCheckboxState
  • getCodeblock
  • getCommentAddress
  • getCommentAuthorEmail
  • getCommentAuthorLink
  • getCommentAuthorName
  • getCommentAuthorSite
  • getCommentBody
  • getCommentCount
  • getCommentDateTime
  • getCommentErrors
  • getCommentStored
  • getContactFormMacros
  • getContentShorten
  • getCookieInfoData
  • getCookieInfoHTML
  • getCookieInfoMacro
  • getCurrentMenuItem
  • getCurrentNewsArchive
  • getCurrentPage
  • getCurrentTheme
  • getCustomAlbumThumb
  • getCustomAlbumThumbMaxSpace
  • getCustomGalleryIndexPage
  • getCustomGalleryIndexURL
  • getCustomImageURL
  • getCustomPageURL
  • getCustomSizedImageMaxSpace
  • getCustomSizedImageThumbMaxSpace
  • getDataUsageNotice
  • getDefaultHeight
  • getDefaultRewriteTokens
  • getDefaultSizedImage
  • getDefaultWidth
  • getdownloadList
  • getDownloadURL
  • getE
  • getEnabledPlugins
  • getExpiryDatePost
  • getFavoritesURL
  • getField
  • getFullHeight
  • getFullImageFilesize
  • getFullImageURL
  • getFullWidth
  • getGalleryDesc
  • getGalleryIndexURL
  • getGalleryTitle
  • getGeoCoord
  • getHeadTitle
  • getHitcounter
  • getImageArgs
  • getImageCacheFilename
  • getImageCachePostfix
  • getImageCity
  • getImageCountry
  • getImageCustomData
  • getImageData
  • getImageDate
  • getImageDesc
  • getImageGeodata
  • getImageLocation
  • getImageMetaData
  • getImageParameters
  • getImageProcessorURI
  • getImageProcessorURIFromCacheName
  • getImageRotation
  • getImageState
  • getImageStatistic
  • getImageThumb
  • getImageTitle
  • getImageType
  • getImageURI
  • getImageURL
  • getItem
  • getItemByID
  • getItemTitleAndURL
  • getjPlayerSkinCSS
  • getjPlayerSkins
  • getLangAttributeLocale
  • getLanguageArray
  • getLanguageDisplayName
  • getLanguageFlag
  • getLanguageSubdomains
  • getLanguageText
  • getLatestComments
  • getLatestNews
  • getLatestZenpageComments
  • getLayout
  • getLayoutSelector
  • getLinkHTML
  • getLogTabs
  • getMacros
  • getMainSiteName
  • getMainSiteURL
  • getManagedAlbumList
  • getMaxSpaceContainer
  • getMenuFromLink
  • getMenuItemChilds
  • getMenuItems
  • getMenumanagerPredicessor
  • getMenumanagerSuccessor
  • getMenuSetSelector
  • getMenuVisibility
  • getMimeString
  • getNestedAlbumList
  • getNewsAdminOption
  • getNewsAdminOptionPath
  • getNewsArchivePath
  • getNewsArchiveURL
  • getNewsAuthor
  • getNewsCategories
  • getNewsCategoryCustomData
  • getNewsCategoryDesc
  • getNewsCategoryURL
  • getNewsContent
  • getNewsCustomData
  • getNewsDate
  • getNewsExtraContent
  • getNewsID
  • getNewsIndexURL
  • getNewsPagesStatistic
  • getNewsPathNav
  • getNewsReadMore
  • getNewsTitle
  • getNewsURL
  • getNextAlbum
  • getNextAlbumURL
  • getNextImageThumb
  • getNextImageURL
  • getNextNewsPageURL
  • getNextNewsURL
  • getNextPageURL
  • getNextPrevNews
  • getNotViewableAlbums
  • getNotViewableImages
  • getNumAlbums
  • getNumAllSubalbums
  • getNumImages
  • getNumNews
  • getNumPages
  • getOption
  • getOptionFromDB
  • getOptionList
  • getOwnerAuthor
  • getOwnerAuthorURL
  • getPageAuthor
  • getPageContent
  • getPageCustomData
  • getPageDate
  • getPageExtraContent
  • getPageID
  • getPageLastChangeDate
  • getPageNavList
  • getPageNumURL
  • getPageParentID
  • getPageRedirect
  • getPageSelector
  • getPageSortorder
  • getPageTitle
  • getPageTitleLink
  • getPageURL
  • getParentAlbums
  • getParentAlbumsAdmin
  • getParentBreadcrumb
  • getParentMenuItems
  • getPasswordProtectImage
  • getPHPFiles
  • getPictureOfTheDay
  • getPlugin
  • getPluginFiles
  • getPluginTabs
  • getPrevAlbum
  • getPrevAlbumURL
  • getPrevImageThumb
  • getPrevImageURL
  • getPrevNewsPageURL
  • getPrevNewsURL
  • getPrevPageURL
  • getProtectedImageURL
  • getRandomImages
  • getRandomImagesAlbum
  • getRating
  • getReconfigureNote
  • getRelatedItems
  • getRequestURI
  • getrow
  • getRSSLink
  • getRules
  • getSearchDate
  • getSearchURL
  • getSearchWords
  • getSelectedLayout
  • getSerializedArray
  • getSetClause
  • getSiteHomeURL
  • getSizeCustomImage
  • getSizeDefaultImage
  • getSizeDefaultThumb
  • getSizedImageURL
  • getSizeFullImage
  • getSortByOptions
  • getSortByStatusOptions
  • getStandardGalleryIndexURL
  • getSubtabs
  • getSuffix
  • getSystemLocales
  • getTagCountByAccess
  • getTagOrder
  • getTags
  • gettext
  • gettext_pl
  • gettext_th
  • getThemeFiles
  • getThemeOption
  • getTimezones
  • getTinyMCE4ConfigFiles
  • getTitle
  • getTotalHitcounter
  • getTotalImagesIn
  • getTotalNewsPages
  • getTotalPages
  • getUnprotectedImageURL
  • getUrAlbum
  • getUserIP
  • getUserLocale
  • getUserURL
  • getVersion
  • getWatermarkParam
  • getWatermarkPath
  • getWatermarks
  • getWhereClause
  • getXSRFToken
  • getZenpagePagesOptionsArray
  • getZenpageStatistic
  • handleSearchParms
  • hasDynamicAlbumSuffix
  • hasNextImage
  • hasNextNewsPage
  • hasNextPage
  • hasPrevImage
  • hasPrevNewsPage
  • hasPrevPage
  • hasPrimaryScripts
  • hl_attrval
  • hl_bal
  • hl_cmtcd
  • hl_ent
  • hl_prot
  • hl_regex
  • hl_spec
  • hl_tag
  • hl_tag2
  • hl_tidy
  • hl_version
  • html_decode
  • html_encode
  • html_encodeTagged
  • html_pathurlencode
  • htmLawed
  • httpsRedirect
  • httpUploadHandler
  • httpUploadHandler_admin_tabs
  • i18nSetLocale
  • ignoreSetupRunRequest
  • imageBlurGD
  • imagecreatefrombmp
  • imageDebug
  • imageError
  • imageNumber
  • imgSrcURI
  • in_context
  • installSignature
  • instrument
  • internalToFilesystem
  • inventMenuItem
  • iptc_make_tag
  • is_AdminEditPage
  • is_connected
  • is_News
  • is_NewsArchive
  • is_NewsArticle
  • is_NewsCategory
  • is_NewsPage
  • is_Pages
  • is_valid_email_zp
  • is_zip
  • isAlbumClass
  • isAlbumPage
  • isArchive
  • isCurrentitemParent
  • isHandledAlbum
  • isImageClass
  • isImagePage
  • isImagePhoto
  • isImageVideo
  • isIncompatibleExtension
  • isLandscape
  • isolate
  • isSetupProtected
  • isValidEmail
  • isValidURL
  • jQueryUpload_head
  • jQueryUpload_headers
  • jQueryUploadHandler
  • jQueryUploadHandler_admin_tabs
  • js_encode
  • json_decode
  • json_encode
  • kses
  • kses_array_lc
  • kses_attr
  • kses_bad_protocol
  • kses_bad_protocol_once
  • kses_bad_protocol_once2
  • kses_check_attr_val
  • kses_decode_entities
  • kses_hair
  • kses_hook
  • kses_html_error
  • kses_js_entities
  • kses_no_null
  • kses_normalize_entities
  • kses_normalize_entities2
  • kses_split
  • kses_split2
  • kses_stripslashes
  • kses_version
  • ksesProcess
  • layoutSelector
  • layoutSelector_album
  • listDBUses
  • listDirectoryFiles
  • listUses
  • load_zenpage_news
  • load_zenpage_pages
  • loadLocalOptions
  • log_message
  • lookupSortKey
  • macro_admin_tabs
  • macroList_show
  • makeAlbumCurrent
  • makeImageCurrent
  • makeSpecialImageName
  • markRelease_button
  • mb_strlen
  • mb_strpos
  • mb_strrpos
  • mb_strtolower
  • mb_strtoupper
  • mb_substr
  • mb_substr_count
  • menu_admin_toolbox_global
  • menu_tabs
  • minDiff
  • mkdir_recursive
  • myts_date
  • newAlbum
  • newImage
  • next_album
  • next_comment
  • next_image
  • next_news
  • next_page
  • ngettext
  • ngettext_pl
  • ngettext_th
  • omsAdditions
  • parse_query
  • parse_size
  • parseAllowedTags
  • parseHttpAcceptLanguage
  • pathurlencode
  • pluginDebug
  • populateManagedObjectsList
  • postAlbumSort
  • postIndexDecode
  • postIndexEncode
  • prefix
  • prepareAlbumPage
  • prepareCustomPage
  • prepareImagePage
  • prepareIndexPage
  • print404status
  • print_language_string_list
  • printAddToFavorites
  • printAdminFooter
  • printAdminHeader
  • printAdminRightsTable
  • printAdminThumb
  • printAlbumBreadcrumb
  • printAlbumButtons
  • printAlbumCustomData
  • printAlbumData
  • printAlbumDate
  • printAlbumDesc
  • printAlbumEditForm
  • printAlbumEditRow
  • printAlbumLegend
  • printAlbumLocation
  • printAlbumMenu
  • printAlbumMenuJump
  • printAlbumMenuList
  • printAlbumMenuListAlbum
  • printAlbumsSelector
  • printAlbumStatistic
  • printAlbumStatisticItem
  • printAlbumThumbImage
  • printAlbumTitle
  • printAlbumURL
  • printAllDates
  • printAllNestedList
  • printAllNewsCategories
  • printAllTags
  • printAllTagsAs
  • printAllTagsFromAlbum
  • printAllTagsFromZenpage
  • printAnnotatedAlbumTitle
  • printAnnotatedImageTitle
  • printArticleCategories
  • printArticleDatesDropdown
  • printArticlesPerPageDropdown
  • printAuthorDropdown
  • printBareAlbumDesc
  • printBareAlbumTitle
  • printBareGalleryDesc
  • printBareGalleryTitle
  • printBareImageDesc
  • printBareImageTitle
  • printBareNewsTitle
  • printBarePageTitle
  • printBarGraph
  • printBulkActions
  • printCategoriesStatistic
  • printCategoryCheckboxListEntry
  • printCategoryDropdown
  • printCategoryListSortableTable
  • printCategorySelection
  • printCodeblock
  • printCodeblockEdit
  • printCommentAuthorLink
  • printCommentErrors
  • printCommentForm
  • printContactForm
  • printContactFormMacro
  • printCookieInfo
  • printCopyrightNotice
  • printCurrentNewsArchive
  • printCurrentNewsCategory
  • printCustomAlbumThumbImage
  • printCustomAlbumThumbMaxSpace
  • printCustomMenu
  • printCustomPageSelector
  • printCustomPageURL
  • printCustomSizedImage
  • printCustomSizedImageMaxSpace
  • printCustomSizedImageThumbMaxSpace
  • printDataUsageNotice
  • printDefaultSizedImage
  • printDownloadAlbumZipURL
  • printdownloadList
  • printDownloadURL
  • printEditCommentLink
  • printEditDropdown
  • printExpired
  • printFavoritesURL
  • printFullAlbumsList
  • printFullImageDownloadURL
  • printGalleryDesc
  • printGalleryIndexURL
  • printGalleryTitle
  • printGoogleMap
  • printHeadTitle
  • printHomeLink
  • printImageCustomData
  • printImageData
  • printImageDate
  • printImageDesc
  • printImageMetadata
  • printImageslist
  • printImageStatistic
  • printImageThumb
  • printImageTitle
  • printImageURL
  • printItemEditLink
  • printItemsList
  • printItemsListTable
  • printItemStatusDropdown
  • printjPlayerPlaylist
  • printLangAttribute
  • printLanguageSelector
  • printLastChangeInfo
  • printLatestAlbums
  • printLatestComments
  • printLatestImages
  • printLatestImagesByDate
  • printLatestImagesByMtime
  • printLatestNews
  • printLatestUpdatedAlbums
  • printLinkHTML
  • printLogoAndLinks
  • printManagedObjects
  • printMenuemanagerPageList
  • printMenuemanagerPageListWithNav
  • printMenumanagerBreadcrumb
  • printMenumanagerNextLink
  • printMenumanagerPrevLink
  • printMostPopularItems
  • printMostRatedAlbums
  • printMostRatedImages
  • printMostRatedItems
  • printNestedAlbumsList
  • printNestedItemsList
  • printNestedMenu
  • printNews
  • printNewsArchive
  • printNewsArticlesList
  • printNewsAuthor
  • printNewsCategories
  • printNewsCategoryCustomData
  • printNewsCategoryDesc
  • printNewsCategoryURL
  • printNewsContent
  • printNewsCustomData
  • printNewsDate
  • printNewsExtraContent
  • printNewsIndexURL
  • printNewsPageList
  • printNewsPageListWithNav
  • printNewsStatistic
  • printNewsTitle
  • printNewsURL
  • printNextNewsLink
  • printNextNewsPageLink
  • printNextPageURL
  • printOpenStreetMap
  • printOwnerAuthor
  • printOwnerAuthorURL
  • printPageArticleTags
  • printPageAuthor
  • printPageContent
  • printPageCustomData
  • printPageDate
  • printPagedThumbsNav
  • printPageExtraContent
  • printPageID
  • printPageLastChangeDate
  • printPageList
  • printPageListWithNav
  • printPageMenu
  • printPageNav
  • printPageSelector
  • printPagesListTable
  • printPagesStatistic
  • printPageTitle
  • printPageTitleLink
  • printPageURL
  • printParentBreadcrumb
  • printPasswordForm
  • printPopularAlbums
  • printPopularImages
  • printPrevNewsLink
  • printPrevNewsPageLink
  • printPrevPageURL
  • printPrivacyPageLink
  • printPublished
  • printPublishIconLink
  • printPublishIconLinkGallery
  • printRandomImages
  • printRating
  • printReconfigureError
  • printReconfigureNote
  • printRegisterURL
  • printRegistrationForm
  • printRelatedItems
  • printRSSHeaderLink
  • printRSSLink
  • printScheduledPublishingNotes
  • printSearchBreadcrumb
  • printSearchForm
  • printSelectorWithCustomField
  • printSiteHomeURL
  • printSizedImageURL
  • printSlideShow
  • printSlideShowLink
  • printSortableHead
  • printSortOrderDropdown
  • printSubLevelAlbums
  • printSubPagesExcerpts
  • printSubtabs
  • printTabs
  • printTags
  • printThumbNav
  • printTinyPageNav
  • printTinyZenpageCategorySelector
  • printTopRatedAlbums
  • printTopRatedImages
  • printTopRatedItems
  • printUnpublishedDropdown
  • printUserLogin_out
  • printUserSelector
  • printUserURL
  • printVersion
  • printZenJavascripts
  • printZenpageIconLegend
  • printZenpageItems
  • printZenpageItemsBreadcrumb
  • printZenpageNewsCategorySelector
  • printZenpagePageSelector
  • printZenpagePagesSelector
  • printZenpageStatistic
  • printZenphotoLink
  • process_language_string_save
  • processAlbumBulkActions
  • processAlbumEdit
  • processCodeblockSave
  • processCommentBulkActions
  • processCredentials
  • processCustomOptionSave
  • processEditSelection
  • processExtensionVariable
  • processImageBulkActions
  • processImageEdit
  • processManagedObjects
  • processMenuBulkActions
  • processOrder
  • processRights
  • processTags
  • processZenpageBulkActions
  • propSizes
  • protectSetupFiles
  • publishItem
  • purgeOption
  • purgeThemeOption
  • query
  • query_full_array
  • query_single_row
  • rc4
  • read_exif_data_protected
  • readTags
  • reconfigureAction
  • reconfigureCSS
  • recordMissing
  • redirectionHandler
  • redirectURL
  • rem_context
  • removeDir
  • removeParentAlbumNames
  • removeTrailingSlash
  • renameOption
  • replaceOption
  • replaceThemeOption
  • restore_context
  • reveal
  • rewrite_get_album_image
  • rewrite_path
  • rewriteHandler
  • RSS_Channel
  • RSS_Retrieve
  • RSS_Tags
  • rulesList
  • safe_fnmatch
  • safe_glob
  • sanitize
  • sanitize_numeric
  • sanitize_path
  • sanitize_script
  • sanitize_string
  • sanitizeRedirect
  • save_context
  • saveLayoutSelection
  • saveZenphotoLayoutSelection
  • search_quote
  • secureServer
  • seo_cleanup_button
  • seoFriendly
  • seoFriendlyJS
  • set_context
  • setAlbumSubtabs
  • setexifvars
  • setMainDomain
  • setOption
  • setOptionDefault
  • setSiteState
  • setThemeColumns
  • setThemeOption
  • setThemeOptionDefault
  • setTinyZenpageLocale
  • setupCurrentLocale
  • setupDomain
  • setupTheme
  • shortenContent
  • shortentitle
  • showOrNotShowField
  • showZenphotoOptions
  • shuffle_assoc
  • signatureChange
  • site_upgrade_button
  • site_upgrade_status
  • skipScheduledPublishing
  • sortArray
  • sortByKey
  • sortByMultilingual
  • sortMultiArray
  • standardScripts
  • standardThemeOptions
  • stickyNews
  • storeConfig
  • storeTags
  • stripSuffix
  • submenuOf
  • switchLog
  • tagSelector
  • tagSuggestJS
  • tagSuggestJS_admin
  • tagSuggestJS_frontend
  • tagURLs
  • textdomain
  • themeIsEditable
  • themeSetup
  • tidyHTML
  • timezoneDiff
  • tinymce4ConfigJS
  • truncate_string
  • unprotectSetupFiles
  • unpublishedZenpageItemCheck
  • unpublishedZenphotoItemCheck
  • unpublishSubalbums
  • unQuote
  • unTagURLs
  • unzip
  • updateArticle
  • updateCacheName
  • updateCategory
  • updateConfigItem
  • updateImageProcessorLink
  • updateItemSortorder
  • updateItemsSortorder
  • updateMenuItem
  • updatePage
  • upload_extra
  • upload_form
  • upload_head
  • user_mailing_list_button
  • validateLocale
  • writeHeader
  • XSRFdefender
  • XSRFToken
  • zenpageAlbumImage
  • zenpageBulkActionMessage
  • zenpageJSCSS
  • zenpagePublish
  • zenphoto_PHPMailer
  • zenphoto_sendmail
  • zenPhotoTheme
  • zp_apply_filter
  • zp_clearCookie
  • zp_colorAllocate
  • zp_cookieEncode
  • zp_copyCanvas
  • zp_createImage
  • zp_drawRectangle
  • zp_error
  • zp_filter_slot
  • zp_filter_unique_id
  • zp_getCookie
  • zp_getFonts
  • zp_graphicsLibInfo
  • zp_handle_password
  • zp_handle_password_single
  • zp_has_filter
  • zp_image_types
  • zp_imageCanRotate
  • zp_imageColorTransparent
  • zp_imageDims
  • zp_imageFill
  • zp_imageFontHeight
  • zp_imageFontWidth
  • zp_imageFromString
  • zp_imageGet
  • zp_imageGray
  • zp_imageHeight
  • zp_imageIPTC
  • zp_imageKill
  • zp_imageLoadFont
  • zp_imageMerge
  • zp_imageOutput
  • zp_imageResizeAlpha
  • zp_imageResizeTransparent
  • zp_imageUnsharpMask
  • zp_imageWidth
  • zp_load_album
  • zp_load_gallery
  • zp_load_image
  • zp_load_page
  • zp_load_request
  • zp_load_search
  • zp_loggedin
  • zp_mail
  • zp_register_filter
  • zp_remove_filter
  • zp_resampleImage
  • zp_rotateImage
  • zp_session_destroy
  • zp_session_start
  • zp_setCookie
  • zp_writeString
  • zpErrorHandler
  • zpFormattedDate
  • zpRewriteURL
  • Overview
  • Class
  • Tree
  • Package
  • Deprecated
   1:    2:    3:    4:    5:    6:    7:    8:    9:   10:   11:   12:   13:   14:   15:   16:   17:   18:   19:   20:   21:   22:   23:   24:   25:   26:   27:   28:   29:   30:   31:   32:   33:   34:   35:   36:   37:   38:   39:   40:   41:   42:   43:   44:   45:   46:   47:   48:   49:   50:   51:   52:   53:   54:   55:   56:   57:   58:   59:   60:   61:   62:   63:   64:   65:   66:   67:   68:   69:   70:   71:   72:   73:   74:   75:   76:   77:   78:   79:   80:   81:   82:   83:   84:   85:   86:   87:   88:   89:   90:   91:   92:   93:   94:   95:   96:   97:   98:   99:  100:  101:  102:  103:  104:  105:  106:  107:  108:  109:  110:  111:  112:  113:  114:  115:  116:  117:  118:  119:  120:  121:  122:  123:  124:  125:  126:  127:  128:  129:  130:  131:  132:  133:  134:  135:  136:  137:  138:  139:  140:  141:  142:  143:  144:  145:  146:  147:  148:  149:  150:  151:  152:  153:  154:  155:  156:  157:  158:  159:  160:  161:  162:  163:  164:  165:  166:  167:  168:  169:  170:  171:  172:  173:  174:  175:  176:  177:  178:  179:  180:  181:  182:  183:  184:  185:  186:  187:  188:  189:  190:  191:  192:  193:  194:  195:  196:  197:  198:  199:  200:  201:  202:  203:  204:  205:  206:  207:  208:  209:  210:  211:  212:  213:  214:  215:  216:  217:  218:  219:  220:  221:  222:  223:  224:  225:  226:  227:  228:  229:  230:  231:  232:  233:  234:  235:  236:  237:  238:  239:  240:  241:  242:  243:  244:  245:  246:  247:  248:  249:  250:  251:  252:  253:  254:  255:  256:  257:  258:  259:  260:  261:  262:  263:  264:  265:  266:  267:  268:  269:  270:  271:  272:  273:  274:  275:  276:  277:  278:  279:  280:  281:  282:  283:  284:  285:  286:  287:  288:  289:  290:  291:  292:  293:  294:  295:  296:  297:  298:  299:  300:  301:  302:  303:  304:  305:  306:  307:  308:  309:  310:  311:  312:  313:  314:  315:  316:  317:  318:  319:  320:  321:  322:  323:  324:  325:  326:  327:  328:  329:  330:  331:  332:  333:  334:  335:  336:  337:  338:  339:  340:  341:  342:  343:  344:  345:  346:  347:  348:  349:  350:  351:  352:  353:  354:  355:  356:  357:  358:  359:  360:  361:  362:  363:  364:  365:  366:  367:  368:  369:  370:  371:  372:  373:  374:  375:  376:  377:  378:  379:  380:  381:  382:  383:  384:  385:  386:  387:  388:  389:  390:  391:  392:  393:  394:  395:  396:  397:  398:  399:  400:  401:  402:  403:  404:  405:  406:  407:  408:  409:  410:  411:  412:  413:  414:  415:  416:  417:  418:  419:  420:  421:  422:  423:  424:  425:  426:  427:  428:  429:  430:  431:  432:  433:  434:  435:  436:  437:  438:  439:  440:  441:  442:  443:  444:  445:  446:  447:  448:  449:  450:  451:  452:  453:  454:  455:  456:  457:  458:  459:  460:  461:  462:  463:  464:  465:  466:  467:  468:  469:  470:  471:  472:  473:  474:  475:  476:  477:  478:  479:  480:  481:  482:  483:  484:  485:  486:  487:  488:  489:  490:  491:  492:  493:  494:  495:  496:  497:  498:  499:  500:  501:  502:  503:  504:  505:  506:  507:  508:  509:  510:  511:  512:  513:  514:  515:  516:  517:  518:  519:  520:  521:  522:  523:  524:  525:  526:  527:  528:  529:  530:  531:  532:  533:  534:  535:  536:  537:  538:  539:  540:  541:  542:  543:  544:  545:  546:  547:  548:  549:  550:  551:  552:  553:  554:  555:  556:  557:  558:  559:  560:  561:  562:  563:  564:  565:  566:  567:  568:  569:  570:  571:  572:  573:  574:  575:  576:  577:  578:  579:  580:  581:  582:  583:  584:  585:  586:  587:  588:  589:  590:  591:  592:  593:  594:  595:  596:  597:  598:  599:  600:  601:  602:  603:  604:  605:  606:  607:  608:  609:  610:  611:  612:  613:  614:  615:  616:  617:  618:  619:  620:  621:  622:  623:  624:  625:  626:  627:  628:  629:  630:  631:  632:  633:  634:  635:  636:  637:  638:  639:  640:  641:  642:  643:  644:  645:  646:  647:  648:  649:  650:  651:  652:  653:  654:  655:  656:  657:  658:  659:  660:  661:  662:  663:  664:  665:  666:  667:  668:  669:  670:  671:  672:  673:  674:  675:  676:  677:  678:  679:  680:  681:  682:  683:  684:  685:  686:  687:  688:  689:  690:  691:  692:  693:  694:  695:  696:  697:  698:  699:  700:  701:  702:  703:  704:  705:  706:  707:  708:  709:  710:  711:  712:  713:  714:  715:  716:  717:  718:  719:  720:  721:  722:  723:  724:  725:  726:  727:  728:  729:  730:  731:  732:  733:  734:  735:  736:  737:  738:  739:  740:  741:  742:  743:  744:  745:  746:  747:  748:  749:  750:  751:  752:  753:  754:  755:  756:  757:  758:  759:  760:  761:  762:  763:  764:  765:  766:  767:  768:  769:  770:  771:  772:  773:  774:  775:  776:  777:  778:  779:  780:  781:  782:  783:  784:  785:  786:  787:  788:  789:  790:  791:  792:  793:  794:  795:  796:  797:  798:  799:  800:  801:  802:  803:  804:  805:  806:  807:  808:  809:  810:  811:  812:  813:  814:  815:  816:  817:  818:  819:  820:  821:  822:  823:  824:  825:  826:  827:  828:  829:  830:  831:  832:  833:  834:  835:  836:  837:  838:  839:  840:  841:  842:  843:  844:  845:  846:  847:  848:  849:  850:  851:  852:  853:  854:  855:  856:  857:  858:  859:  860:  861:  862:  863:  864:  865:  866:  867:  868:  869:  870:  871:  872:  873:  874:  875:  876:  877:  878:  879:  880:  881:  882:  883:  884:  885:  886:  887:  888:  889:  890:  891:  892:  893:  894:  895:  896:  897:  898:  899:  900:  901:  902:  903:  904:  905:  906:  907:  908:  909:  910:  911:  912:  913:  914:  915:  916:  917:  918:  919:  920:  921:  922:  923:  924:  925:  926:  927:  928:  929:  930:  931:  932:  933:  934:  935:  936:  937:  938:  939:  940:  941:  942:  943:  944:  945:  946:  947:  948:  949:  950:  951:  952:  953:  954:  955:  956:  957:  958:  959:  960:  961:  962:  963:  964:  965:  966:  967:  968:  969:  970:  971:  972:  973:  974:  975:  976:  977:  978:  979:  980:  981:  982:  983:  984:  985:  986:  987:  988:  989:  990:  991:  992:  993:  994:  995:  996:  997:  998:  999: 1000: 1001: 1002: 1003: 1004: 1005: 1006: 1007: 1008: 1009: 1010: 1011: 1012: 1013: 1014: 1015: 1016: 1017: 1018: 1019: 1020: 1021: 1022: 1023: 1024: 1025: 1026: 1027: 1028: 1029: 1030: 1031: 1032: 1033: 1034: 1035: 1036: 1037: 1038: 1039: 1040: 1041: 1042: 1043: 1044: 1045: 1046: 1047: 1048: 1049: 1050: 1051: 1052: 1053: 1054: 1055: 1056: 1057: 1058: 1059: 1060: 1061: 1062: 1063: 1064: 1065: 1066: 1067: 1068: 1069: 1070: 1071: 1072: 1073: 1074: 1075: 1076: 1077: 1078: 1079: 1080: 1081: 1082: 1083: 1084: 1085: 1086: 1087: 1088: 1089: 1090: 1091: 1092: 1093: 1094: 1095: 1096: 1097: 1098: 1099: 1100: 1101: 1102: 1103: 1104: 1105: 1106: 1107: 1108: 1109: 1110: 1111: 1112: 1113: 1114: 1115: 1116: 1117: 1118: 1119: 1120: 1121: 1122: 1123: 1124: 1125: 1126: 1127: 1128: 1129: 1130: 1131: 1132: 1133: 1134: 1135: 1136: 1137: 1138: 1139: 1140: 1141: 1142: 1143: 1144: 1145: 1146: 1147: 1148: 1149: 1150: 1151: 1152: 1153: 1154: 1155: 1156: 1157: 1158: 1159: 1160: 1161: 1162: 1163: 1164: 1165: 1166: 1167: 1168: 1169: 1170: 1171: 1172: 1173: 1174: 1175: 1176: 1177: 1178: 1179: 1180: 1181: 1182: 1183: 1184: 1185: 1186: 1187: 1188: 1189: 1190: 1191: 1192: 1193: 1194: 1195: 1196: 1197: 1198: 1199: 1200: 1201: 1202: 1203: 1204: 1205: 1206: 1207: 1208: 1209: 1210: 1211: 1212: 1213: 1214: 1215: 1216: 1217: 1218: 1219: 1220: 1221: 1222: 1223: 1224: 1225: 1226: 1227: 1228: 1229: 1230: 1231: 1232: 1233: 1234: 1235: 1236: 1237: 1238: 1239: 1240: 1241: 1242: 1243: 1244: 1245: 1246: 1247: 1248: 1249: 1250: 1251: 1252: 1253: 1254: 1255: 1256: 1257: 1258: 1259: 1260: 1261: 1262: 1263: 1264: 1265: 1266: 1267: 1268: 1269: 1270: 1271: 1272: 1273: 1274: 1275: 1276: 1277: 1278: 1279: 1280: 1281: 1282: 1283: 1284: 1285: 1286: 1287: 1288: 1289: 1290: 1291: 1292: 1293: 1294: 1295: 1296: 1297: 1298: 1299: 1300: 1301: 1302: 1303: 1304: 1305: 1306: 1307: 1308: 1309: 1310: 1311: 1312: 1313: 1314: 1315: 
<?php

// force UTF-8 Ø
$_zp_gallery = new Gallery();

/**
 * Gallery Class
 * @package core
 * @subpackage classes\objects
 */
class Gallery {

    public $albumdir = NULL;
    public $table = 'gallery';
    protected $albums = NULL;
    protected $theme;
    protected $themes;
    protected $lastalbumsort = NULL;
    protected $data = array();
    protected $unprotected_pages = array();

    /**
     * Creates an instance of a gallery
     *
     * @return Gallery
     */
    function __construct() {
// Set our album directory
        $this->albumdir = ALBUM_FOLDER_SERVERPATH;
        $data = getOption('gallery_data');
        if ($data) {
            $this->data = getSerializedArray($data);
        }
        if (isset($this->data['unprotected_pages'])) {
            $pages = getSerializedArray($this->data['unprotected_pages']);
            if (is_array($pages))
                $this->unprotected_pages = $pages; //   protect against a failure
        }
    }

    /**
     * Returns the gallery title
     *
     * @return string
     */
    function getTitle($locale = NULL) {
        $text = $this->get('gallery_title');
        if ($locale !== 'all') {
            $text = get_language_string($text, $locale);
        }
        $text = unTagURLs($text);
        return $text;
    }

    /**
     * Returns a tag stripped title
     * @param string $locale
     * @return string
     */
    function getBareTitle($locale = NULL) {
        return getBare($this->getTitle($locale));
    }

    function setTitle($title) {
        $this->set('gallery_title', tagURLs($title));
    }

    /**
     * Returns the gallery description
     *
     * @return string
     */
    function getDesc($locale = NULL) {
        $text = $this->get('Gallery_description');
        if ($locale == 'all') {
            return unTagURLs($text);
        } else {
            return applyMacros(unTagURLs(get_language_string($text, $locale)));
        }
    }

    /**
     * Sets the gallery description
     * 
     * @since ZenphotoCMS 1.5.8
     * 
     * @param string $desc
     */
    function setDesc($desc) {
        $desc = tagURLs($desc);
        $this->set('Gallery_description', $desc);
    }
    
    /**
     * Gets the copyright notice
     * @since ZenphotoCMS 1.5.8
     * 
     * @param type $locale
     * @return type
     */
    function getCopyrightNotice($locale = null) {
        $text = $this->get('copyright_site_notice');
        if ($locale == 'all') {
            return unTagURLs($text);
        } else {
            return applyMacros(unTagURLs(get_language_string($text, $locale)));
        }
    }

    /**
     * Sets the copyright notice
     * @since ZenphotoCMS 1.5.8
     * @param type $notice
     */
    function setCopyrightNotice($notice) {
        $notice = tagURLs($notice);
        $this->set('copyright_site_notice', $notice);
    }

    /**
     * Gets the copyright site holder
     * 
     * Note: This does not fetch an actual field value but with some fallbacks
     * 
     * - 'copyright_site_rightsholder' field
     * - 'copyright_site_rightsholder_custom' field
     * - The site master user
     * 
     * @see getRightsholderCopyrightCustom()
     * @see getRightsholderCopyright()
     * 
     * @since ZenphotoCMS 1.5.8
     */
    function getCopyrightRightsholder() {
        $rightsholder = $this->get('copyright_site_rightsholder');
        if ($rightsholder && $rightsholder != 'none') {
            if ($rightsholder == 'custom') {
                $rightsholder = $this->get('copyright_site_rightsholder_custom');
            } else {
                $rightsholder = Zenphoto_Administrator::getNameByUser($rightsholder);
            }
        }
        if (empty($rightsholder)) {
            $authority = new Zenphoto_Authority();
            $master = $authority->getMasterUser();
            $rightsholder = $master->getName();
        }
        return $rightsholder;
    }
    
    /**
     * 
     * Gets the copyright site url
     * 
     * @since ZenphotoCMS 1.5.8 
     * @return type
     */
    function getCopyrightURL() {
        return $this->get('copyright_site_url');
    }

    /**
     * Sets the copyright site url
     * 
     * @since ZenphotoCMS 1.5.8
     * @param type $url
     */
    function setCopyrightURL($url) {
        $this->set('copyright_site_url', $url);
    }

    /**
     * Returns the hashed password for guest gallery access
     *
     */
    function getPassword() {
        if (GALLERY_SECURITY != 'public') {
            return NULL;
        } else {
            return $this->get('gallery_password');
        }
    }

    function setPassword($value) {
        $this->set('gallery_password', $value);
    }

    /**
     * Returns the hind associated with the gallery password
     *
     * @return string
     */
    function getPasswordHint($locale = NULL) {
        $text = $this->get('gallery_hint');
        if ($locale !== 'all') {
            $text = get_language_string($text, $locale);
        }
        $text = unTagURLs($text);
        return $text;
    }

    function setPasswordHint($value) {
        $this->set('gallery_hint', tagURLs($value));
    }

    function getUser() {
        return($this->get('gallery_user'));
    }

    function setUser($value) {
        $this->set('gallery_user', $value);
    }

    /**
     * Returns the main albums directory
     *
     * @return string
     */
    function getAlbumDir() {
        return $this->albumdir;
    }

    /**
     * Returns the DB field corresponding to the album sort type desired
     *
     * @param string $sorttype the desired sort
     * @return string
     */
    function getAlbumSortKey($sorttype = null) {
        if (empty($sorttype)) {
            $sorttype = $this->getSortType();
        }
        return lookupSortKey($sorttype, 'sort_order', 'albums');
    }

    function getSortDirection() {
        return $this->get('sort_direction');
    }

    function setSortDirection($value) {
        $this->set('sort_direction', (int) ($value && true));
    }

    function getSortType() {
        $type = $this->get('gallery_sorttype');
        return $type;
    }

    function setSortType($value) {
        $this->set('gallery_sorttype', $value);
    }

    /**
     * Get Albums will create our $albums array with a fully populated set of Album
     * names in the correct order.
     *
     * Returns an array of albums (a pages worth if $page is not zero)
     *
     * @param int $page An option parameter that can be used to return a slice of the array.
     * @param string $sorttype the kind of sort desired
     * @param string $sortdirection set to a direction to override the default option
     * @param bool $care set to false if the order of the albums does not matter
     * @param bool $mine set true/false to override ownership
     *
     * @return  array
     */
    function getAlbums($page = 0, $sorttype = null, $sortdirection = null, $care = true, $mine = NULL) {

        // Have the albums been loaded yet?
        if ($mine || is_null($this->albums) || $care && $sorttype . $sortdirection !== $this->lastalbumsort) {
            if (is_null($sorttype)) {
                $sorttype = $this->getSortType();
            }
            if (is_null($sortdirection)) {
                if ($this->getSortDirection()) {
                    $sortdirection = 'DESC';
                } else {
                    $sortdirection = '';
                }
            }
            $albumnames = $this->loadAlbumNames();
            $key = $this->getAlbumSortKey($sorttype);
            $albums = $this->sortAlbumArray(NULL, $albumnames, $key, $sortdirection, $mine);

            // Store the values
            $this->albums = $albums;
            $this->lastalbumsort = $sorttype . $sortdirection;
        }

        if ($page == 0) {
            return $this->albums;
        } else {
            return array_slice($this->albums, galleryAlbumsPerPage() * ($page - 1), galleryAlbumsPerPage());
        }
    }

    /**
     * Load all of the albums names that are found in the Albums directory on disk.
     * Returns an array containing this list.
     *
     * @return array
     */
    private function loadAlbumNames() {
        $albumdir = $this->getAlbumDir();
        $dir = opendir($albumdir);
        $msg = '';
        if (!$dir) {
            if (!is_dir($albumdir)) {
                $msg .= sprintf(gettext('Error: The “albums” directory (%s) cannot be found.'), $this->albumdir);
            } else {
                $msg .= sprintf(gettext('Error: The “albums” directory (%s) is not readable.'), $this->albumdir);
            }
            zp_error($msg);
        }
        $albums = array();

        while ($dirname = readdir($dir)) {
            if ($dirname[0] != '.' && (is_dir($albumdir . $dirname) || hasDynamicAlbumSuffix($dirname))) {
                $albums[] = filesystemToInternal($dirname);
            }
        }
        closedir($dir);
        return zp_apply_filter('album_filter', $albums);
    }
    
    /**
     * Gets all albums with the right order as set on the backend. 
     * 
     * Note while this is an very accurate result since this is using the filesystem to check
     * and keeps the individuel sort order settings of each subalbum level it is therefore very slow on large galleries with 
     * thousands of albums. 
     * 
     * Use the much faster but less accurate getAllAlbumsFromDB() instead if speed is needed. This is best used for any 
     * albums selector.
     * 
     * Note unless the §rights parameter is set to ALL_ALBUMS_RIGHTS or higher or the user is full admin dynamic albums are excluded.
     * 
     * @since Zenphoto 1.5.8 - general functionality moved from the old admin function genAlbumList()
     * 
     * @param obj $albumobj Default null for all albums, optional albumobject to get all sublevels of
     * @param int $rights Rights constant to check the album access by, default UPLOAD_RIGHTS. Set to null to disable rights check
     * @param bool $includetitles If set to true (default) returns an array with the album names as keys and the titles as values, otherwise just an array with the names
     * @return array
     */
    function getAllAlbums($albumobj = NULL, $rights = UPLOAD_RIGHTS, $includetitles = true) {
        $allalbums = array();
        $is_fulladmin = zp_loggedin(ADMIN_RIGHTS | MANAGE_ALL_ALBUM_RIGHTS); // can see all albums
        if (isAlbumClass($albumobj)) {
            $albums = $albumobj->getAlbums(0);
        } else {
            $albums = $this->getAlbums(0);
        }
        if (is_array($albums)) {
            foreach ($albums as $folder) {
                $album = newAlbum($folder);
                if ($is_fulladmin || $album->isMyItem($rights)) {
                    if ($album->isDynamic()) {
                        if ($is_fulladmin || $rights == ALL_ALBUMS_RIGHTS) {
                            if ($includetitles) {
                                $allalbums[$album->getFileName()] = $album->getTitle();
                            } else {
                                $allalbums[] = $album->getFileName();
                            }
                        }
                    } else {
                        if ($includetitles) {
                            $allalbums[$album->getFileName()] = $album->getTitle();
                        } else {
                            $allalbums[] = $album->getFileName();
                        }
                        $allalbums = array_merge($allalbums, $this->getAllAlbums($album, $rights));
                    }
                }
            }
        }
        return $allalbums;
    }

    /**
     * Gets all albums from the database direclty. This is less accurate than getAllAlbums() but much faster on 
     * large sites with thousends of albums especially if $keeplevel_sortorder is kept false.
     * Note that the filesystem and databse may be out of sync in the moment of fetching the data.
     * If you need to be sure to cover this use getAllAlbums();
     * 
     * $keeplevel_sortorder is false so the order follows their nesting but the sortorder 
     * of individual sublevels is not kept to archieve greater speed. 
     * Order is simply by folder name instead. Set to true each subalbum level follows its individual sort order setting.
     * While this is also faster than getAllAlbums() this is significantly slower than the default.
     * 
     * Note unless the §rights parameter is set to ALL_ALBUMS_RIGHTS or higher or the user is full admin dynamic albums are excluded.
     * 
     * @since Zenphoto 1.5.8
     * 
     * @param bool $keeplevel_sortorder Default false, set to true if the sublevels should sorted by their individual settings (slower)
     * @param obj $albumobj Default null for all albums, optional albumobject to get all sublevels of
     * @param int $rights Rights constant to check the album access by, default UPLOAD_RIGHTS
     * @param bool $includetitles If set to true (default) returns an array with the album names as keys and the titles as values, otherwise just an array with the names
     * @return array
     */
    function getAllAlbumsFromDB($keeplevel_sortorder = false, $albumobj = NULL, $rights = UPLOAD_RIGHTS, $includetitles = true) {
        $allalbums = array();
        $is_fulladmin = zp_loggedin(ADMIN_RIGHTS | MANAGE_ALL_ALBUM_RIGHTS);
        $sorttype = 'folder';
        $sortdirection = ' ASC';
        $sql = 'SELECT `folder` FROM ' . prefix('albums');
        if (isAlbumClass($albumobj)) {
            // subalbums of an album
            $sql .= " WHERE `folder` like '" . $albumobj->name . "/%'";
            if ($keeplevel_sortorder) {
                $sorttype = $albumobj->getSortType('album');
                if ($albumobj->getSortDirection('album')) {
                    $sortdirection = ' DESC';
                } else {
                    $sortdirection = ' ASC';
                }
            }
        } else {
            if ($keeplevel_sortorder) {
                $sql .= " WHERE `parentid` IS NULL";
                $sorttype = $this->getSortType();
                if ($this->getSortDirection()) {
                    $sortdirection = ' DESC';
                } else {
                    $sortdirection = ' ASC';
                }
            }
        }
        if ($sorttype == 'manual') {
            $sorttype = 'sort_order';
        }
        $sql .= ' ORDER BY ' . $sorttype . $sortdirection;
        $result = query($sql);
        if ($result) {
            while ($row = db_fetch_assoc($result)) {
                $album = newAlbum($row['folder']);
                if ($album->exists && ($is_fulladmin || $album->isMyItem($rights))) {
                    if ($album->isDynamic()) {
                        if ($is_fulladmin || $rights == ALL_ALBUMS_RIGHTS) {
                            if ($includetitles) {
                                $allalbums[$album->getFileName()] = $album->getTitle();
                            } else {
                                $allalbums[] = $album->getFileName();
                            }
                        }
                    } else {
                        if ($includetitles) {
                            $allalbums[$album->getFileName()] = $album->getTitle();
                        } else {
                            $allalbums[] = $album->getFileName();
                        }
                        if ($keeplevel_sortorder) {
                            $allalbums = array_merge($allalbums, $this->getAllAlbumsFromDB($keeplevel_sortorder, $album, $rights, $includetitles));
                        }
                    }
                }
            }
            db_free_result($result);
        }
        return $allalbums;
    }

    /**
     * Returns the a specific album in the array indicated by index.
     * Takes care of bounds checking, no need to check input.
     *
     * @param int $index the index of the album sought
     * @return Album
     */
    function getAlbum($index) {
        $this->getAlbums();
        if ($index >= 0 && $index < $this->getNumAlbums()) {
            return newAlbum($this->albums[$index]);
        } else {
            return false;
        }
    }

    /**
     * Returns the total number of TOPLEVEL albums in the gallery (does not include sub-albums)
     * @param bool $db whether or not to use the database (includes ALL detected albums) or the directories
     * @param bool $publishedOnly set to true to exclude un-published albums
     * @return int
     */
    function getNumAlbums($db = false, $publishedOnly = false) {
        $count = -1;
        if (!$db) {
            $this->getAlbums(0, NULL, NULL, false);
            $count = count($this->albums);
        } else {
            $sql = '';
            if ($publishedOnly) {
                $sql = 'WHERE `show`=1';
            }
            $count = db_count('albums', $sql);
        }
        return $count;
    }

    /**
     * Populates the theme array and returns it. The theme array contains information about
     * all the currently available themes.
     * @return array
     */
    function getThemes() {
        if (empty($this->themes)) {
            $themedir = SERVERPATH . "/themes";
            $themes = array();
            if ($dp = @opendir($themedir)) {
                while (false !== ($dir = readdir($dp))) {
                    if (substr($dir, 0, 1) != "." && is_dir("$themedir/$dir")) {
                        $themefile = $themedir . "/$dir/theme_description.php";
                        $dir8 = filesystemToInternal($dir);
                        if (file_exists($themefile)) {
                            $theme_description = array();
                            require($themefile);
                            $themes[$dir8] = $theme_description;
                        } else {
                            $themes[$dir8] = array('name' => gettext('Unknown'), 'author' => gettext('Unknown'), 'version' => gettext('Unknown'), 'desc' => gettext('<strong>Missing theme info file!</strong>'), 'date' => gettext('Unknown'));
                        }
                    }
                }
                ksort($themes, SORT_LOCALE_STRING);
            }
            $this->themes = $themes;
        }
        return $this->themes;
    }

    /**
     * Returns the foldername of the current theme.
     * if no theme is set, picks the "first" theme.
     * @return string
     */
    function getCurrentTheme() {
        $theme = NULL;
        if (empty($this->theme)) {
            $theme = $this->get('current_theme');
            if (empty($theme) || !file_exists(SERVERPATH . "/" . THEMEFOLDER . "/$theme")) {
                $themes = array_keys($this->getThemes());
                if (!empty($themes)) {
                    $theme = array_shift($themes);
                }
            }
            $this->theme = $theme;
        }
        return $this->theme;
    }

    /**
     * Sets the current theme
     * @param string the name of the current theme
     */
    function setCurrentTheme($theme) {
        $this->set('current_theme', $this->theme = $theme);
    }

    /**
     * Returns the number of images in the gallery
     * @param int $what 0: all images from the database
     *                                  1: published images from the database
     *                                  2: "viewable" images via the object model
     * @return int
     */
    function getNumImages($what = 0) {
        switch ((int) $what) {
            case 0:
                return db_count('images', '');
                break;
            case 1:
                $rows = query("SELECT `id` FROM " . prefix('albums') . " WHERE `show`=0");
                $idlist = array();
                $exclude = 'WHERE `show`=1';
                if ($rows) {
                    while ($row = db_fetch_assoc($rows)) {
                        $idlist[] = $row['id'];
                    }
                    if (!empty($idlist)) {
                        $exclude .= ' AND `albumid` NOT IN (' . implode(',', $idlist) . ')';
                    }
                    db_free_result($rows);
                }
                return db_count('images', $exclude);
                break;
            case 2:
                $count = 0;
                $albums = $this->getAlbums(0);
                foreach ($albums as $analbum) {
                    $album = newAlbum($analbum);
                    if (!$album->isDynamic()) {
                        $count = $count + $this->getImageCount($album);
                    }
                }
                return $count;
                break;
        }
    }

    private function getImageCount($album) {
        $count = $album->getNumImages();
        $albums = $album->getAlbums(0);
        foreach ($albums as $analbum) {
            $album = newAlbum($analbum);
            if (!$album->isDynamic()) {
                $count = $count + $this->getImageCount($album);
            }
        }
        return $count;
    }

    /**
     * Returns the count of comments
     *
     * @param bool $moderated set true if you want to see moderated comments
     * @return array
     */
    function getNumComments($moderated = false) {
        $sql = '';
        if (!$moderated) {
            $sql = "WHERE `inmoderation`=0";
        }
        return db_count('comments', $sql);
    }

    /** For every album in the gallery, look for its file. Delete from the database
     * if the file does not exist. Do the same for images. Clean up comments that have
     * been left orphaned.
     *
     * Returns true if the operation was interrupted because it was taking too long
     *
     * @param bool $cascade garbage collect every image and album in the gallery.
     * @param bool $complete garbage collect every image and album in the *database* - completely cleans the database.
     * @param  int $restart Image ID to restart scan from
     * @return bool
     */
    function garbageCollect($cascade = true, $complete = false, $restart = '') {
        global $_zp_gallery;
        if (empty($restart)) {
            setOption('last_garbage_collect', time());
            /* purge old search cache items */
            $sql = 'DELETE FROM ' . prefix('search_cache');
            if (!$complete) {
                $sql .= ' WHERE `date`<' . db_quote(date('Y-m-d H:m:s', time() - SEARCH_CACHE_DURATION * 60));
            }
            $result = query($sql);

            /* clean the comments table */
            $this->commentClean('images');
            $this->commentClean('albums');
            $this->commentClean('news');
            $this->commentClean('pages');
            // clean up obj_to_tag
            $dead = array();
            $result = query("SELECT `id`, `type`, `tagid`, `objectid` FROM " . prefix('obj_to_tag'));
            if ($result) {
                while ($row = db_fetch_assoc($result)) {
                    $tbl = $row['type'];
                    $dbtag = query_single_row("SELECT `id` FROM " . prefix('tags') . " WHERE `id`='" . $row['tagid'] . "'", false);
                    if (!$dbtag) {
                        $dead[] = $row['id'];
                    }
                    $dbtag = query_single_row("SELECT `id` FROM " . prefix($tbl) . " WHERE `id`='" . $row['objectid'] . "'", false);
                    if (!$dbtag) {
                        $dead[] = $row['id'];
                    }
                }
                db_free_result($result);
            }
            if (!empty($dead)) {
                $dead = array_unique($dead);
                query('DELETE FROM ' . prefix('obj_to_tag') . ' WHERE `id`=' . implode(' OR `id`=', $dead));
            }
            // clean up admin_to_object
            $dead = array();
            $result = query("SELECT `id`, `type`, `adminid`, `objectid` FROM " . prefix('admin_to_object'));
            if ($result) {
                while ($row = db_fetch_assoc($result)) {
                    $dbtag = query_single_row("SELECT `id` FROM " . prefix('administrators') . " WHERE `id`='" . $row['adminid'] . "'", false);
                    if (!$dbtag) {
                        $dead[] = $row['id'];
                    }
                    $tbl = $row['type'];
                    $dbtag = query_single_row("SELECT `id` FROM " . prefix($tbl) . " WHERE `id`='" . $row['objectid'] . "'", false);
                    if (!$dbtag) {
                        $dead[] = $row['id'];
                    }
                }
                db_free_result($result);
            }
            if (!empty($dead)) {
                $dead = array_unique($dead);
                query('DELETE FROM ' . prefix('admin_to_object') . ' WHERE `id` IN(' . implode(',', $dead) . ')');
            }
            // clean up news2cat
            $dead = array();
            $result = query("SELECT `id`, `news_id`, `cat_id` FROM " . prefix('news2cat'));
            if ($result) {
                while ($row = db_fetch_assoc($result)) {
                    $dbtag = query_single_row("SELECT `id` FROM " . prefix('news') . " WHERE `id`='" . $row['news_id'] . "'", false);
                    if (!$dbtag) {
                        $dead[] = $row['id'];
                    }
                    $dbtag = query_single_row("SELECT `id` FROM " . prefix('news_categories') . " WHERE `id`='" . $row['cat_id'] . "'", false);
                    if (!$dbtag) {
                        $dead[] = $row['id'];
                    }
                }
                db_free_result($result);
            }
            if (!empty($dead)) {
                $dead = array_unique($dead);
                query('DELETE FROM ' . prefix('news2cat') . ' WHERE `id` IN(' . implode(',', $dead) . ')');
            }

            // Check for the existence albums
            $set_updateddate = false;
            $dead = array();
            $live = array(''); // purge the root album if it exists
            $deadalbumthemes = array();
            // Load the albums from disk
            $result = query("SELECT `id`, `folder`, `album_theme` FROM " . prefix('albums'));
            while ($row = db_fetch_assoc($result)) {
                $albumpath = internalToFilesystem($row['folder']);
                $albumpath_valid = preg_replace('~/\.*/~', '/', $albumpath);
                $albumpath_valid = ltrim(trim($albumpath_valid, '/'), './');
                $illegal = $albumpath != $albumpath_valid;
                $valid = file_exists(ALBUM_FOLDER_SERVERPATH . $albumpath_valid) && (hasDynamicAlbumSuffix($albumpath_valid) || is_dir(ALBUM_FOLDER_SERVERPATH . $albumpath_valid));
                if ($valid && $illegal) { // maybe there is only one record so we can fix it.
                    $valid = query('UPDATE ' . prefix('albums') . ' SET `folder`=' . db_quote($albumpath_valid) . ' WHERE `id`=' . $row['id'], false);
                    debugLog(sprintf(gettext('Invalid album folder: %1$s %2$s'), $albumpath, $valid ? gettext('fixed') : gettext('discarded')));
                }
                if (!$valid || in_array($row['folder'], $live)) {
                    $dead[] = $row['id'];
                    if ($row['album_theme'] !== '') { // orphaned album theme options table
                        $deadalbumthemes[$row['id']] = $row['folder'];
                    }
                } else {
                    $live[] = $row['folder'];
                }
            }
            db_free_result($result);

            if (count($dead) > 0) { /* delete the dead albums from the DB */
                asort($dead);
                $criteria = '(' . implode(',', $dead) . ')';
                $sql1 = "DELETE FROM " . prefix('albums') . " WHERE `id` IN $criteria";
                $n = query($sql1);
                if (!$complete && $n && $cascade) {
                    $sql2 = "DELETE FROM " . prefix('images') . " WHERE `albumid` IN $criteria";
                    query($sql2);
                    $sql3 = "DELETE FROM " . prefix('comments') . " WHERE `type`='albums' AND `ownerid` IN $criteria";
                    query($sql3);
                    $sql4 = "DELETE FROM " . prefix('obj_to_tag') . " WHERE `type`='albums' AND `objectid` IN $criteria";
                    query($sql4);
                }
            }
            if (count($deadalbumthemes) > 0) { // delete the album theme options tables for dead albums
                foreach ($deadalbumthemes as $id => $deadtable) {
                    $sql = 'DELETE FROM ' . prefix('options') . ' WHERE `ownerid`=' . $id;
                    query($sql, false);
                }
            }
            if (count($dead) > 0) {
                // Set updateddate on possible parent albums of deleted ones
                $result = query("SELECT `parentid`, `folder` FROM " . prefix('albums') . ' WHERE `id` IN(' . implode(',', $dead) . ')');
                while ($row = db_fetch_assoc($result)) {
                    if($row['parentid'] != 0) {
                        $parentalbum = getItemByID('albums', $row['parentid']);
                        $parentalbum->setUpdateddate();
                        $parentalbum->save();
                        $parentalbum->setUpdatedDateParents();
                    }
                }
            }
        }

        if ($complete) {
            if (empty($restart)) {
                /* check album parent linkage */
                $albums = $_zp_gallery->getAlbums();
                foreach ($albums as $album) {
                    checkAlbumParentid($album, NULL, 'debuglog');
                }

                /* refresh 'metadata' albums */
                $albumids = query("SELECT `id`, `mtime`, `folder`, `dynamic` FROM " . prefix('albums'));
                if ($albumids) {
                    while ($analbum = db_fetch_assoc($albumids)) {
                        if (($mtime = filemtime(ALBUM_FOLDER_SERVERPATH . internalToFilesystem($analbum['folder']))) > $analbum['mtime']) {
                            // refresh
                            $album = newAlbum($analbum['folder']);
                            $album->set('mtime', $mtime);
                            if ($this->getAlbumUseImagedate()) {
                                $album->setDateTime(NULL);
                            }
                            if ($album->isDynamic()) {
                                $data = file_get_contents($album->localpath);
                                $thumb = getOption('AlbumThumbSelect');
                                $words = $fields = '';
                                while (!empty($data)) {
                                    $data1 = trim(substr($data, 0, $i = strpos($data, "\n")));
                                    if ($i === false) {
                                        $data1 = $data;
                                        $data = '';
                                    } else {
                                        $data = substr($data, $i + 1);
                                    }
                                    if (strpos($data1, 'WORDS=') !== false) {
                                        $words = "words=" . urlencode(substr($data1, 6));
                                    }
                                    if (strpos($data1, 'THUMB=') !== false) {
                                        $thumb = trim(substr($data1, 6));
                                    }
                                    if (strpos($data1, 'FIELDS=') !== false) {
                                        $fields = "&searchfields=" . trim(substr($data1, 7));
                                    }
                                }
                                if (!empty($words)) {
                                    if (empty($fields)) {
                                        $fields = '&searchfields=tags';
                                    }
                                }
                                $album->set('search_params', $words . $fields);
                                $album->set('thumb', $thumb);
                            }
                            $album->save();
                            zp_apply_filter('album_refresh', $album);
                        }
                    }
                    db_free_result($albumids);
                }

                /* Delete all image entries that don't belong to an album at all. */
                $albumids = query("SELECT `id` FROM " . prefix('albums')); /* all the album IDs */
                $idsofalbums = array();
                if ($albumids) {
                    while ($row = db_fetch_assoc($albumids)) {
                        $idsofalbums[] = $row['id'];
                    }
                    db_free_result($albumids);
                }
                $imageAlbums = query("SELECT DISTINCT `albumid` FROM " . prefix('images')); /* albumids of all the images */
                $albumidsofimages = array();
                if ($imageAlbums) {
                    while ($row = db_fetch_assoc($imageAlbums)) {
                        $albumidsofimages[] = $row['albumid'];
                    }
                    db_free_result($imageAlbums);
                }
                $orphans = array_diff($albumidsofimages, $idsofalbums); /* albumids of images with no album */

                if (count($orphans) > 0) { /* delete dead images from the DB */
                    $firstrow = array_pop($orphans);
                    $sql = "DELETE FROM " . prefix('images') . " WHERE `albumid`='" . $firstrow . "'";
                    foreach ($orphans as $id) {
                        $sql .= " OR `albumid`='" . $id . "'";
                    }
                    query($sql);

                    // Then go into existing albums recursively to clean them... very invasive.
                    foreach ($this->getAlbums(0) as $folder) {
                        $album = newAlbum($folder);
                        if (!$album->isDynamic()) {
                            if (is_null($album->getDateTime())) { // see if we can get one from an image
                                $images = $album->getImages(0, 0);
                                if (count($images) > 0) {
                                    $image = newImage($album, array_shift($images));
                                    $album->setDateTime($image->getDateTime());
                                }
                            }
                            $album->garbageCollect(true);
                            $album->preLoad();
                        }
                        $album->save();
                        zp_apply_filter('album_refresh', $album);
                    }
                }
            }

            /* Look for image records where the file no longer exists. While at it, check for images with IPTC data to update the DB */

            $start = array_sum(explode(" ", microtime())); // protect against too much processing.
            if (!empty($restart)) {
                $restartwhere = ' WHERE `id`>' . $restart . ' AND `mtime`=0';
            } else {
                $restartwhere = ' WHERE `mtime`=0';
            }
            define('RECORD_LIMIT', 5);
            $sql = 'SELECT * FROM ' . prefix('images') . $restartwhere . ' ORDER BY `id` LIMIT ' . (RECORD_LIMIT + 2);
            $images = query($sql);
            if ($images) {
                $c = 0;
                while ($image = db_fetch_assoc($images)) {
                    $albumobj = getItemByID('albums', $image['albumid']);
                    if ($albumobj->exists && file_exists($imageName = internalToFilesystem(ALBUM_FOLDER_SERVERPATH . $albumobj->name . '/' . $image['filename']))) {
                        if ($image['mtime'] != $mtime = filemtime($imageName)) { // file has changed since we last saw it
                            $imageobj = newImage($albumobj, $image['filename']);
                            $imageobj->set('mtime', $mtime);
                            $imageobj->updateMetaData(); // prime the EXIF/IPTC fields
                            $imageobj->updateDimensions(); // update the width/height & account for rotation
                            $imageobj->save();
                            zp_apply_filter('image_refresh', $imageobj);
                        }
                    } else {
                        $sql = 'DELETE FROM ' . prefix('images') . ' WHERE `id`="' . $image['id'] . '";';
                        $result = query($sql);
                        $sql = 'DELETE FROM ' . prefix('comments') . ' WHERE `type` IN (' . zp_image_types('"') . ') AND `ownerid` ="' . $image['id'] . '";';
                        $result = query($sql);
                    }
                    if (++$c >= RECORD_LIMIT) {
                        return $image['id']; // avoide excessive processing
                    }
                }
                db_free_result($images);
            }
// cleanup the tables
            $resource = db_show('tables');
            if ($resource) {
                while ($row = db_fetch_assoc($resource)) {
                    $tbl = array_shift($row);
                    query('OPTIMIZE TABLE `' . $tbl . '`');
                }
                db_free_result($resource);
            }
        }
        return false;
    }

    function commentClean($table) {
        $ids = query('SELECT `id` FROM ' . prefix($table)); /* all the IDs */
        $idsofitems = array();
        if ($ids) {
            while ($row = db_fetch_assoc($ids)) {
                $idsofitems[] = $row['id'];
            }
            db_free_result($ids);
        }
        $sql = "SELECT DISTINCT `ownerid` FROM " . prefix('comments') . ' WHERE `type` =' . db_quote($table);
        $commentOwners = query($sql); /* all the comments */
        $idsofcomments = array();
        if ($commentOwners) {
            while ($row = db_fetch_assoc($commentOwners)) {
                $idsofcomments [] = $row['ownerid'];
            }
            db_free_result($commentOwners);
        }
        $orphans = array_diff($idsofcomments, $idsofitems); /* owner ids of comments with no owner */

        if (count($orphans) > 0) { /* delete dead comments from the DB */
            $sql = "DELETE FROM " . prefix('comments') . " WHERE `type`=" . db_quote($table) . " AND (`ownerid`=" . implode(' OR `ownerid`=', $orphans) . ')';
            query($sql);
        }
    }

    /**
     * Cleans out the cache folder
     *
     * @param string $cachefolder the sub-folder to clean
     */
    static function clearCache($cachefolder = NULL) {
        if (is_null($cachefolder)) {
            $cachefolder = SERVERCACHE;
        }
        removeDir($cachefolder, true);
    }

    /**
     * Sort the album array based on either according to the sort key.
     * Default is to sort on the `sort_order` field.
     *
     * Returns an array with the albums in the desired sort order
     *
     * @param array $albums array of album names
     * @param string $sortkey the sorting scheme
     * @param string $sortdirection
     * @param bool $mine set true/false to override ownership
     * @return array
     *
     * @author Todd Papaioannou (lucky@luckyspin.org)
     * @since 1.0.0
     */
    function sortAlbumArray($parentalbum, $albums, $sortkey = '`sort_order`', $sortdirection = NULL, $mine = NULL) {
        if (count($albums) == 0) {
            return array();
        }
        if (is_null($mine) && zp_loggedin(MANAGE_ALL_ALBUM_RIGHTS)) {
            $mine = true;
        }
        if (is_null($parentalbum)) {
            $albumid = ' IS NULL';
            $obj = $this;
            $viewUnpublished = $mine;
        } else {
            $albumid = '=' . $parentalbum->getID();
            $obj = $parentalbum;
            $viewUnpublished = (zp_loggedin() && $obj->albumSubRights() & (MANAGED_OBJECT_RIGHTS_EDIT | MANAGED_OBJECT_RIGHTS_VIEW));
        }

        if (($sortkey == '`sort_order`') || ($sortkey == 'RAND()')) { // manual sort is always ascending
            $order = false;
        } else {
            if (!is_null($sortdirection)) {
                $order = strtoupper($sortdirection) == 'DESC';
            } else {
                $order = $obj->getSortDirection('album');
            }
        }
        $sortkey = db_quote($sortkey, false);
        $sql = 'SELECT * FROM ' . prefix("albums") . ' WHERE `parentid`' . $albumid . ' ORDER BY ' . $sortkey . ' ' . $sortdirection;
        $result = query($sql);
        $results = array();
        //  check database aganist file system
        while ($row = db_fetch_assoc($result)) {
            $folder = $row['folder'];
            if (($key = array_search($folder, $albums)) !== false) { // album exists in filesystem
                $results[$row['folder']] = $row;
                unset($albums[$key]);
            } else { // album no longer exists
                $id = $row['id'];
                query("DELETE FROM " . prefix('albums') . " WHERE `id`=$id"); // delete the record
                query("DELETE FROM " . prefix('comments') . " WHERE `type` ='images' AND `ownerid`= '$id'"); // remove image comments
                query("DELETE FROM " . prefix('obj_to_tag') . "WHERE `type`='albums' AND `objectid`=" . $id);
                query("DELETE FROM " . prefix('albums') . " WHERE `id` = " . $id);
            }
        }
        db_free_result($result);
        foreach ($albums as $folder) { // these albums are not in the database
            $albumobj = newAlbum($folder);
            if ($albumobj->exists) { // fail to instantiate?
                $results[$folder] = $albumobj->getData();
            }
        }
        //  now put the results in the right order
        $results = sortByKey($results, $sortkey, $order);
        //  albums are now in the correct order
        $albums_ordered = array();
        foreach ($results as $row) { // check for visible
            $folder = $row['folder'];
            $album = newAlbum($folder);
            switch (themeObject::checkScheduledPublishing($row)) {
                case 1:
                    $album->setShow(0);
                    $album->save();
                case 2:
                    $row['show'] = 0;
            }

            if ($mine || $row['show'] || (($list = $album->isMyItem(LIST_RIGHTS)) && is_null($album->getParent())) || (is_null($mine) && $list && $viewUnpublished)) {
                $albums_ordered[] = $folder;
            }
        }
        return $albums_ordered;
    }

    /**
     * Returns the hitcount
     *
     * @return int
     */
    function getHitcounter() {
        return $this->get('hitcounter');
    }

    /**
     * counts visits to the object
     */
    function countHit() {
        $this->set('hitcounter', $this->get('hitcounter') + 1);
        $this->save();
    }

    /**
     * Title to be used for the home (not Zenphoto gallery) WEBsite
     */
    function getWebsiteTitle($locale = NULL) {
        $text = $this->get('website_title');
        if ($locale !== 'all') {
            $text = get_language_string($text, $locale);
        }
        $text = unTagURLs($text);
        return $text;
    }

    function setWebsiteTitle($value) {
        $this->set('website_title', tagURLs($value));
    }

    /**
     * The URL of the home (not Zenphoto gallery) WEBsite
     */
    function getWebsiteURL() {
        return $this->get('website_url');
    }

    function setWebsiteURL($value) {
        $this->set('website_url', $value);
    }

    /**
     * Option to allow only registered users view the site
     */
    function getSecurity() {
        return $this->get('gallery_security');
    }

    function setSecurity($value) {
        $this->set('gallery_security', $value);
    }

    /**
     * Option to expose the user field on logon forms
     */
    function getUserLogonField() {
        return $this->get('login_user_field');
    }

    function setUserLogonField($value) {
        $this->set('login_user_field', $value);
    }

    /**
     * Option to update album date from date of new images
     */
    function getAlbumUseImagedate() {
        return $this->get('album_use_new_image_date');
    }

    function setAlbumUseImagedate($value) {
        $this->set('album_use_new_image_date', $value);
    }

    /**
     * Option to show images in the thumbnail selector
     */
    function getThumbSelectImages() {
        return $this->get('thumb_select_images');
    }

    function setThumbSelectImages($value) {
        $this->set('thumb_select_images', $value);
    }

    /**
     * Option to show subalbum images in the thumbnail selector
     */
    function getSecondLevelThumbs() {
        return $this->get('multilevel_thumb_select_images');
    }

    function setSecondLevelThumbs($value) {
        $this->set('multilevel_thumb_select_images', $value);
    }

    /**
     * Option of for gallery sessions
     */
    function getGallerySession() {
        return $this->get('album_session');
    }

    function setGallerySession($value) {
        $this->set('album_session', $value);
    }

    /**
     *
     * Tests if a page is excluded from password protection
     * @param $page
     */
    function isUnprotectedPage($page) {
        return (in_array($page, $this->unprotected_pages));
    }

    function setUnprotectedPage($page, $on) {
        if ($on) {
            array_unshift($this->unprotected_pages, $page);
            $this->unprotected_pages = array_unique($this->unprotected_pages);
        } else {
            $key = array_search($page, $this->unprotected_pages);
            if ($key !== false) {
                unset($this->unprotected_pages[$key]);
            }
        }
        $this->set('unprotected_pages', serialize($this->unprotected_pages));
    }

    function getAlbumPublish() {
        return $this->get('album_publish');
    }

    function setAlbumPublish($v) {
        $this->set('album_publish', $v);
    }

    function getImagePublish() {
        return $this->get('image_publish');
    }

    function setImagePublish($v) {
        $this->set('image_publish', $v);
    }

    /**
     * Returns the codeblocks as an serialized array
     *
     * @return array
     */
    function getCodeblock() {
        return unTagURLs($this->get("codeblock"));
    }

    /**
     * set the codeblocks as an serialized array
     *
     */
    function setCodeblock($cb) {
        $this->set('codeblock', tagURLs($cb));
    }

    /**
     * Checks if guest is loggedin for the album
     * @param unknown_type $hint
     * @param unknown_type $show
     */
    function checkforGuest(&$hint = NULL, &$show = NULL) {
        if (!(GALLERY_SECURITY != 'public')) {
            return false;
        }
        $hint = '';
        $pwd = $this->getPassword();
        if (!empty($pwd)) {
            return 'zpcms_auth_gallery';
        }
        return 'zp_public_access';
    }

    /**
     *
     * returns true if there is any protection on the gallery
     */
    function isProtected() {
        return $this->checkforGuest() != 'zp_public_access';
    }

    function get($field) {
        if (isset($this->data[$field])) {
            return $this->data[$field];
        }
        return NULL;
    }

    function set($field, $value) {
        $this->data[$field] = $value;
    }

    function save() {
        setOption('gallery_data', serialize($this->data));
    }

    /**
     *
     * "Magic" function to return a string identifying the object when it is treated as a string
     * @return string
     */
    public function __toString() {
        return 'Gallery object';
    }

    /**
     * registers object handlers for image varients
     * @global array $_zp_extra_filetypes
     * @param type $suffix
     * @param type $objectName
     */
    static function addImageHandler($suffix, $objectName) {
        global $_zp_extra_filetypes;
        $_zp_extra_filetypes[strtolower($suffix)] = $objectName;
    }

    /**
     * Returns true if the file is an image
     *
     * @param string $filename the name of the target
     * @return bool
     */
    static function validImage($filename) {
        global $_zp_supported_images;
        return in_array(getSuffix($filename), $_zp_supported_images);
    }

    /**
     * Returns true if the file is handled by an image handler plugin object
     *
     * @param string $filename
     * @return bool
     */
    static function validImageAlt($filename) {
        global $_zp_extra_filetypes;
        return @$_zp_extra_filetypes[getSuffix($filename)];
    }

    /**
     * registers object handlers for album varients
     * @global array $_zp_albumHandlers
     * @param type $suffix
     * @param type $objectName
     */
    static function addAlbumHandler($suffix, $objectName) {
        global $_zp_albumHandlers;
        $_zp_albumHandlers[strtolower($suffix)] = $objectName;
    }

}

?>
ZenphotoCMS 1.5.x API documentation generated by ApiGen