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: 
<?php
$plugin_is_filter = 900 | FEATURE_PLUGIN;
$plugin_description = gettext('The Zenphoto <em>RSS</em> handler.');
$plugin_notice = gettext('This plugin must be enabled to supply <em>RSS</em> feeds.') . '<br />' . gettext('<strong>Note:</strong> Theme support is required to display RSS links.');
$plugin_category = gettext('Feed');
$plugin_author = "Stephen Billard (sbillard)";
$option_interface = 'rss_options';
class rss_options {
    function __construct() {
        global $plugin_is_filter;
        if (OFFSET_PATH == 2) {
            setOptionDefault('zp_plugin_rss', $plugin_is_filter);
            setOptionDefault('RSS_items', getOption('feed_items')); 
            setOptionDefault('RSS_imagesize', getOption('feed_imagesize'));
            setOptionDefault('RSS_sortorder', getOption('feed_sortorder'));
            setOptionDefault('RSS_items_albums', getOption('feed_items_albums')); 
            setOptionDefault('RSS_imagesize_albums', getOption('feed_imagesize_albums'));
            setOptionDefault('RSS_sortorder_albums', getOption('feed_sortorder_albums'));
            setOptionDefault('RSS_enclosure', getOption('feed_enclosure'));
            setOptionDefault('RSS_mediarss', getOption('feed_mediarss'));
            setOptionDefault('RSS_cache', getOption('feed_cache'));
            setOptionDefault('RSS_cache_expire', getOption('feed_cache_expire'));
            setOptionDefault('RSS_hitcounter', getOption('feed_hitcounter'));
            setOptionDefault('RSS_title', getOption('feed_title'));
            setOptionDefault('RSS_truncate_length', getOption('zenpage_rss_length'));
            setOptionDefault('RSS_zenpage_items', getOption('zenpage_rss_items'));
            purgeOption('feed_items');
            purgeOption('feed_imagesize');
            purgeOption('feed_sortorder');
            purgeOption('feed_items_albums');
            purgeOption('feed_imagesize_albums');
            purgeOption('feed_sortorder_albums');
            purgeOption('feed_enclosure');
            purgeOption('feed_mediarss');
            purgeOption('feed_cache');
            purgeOption('feed_cache_expire');
            purgeOption('feed_hitcounter');
            purgeOption('feed_title');
            purgeOption('zenpage_rss_length');
            purgeOption('zenpage_rss_items');
            
            setOptionDefault('RSS_album_image', 1);
            setOptionDefault('RSS_comments', 1);
            setOptionDefault('RSS_articles', 1);
            setOptionDefault('RSS_pages', 1);
            setOptionDefault('RSS_article_comments', 1);
            setOptionDefault('RSS_truncate_length', '100');
            setOptionDefault('RSS_zenpage_items', '10');
            setOptionDefault('RSS_items', 10); 
            setOptionDefault('RSS_imagesize', 240);
            setOptionDefault('RSS_sortorder', 'latest');
            setOptionDefault('RSS_items_albums', 10); 
            setOptionDefault('RSS_imagesize_albums', 240);
            setOptionDefault('RSS_sortorder_albums', 'latest');
            setOptionDefault('RSS_enclosure', '0');
            setOptionDefault('RSS_mediarss', '0');
            setOptionDefault('RSS_cache', '1');
            setOptionDefault('RSS_cache_expire', 86400);
            setOptionDefault('RSS_hitcounter', 1);
            setOptionDefault('RSS_title', 'both');
        }
    }
    function getOptionsSupported() {
        $options = array(
                gettext('RSS feeds enabled:') => array(
                        'key' => 'RSS_feed_list',
                        'type' => OPTION_TYPE_CHECKBOX_ARRAY,
                        'order' => 0,
                        'checkboxes' => array(gettext('Gallery') => 'RSS_album_image',
                                gettext('Gallery Comments') => 'RSS_comments',
                                gettext('All News') => 'RSS_articles',
                                gettext('All Pages') => 'RSS_pages',
                                gettext('News/Page Comments') => 'RSS_article_comments'
                        ),
                        'desc' => gettext('Check each RSS feed you wish to activate.')),
                gettext('Image feed items:') => array(
                        'key' => 'RSS_items',
                        'type' => OPTION_TYPE_TEXTBOX,
                        'order' => 1,
                        'desc' => gettext("The number of new images and comments you want to appear in your site’s RSS feed")),
                gettext('Album feed items:') => array(
                        'key' => 'RSS_items_albums',
                        'type' => OPTION_TYPE_TEXTBOX,
                        'order' => 2,
                        'desc' => gettext("The number of new images and comments you want to appear in your site’s RSS feed")),
                gettext('Image size') => array(
                        'key' => 'RSS_imagesize',
                        'type' => OPTION_TYPE_TEXTBOX,
                        'order' => 3,
                        'desc' => gettext('Size of RSS image feed images:')),
                gettext('Album image size') => array(
                        'key' => 'RSS_imagesize_albums',
                        'type' => OPTION_TYPE_TEXTBOX,
                        'order' => 4,
                        'desc' => gettext('Size of RSS album feed images :')),
                gettext('Image feed sort order:') => array(
                        'key' => 'RSS_sortorder',
                        'type' => OPTION_TYPE_SELECTOR,
                        'order' => 6,
                        'selections' => array(gettext('latest by id') => 'latest',
                                gettext('latest by date') => 'latest-date',
                                gettext('latest by mtime') => 'latest-mtime',
                                gettext('latest by publishdate') => 'latest-publishdate'
                        ),
                        'desc' => gettext("Choose between latest by id for the latest uploaded, latest by date for the latest uploaded fetched by date, or latest by mtime for the latest uploaded fetched by the file’ last change timestamp.")),
                gettext('Album feed sort order:') => array(
                        'key' => 'RSS_sortorder_albums',
                        'type' => OPTION_TYPE_SELECTOR,
                        'selections' => array(gettext('latest by id') => 'latest',
                                gettext('latest by date') => 'latest-date',
                                gettext('latest by mtime') => 'latest-mtime',
                                gettext('latest by publishdate') => 'latest-publishdate',
                                gettext('latest updated') => 'latestupdated'
                        ),
                        'order' => 7,
                        'desc' => gettext('Choose between latest by id for the latest uploaded and latest updated')),
                gettext('RSS enclosure:') => array(
                        'key' => 'RSS_enclosure',
                        'type' => OPTION_TYPE_CHECKBOX,
                        'order' => 8,
                        'desc' => gettext('Check if you want to enable the RSS enclosure feature which provides a direct download for full images, movies etc. from within certain RSS reader clients (only Images RSS).')),
                gettext('Media RSS:') => array(
                        'key' => 'RSS_mediarss',
                        'type' => OPTION_TYPE_CHECKBOX,
                        'order' => 9,
                        'desc' => gettext('Check if media RSS support is to be enabled. This support is used by some services and programs (only Images RSS).')),
                gettext('Cache') => array(
                        'key' => 'RSS_cache',
                        'type' => OPTION_TYPE_CHECKBOX,
                        'order' => 10,
                        'desc' => sprintf(gettext('Check if you want to enable static RSS feed caching. The cached file will be placed within the <em>%s</em> folder.'), STATIC_CACHE_FOLDER)),
                gettext('Cache expiration') => array(
                        'key' => 'RSS_cache_expire',
                        'type' => OPTION_TYPE_TEXTBOX,
                        'order' => 11,
                        'desc' => gettext('Cache expire default is 86400 seconds (1 day = 24 hrs * 60 min * 60 sec).')),
                gettext('Hitcounter') => array(
                        'key' => 'RSS_hitcounter',
                        'type' => OPTION_TYPE_CHECKBOX,
                        'order' => 12,
                        'desc' => gettext('Check if you want to store the hitcount on RSS feeds.')),
                gettext('Title') => array(
                        'key' => 'RSS_title',
                        'type' => OPTION_TYPE_RADIO,
                        'order' => 13,
                        'buttons' => array(gettext('Gallery title') => 'gallery', gettext('Website title') => 'website', gettext('Both') => 'both'),
                        'desc' => gettext("Select what you want to use as the main RSS feed (channel) title. “Both” means Website title followed by Gallery title")),
                gettext('Portable RSS link') => array(
                        'key' => 'RSS_portable_link',
                        'type' => OPTION_TYPE_CHECKBOX,
                        'order' => 14,
                        'desc' => gettext('If checked links generated for logged‑in users will include a token identifying the user. Use of that link when not logged‑in will give the same feed as if the user were logged‑in.'))
        );
        if (extensionEnabled('zenpage')) {
            $options[gettext('Feed text length')] = array(
                    'key' => 'RSS_truncate_length',
                    'type' => OPTION_TYPE_TEXTBOX,
                    'order' => 5.5,
                    'desc' => gettext("The text length of the Zenpage RSS feed items. No value for full length."));
            $options[gettext('Zenpage feed items')] = array(
                    'key' => 'RSS_zenpage_items',
                    'type' => OPTION_TYPE_TEXTBOX,
                    'order' => 5,
                    'desc' => gettext("The number of news articles you want to appear in your site’s News RSS feed."));
        }
        return $options;
    }
    function handleOption($option, $currentValue) {
        
    }
    function handleOptionSave() {
        if (isset($_POST['saverssoptions'])) {
            setOption('RSS_items', sanitize($_POST['RSS_items'], 3));
            setOption('RSS_imagesize', sanitize($_POST['RSS_imagesize'], 3));
            setOption('RSS_sortorder', sanitize($_POST['RSS_sortorder'], 3));
            setOption('RSS_items_albums', sanitize($_POST['RSS_items_albums'], 3));
            setOption('RSS_imagesize_albums', sanitize($_POST['RSS_imagesize_albums'], 3));
            setOption('RSS_sortorder_albums', sanitize($_POST['RSS_sortorder_albums'], 3));
            setOption('RSS_title', sanitize($_POST['RSS_title'], 3));
            setOption('RSS_cache_expire', sanitize($_POST['RSS_cache_expire'], 3));
            setOption('RSS_enclosure', (int) isset($_POST['RSS_enclosure']));
            setOption('RSS_mediarss', (int) isset($_POST['RSS_mediarss']));
            setOption('RSS_cache', (int) isset($_POST['RSS_cache']));
            setOption('RSS_album_image', (int) isset($_POST['RSS_album_image']));
            setOption('RSS_comments', (int) isset($_POST['RSS_comments']));
            setOption('RSS_articles', (int) isset($_POST['RSS_articles']));
            setOption('RSS_pages', (int) isset($_POST['RSS_pages']));
            setOption('RSS_article_comments', (int) isset($_POST['RSS_article_comments']));
            setOption('RSS_hitcounter', (int) isset($_POST['RSS_hitcounter']));
            setOption('RSS_portable_link', (int) isset($_POST['RSS_portable_link']));
            $returntab = "&tab=rss";
        }
    }
}
function getRSSLink($option, $lang = NULL, $addl = NULL) {
    global $_zp_current_album, $_zp_current_image, $_zp_current_admin_obj, $_zp_current_category;
    if (empty($lang)) {
        $lang = getLanguageText(getOption('locale'));
    }
    $link = NULL;
    switch (strtolower($option)) {
        case 'gallery':
            if (getOption('RSS_album_image')) {
                $link = array('rss' => 'gallery');
            }
            break;
        case 'album':
            if (getOption('RSS_album_image')) {
                if (is_object($addl)) {
                    $album = $addl;
                } else {
                    $album = $_zp_current_album;
                }
                $link = array('rss' => 'gallery', 'albumname' => $album->getFileName());
                break;
            }
        case 'collection':
            if (getOption('RSS_album_image')) {
                if (is_object($addl)) {
                    $album = $addl;
                } else {
                    $album = $_zp_current_album;
                }
                $link = array('rss' => 'gallery', 'folder' => $album->getFileName());
            }
            break;
        case 'comments':
            if (getOption('RSS_comments')) {
                $link = array('rss' => 'comments', 'type' => 'gallery');
            }
            break;
        case 'comments-image':
            if (getOption('RSS_comments')) {
                $link = array('rss' => 'comments', 'id' => (string) $_zp_current_image->getID(), 'type' => 'image');
            }
            break;
        case 'comments-album':
            if (getOption('RSS_comments')) {
                $link = array('rss' => 'comments', 'id' => (string) $_zp_current_album->getID(), 'type' => 'album');
            }
            break;
        case 'albumsrss':
            if (getOption('RSS_album_image')) {
                $link = array('rss' => 'gallery', 'albumsmode' => '');
            }
            break;
        case 'albumsrsscollection':
            if (getOption('RSS_album_image')) {
                $link = array('rss' => 'gallery', 'folder' => $_zp_current_album->getFileName(), 'albumsmode' => '');
            }
            break;
        case 'pages':
            if (getOption('RSS_pages')) {
                $link = array('rss' => 'pages');
            }
            break;
        case 'news':
            if (getOption('RSS_articles')) {
                $link = array('rss' => 'news');
            }
            break;
        case 'category':
            if (getOption('RSS_articles')) {
                if (empty($addl) && !is_null($_zp_current_category)) {
                    $addl = $_zp_current_category->getTitlelink();
                }
                if (empty($addl)) {
                    $link = array('rss' => 'news');
                } else {
                    $link = array('rss' => 'news', 'category' => $addl);
                }
            }
            break;
        case 'newswithimages':
            if (getOption('RSS_articles')) {
                $link = array('rss' => 'news', 'withimages' => '');
            }
            break;
        case 'comments':
            if (getOption('RSS_article_comments')) {
                $link = array('comments' => 1, 'type' => 'zenpage');
            }
            break;
        case 'comments-news':
            if (getOption('RSS_article_comments')) {
                $link = array('rss' => 'comments', 'id' => (string) getNewsID(), 'type' => 'news');
            }
            break;
        case 'comments-page':
            if (getOption('RSS_article_comments')) {
                $link = array('rss' => 'comments', 'id' => (string) getPageID(), 'type' => 'page');
            }
            break;
        case 'comments-all':
            if (getOption('RSS_article_comments')) {
                $link = array('rss' => 'comments', 'type' => 'allcomments');
            }
            break;
    }
    if (is_array($link)) {
        $link['lang'] = $lang;
        if (zp_loggedin() && getOption('RSS_portable_link')) {
            $link['user'] = (string) $_zp_current_admin_obj->getID();
            $link['token'] = RSS::generateToken($link);
        }
        $uri = WEBPATH . '/index.php?' . str_replace('=&', '&', http_build_query($link));
        return $uri;
    }
    return NULL;
}
function printRSSLink($option, $prev, $linktext, $next, $printIcon = true, $class = null, $lang = '', $addl = NULL) {
    if ($printIcon) {
        $icon = ' <img src="' . FULLWEBPATH . '/' . ZENFOLDER . '/images/rss.png" alt="RSS Feed" />';
    } else {
        $icon = '';
    }
    if (!is_null($class)) {
        $class = 'class="' . $class . '"';
    }
    if (empty($lang)) {
        $lang = getLanguageText(getOption("locale"));
    }
    echo $prev . "<a $class href=\"" . html_encode(getRSSLink($option, $lang, $addl)) . "\" title=\"" . html_encode($linktext) . "\" rel=\"nofollow\">" . $linktext . "$icon</a>" . $next;
}
function printRSSHeaderLink($option, $linktext, $lang = '', $addl = NULL) {
    echo "<link rel=\"alternate\" type=\"application/rss+xml\" title=\"" . html_encode(getBare($linktext)) . "\" href=\"" .
    PROTOCOL . '://' . html_encode($_SERVER["HTTP_HOST"]) . html_encode(getRSSLink($option, $lang, $addl)) . "\" />\n";
}
require_once(SERVERPATH . '/' . ZENFOLDER . '/class-feed.php');
require_once(SERVERPATH . '/' . ZENFOLDER . '/lib-MimeTypes.php');
class RSS extends feed {
    protected $feed = 'RSS';
    
    function __construct($options = NULL) {
        global $_zp_gallery, $_zp_current_admin_obj, $_zp_loggedin;
        if (empty($options))
            self::feed404();
        $this->feedtype = $options['rss'];
        parent::__construct($options);
        if (isset($options['token'])) {
            $link = $options;
            unset($link['token']);
            $token = RSS::generateToken($link);
            if ($token == $options['token']) {
                $adminobj = Zenphoto_Authority::getAnAdmin(array('`id`=' => (int) $link['user']));
                if ($adminobj) {
                    $_zp_current_admin_obj = $adminobj;
                    $_zp_loggedin = $_zp_current_admin_obj->getRights();
                }
            }
        }
        $channeltitlemode = getOption('RSS_title');
        $this->host = html_encode($_SERVER["HTTP_HOST"]);
        switch ($channeltitlemode) {
            case 'gallery':
                $this->channel_title = $_zp_gallery->getBareTitle($this->locale);
                break;
            case 'website':
                $this->channel_title = getBare($_zp_gallery->getWebsiteTitle($this->locale));
                break;
            case 'both':
                $website_title = $_zp_gallery->getWebsiteTitle($this->locale);
                $this->channel_title = $_zp_gallery->getBareTitle($this->locale);
                if (!empty($website_title)) {
                    $this->channel_title = $website_title . ' - ' . $this->channel_title;
                }
                break;
        }
        switch ($this->feedtype) {
            case 'gallery':
                if (!getOption('RSS_album_image')) {
                    self::feed404();
                }
                $albumname = $this->getChannelTitleExtra();
                if ($this->albumfolder) {
                    $alb = newAlbum($this->albumfolder, true, true);
                    if ($alb->exists) {
                        $albumtitle = $alb->getTitle();
                        $albumname = ' - ' . html_encode($albumtitle) . $this->getChannelTitleExtra();
                    } else {
                        self::feed404();
                    }
                } else {
                    $albumtitle = '';
                }
                $this->channel_title = html_encode($this->channel_title . ' ' . getBare($albumname));
                require_once(SERVERPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER . '/image_album_statistics.php');
                break;
            case 'news': 
                if (!getOption('RSS_articles')) {
                    self::feed404();
                }
                $titleappendix = gettext(' (Latest news)');
                switch ($this->newsoption) {
                    case 'withalbums':
                    case 'withalbums_mtime':
                    case 'withalbums_publishdate':
                    case 'withalbums_latestupdated':
                        $titleappendix = gettext(' (Latest news and albums)');
                        break;
                    case 'withimages':
                    case 'withimages_mtime':
                    case 'withimages_publishdate':
                        $titleappendix = gettext(' (Latest news and images)');
                        break;
                    default:
                        switch ($this->sortorder) {
                            case 'popular':
                                $titleappendix = gettext(' (Most popular news)');
                                break;
                            case 'mostrated':
                                $titleappendix = gettext(' (Most rated news)');
                                break;
                            case 'toprated':
                                $titleappendix = gettext(' (Top rated news)');
                                break;
                            case 'random':
                                $titleappendix = gettext(' (Random news)');
                                break;
                        }
                        break;
                }
                $cattitle = "";
                if ($this->cattitle) {
                    $cattitle = " - " . $this->cattitle;
                }
                $this->channel_title = html_encode($this->channel_title . $cattitle . $titleappendix);
                $this->itemnumber = getOption("RSS_zenpage_items"); 
                require_once(SERVERPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER . '/image_album_statistics.php');
                require_once(SERVERPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER . '/zenpage/zenpage-template-functions.php');
                break;
            case 'pages': 
                if (!getOption('RSS_pages')) {
                    self::feed404();
                }
                switch ($this->sortorder) {
                    case 'popular':
                        $titleappendix = gettext(' (Most popular pages)');
                        break;
                    case 'mostrated':
                        $titleappendix = gettext(' (Most rated pages)');
                        break;
                    case 'toprated':
                        $titleappendix = gettext(' (Top rated pages)');
                        break;
                    case 'random':
                        $titleappendix = gettext(' (Random pages)');
                        break;
                    default:
                        $titleappendix = gettext(' (Latest pages)');
                        break;
                }
                $this->channel_title = html_encode($this->channel_title . $titleappendix);
                require_once(SERVERPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER . '/zenpage/zenpage-template-functions.php');
                break;
            case 'comments': 
                if (!getOption('RSS_comments')) {
                    self::feed404();
                }
                if ($this->id) {
                    switch ($this->commentfeedtype) {
                        case 'album':
                            $table = 'albums';
                            break;
                        case 'image':
                            $table = 'images';
                            break;
                        case 'news':
                            $table = 'news';
                            break;
                        case 'page':
                            $table = 'pages';
                            break;
                        default:
                            self::feed404();
                            break;
                    }
                    $this->itemobj = getItemByID($table, $this->id);
                    if ($this->itemobj) {
                        $title = ' - ' . $this->itemobj->getTitle();
                    } else {
                        self::feed404();
                    }
                } else {
                    $this->itemobj = NULL;
                    $title = NULL;
                }
                $this->channel_title = html_encode($this->channel_title . $title . gettext(' (latest comments)'));
                if (extensionEnabled('zenpage')) {
                    require_once(SERVERPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER . '/zenpage/zenpage-template-functions.php');
                }
                break;
            case 'null': 
                return;
        }
        $this->feeditems = $this->getitems();
    }
    
    protected function hitcounter() {
        if (!zp_loggedin() && getOption('RSS_hitcounter')) {
            $rssuri = $this->getCacheFilename();
            $type = 'rsshitcounter';
            $checkitem = query_single_row("SELECT `data` FROM " . prefix('plugin_storage') . " WHERE `aux` = " . db_quote($rssuri) . " AND `type` = '" . $type . "'", true);
            if ($checkitem) {
                $hitcount = $checkitem['data'] + 1;
                query("UPDATE " . prefix('plugin_storage') . " SET `data` = " . $hitcount . " WHERE `aux` = " . db_quote($rssuri) . " AND `type` = '" . $type . "'", true);
            } else {
                query("INSERT INTO " . prefix('plugin_storage') . " (`type`,`aux`,`data`) VALUES ('" . $type . "'," . db_quote($rssuri) . ",1)", true);
            }
        }
    }
    
    
    static function generateToken($link) {
        return Zenphoto_Authority::passwordHash(serialize($link), '');
    }
    
    protected function getItemGallery($item) {
        if ($this->mode == "albums") {
            $albumobj = $item;
            $totalimages = $albumobj->getNumImages();
            $itemlink = $this->host . $albumobj->getLink();
            $thumb = $albumobj->getAlbumThumbImage();
            $thumburl = '<img border="0" src="' . PROTOCOL . '://' . $this->host . html_encode(pathurlencode($thumb->getCustomImage($this->imagesize, NULL, NULL, NULL, NULL, NULL, NULL, TRUE))) . '" alt="' . html_encode($albumobj->getTitle($this->locale)) . '" />';
            $title = $albumobj->getTitle($this->locale);
            if (true || $this->sortorder == "latestupdated") {
                $filechangedate = filectime(ALBUM_FOLDER_SERVERPATH . internalToFilesystem($albumobj->name));
                $latestimage = query_single_row("SELECT mtime FROM " . prefix('images') . " WHERE albumid = " . $albumobj->getID() . " AND `show` = 1 ORDER BY id DESC");
                if ($latestimage && $this->sortorder == 'latestupdated') {
                    $count = db_count('images', "WHERE albumid = " . $albumobj->getID() . " AND mtime = " . $latestimage['mtime']);
                } else {
                    $count = $totalimages;
                }
                if ($count != 0) {
                    $imagenumber = sprintf(ngettext('%s (%u image)', '%s (%u images)', $count), $title, $count);
                } else {
                    $imagenumber = $title;
                }
                $feeditem['desc'] = '<a title="' . $title . '" href="' . PROTOCOL . '://' . $itemlink . '">' . $thumburl . '</a>' .
                                '<p>' . html_encode($imagenumber) . '</p>' . $albumobj->getDesc($this->locale) . '<br />' . sprintf(gettext("Last update: %s"), zpFormattedDate(DATE_FORMAT, $filechangedate));
            } else {
                if ($totalimages != 0) {
                    $imagenumber = sprintf(ngettext('%s (%u image)', '%s (%u images)', $totalimages), $title, $totalimages);
                }
                $feeditem['desc'] = '<a title="' . html_encode($title) . '" href="' . PROTOCOL . '://' . $itemlink . '">' . $thumburl . '</a>' . $item->getDesc($this->locale) . '<br />' . sprintf(gettext("Date: %s"), zpFormattedDate(DATE_FORMAT, $item->get('mtime')));
            }
            $ext = getSuffix($thumb->localpath);
        } else {
            $ext = getSuffix($item->localpath);
            $albumobj = $item->getAlbum();
            $itemlink = $this->host . $item->getLink();
            $fullimagelink = $this->host . html_encode(pathurlencode($item->getFullImageURL()));
            $thumburl = '<img border="0" src="' . PROTOCOL . '://' . $this->host . html_encode(pathurlencode($item->getCustomImage($this->imagesize, NULL, NULL, NULL, NULL, NULL, NULL, TRUE))) . '" alt="' . $item->getTitle($this->locale) . '" /><br />';
            $title = $item->getTitle($this->locale);
            $albumtitle = $albumobj->getTitle($this->locale);
            $datecontent = '<br />Date: ' . zpFormattedDate(DATE_FORMAT, $item->get('mtime'));
            if ((($ext == "flv") || ($ext == "mp3") || ($ext == "mp4") || ($ext == "3gp") || ($ext == "mov")) AND $this->mode != "album") {
                $feeditem['desc'] = '<a title="' . html_encode($title) . ' in ' . html_encode($albumobj->getTitle($this->locale)) . '" href="' . PROTOCOL . '://' . $itemlink . '">' . $thumburl . '</a>' . $item->getDesc($this->locale) . $datecontent;
            } else {
                $feeditem['desc'] = '<a title="' . html_encode($title) . ' in ' . html_encode($albumobj->getTitle($this->locale)) . '" href="' . PROTOCOL . '://' . $itemlink . '"><img src="' . PROTOCOL . '://' . $this->host . html_encode(pathurlencode($item->getCustomImage($this->imagesize, NULL, NULL, NULL, NULL, NULL, NULL, TRUE))) . '" alt="' . html_encode($title) . '" /></a>' . $item->getDesc($this->locale) . $datecontent;
            }
        }
        if ($this->mode != "albums") {
            $feeditem['title'] = sprintf('%1$s (%2$s)', $item->getTitle($this->locale), $albumobj->getTitle($this->locale));
        } else {
            $feeditem['title'] = $imagenumber;
        }
        $feeditem['link'] = PROTOCOL . '://' . $itemlink;
        $feeditem['enclosure'] = '';
        if (getOption("RSS_enclosure") AND $this->mode != "albums") {
            $feeditem['enclosure'] = '<enclosure url="' . PROTOCOL . '://' . $fullimagelink . '" type="' . getMimeString($ext) . '" length="' . filesize($item->localpath) . '" />';
        }
        if ($this->mode != "albums") {
            $feeditem['category'] = html_encode($albumobj->getTitle($this->locale));
        } else {
            $feeditem['category'] = html_encode($albumobj->getTitle($this->locale));
        }
        $feeditem['media_content'] = '';
        $feeditem['media_thumbnail'] = '';
        if (getOption("RSS_mediarss") AND $this->mode != "albums") {
            $feeditem['media_content'] = '<media:content url="' . PROTOCOL . '://' . $fullimagelink . '" type="image/jpeg" />';
            $feeditem['media_thumbnail'] = '<media:thumbnail url="' . PROTOCOL . '://' . $fullimagelink . '" width="' . $this->imagesize . '"   height="' . $this->imagesize . '" />';
        }
        if ($this->mode != "albums") {
            $feeditem['pubdate'] = date("r", strtotime($item->getDateTime()));
        } else {
            $feeditem['pubdate'] = date("r", strtotime($albumobj->getDateTime()));
        }
        if ($this->mode == "albums") {
            return zp_apply_filter('feed_album', $feeditem, $item);
        } else {
            return zp_apply_filter('feed_image', $feeditem, $item);
        }
    }
    
    protected function getItemNews($item) {
        $categories = '';
        $feeditem['enclosure'] = '';
        $obj = new ZenpageNews($item['titlelink']);
        $title = $feeditem['title'] = get_language_string($obj->getTitle('all'), $this->locale);
        $link = $obj->getLink();
        $count2 = 0;
        $plaincategories = $obj->getCategories();
        $categories = '';
        foreach ($plaincategories as $cat) {
            $catobj = new ZenpageCategory($cat['titlelink']);
            $categories .= get_language_string($catobj->getTitle('all'), $this->locale) . ', ';
        }
        $categories = rtrim($categories, ', ');
        $feeditem['desc'] = shortenContent($obj->getContent($this->locale), getOption('RSS_truncate_length'), '...');
        if (!empty($categories)) {
            $feeditem['category'] = html_encode($categories);
            $feeditem['title'] = $title . ' (' . $categories . ')';
        }
        $feeditem['link'] = PROTOCOL . '://' . $this->host . $link;
        $feeditem['media_content'] = '';
        $feeditem['media_thumbnail'] = '';
        $feeditem['pubdate'] = date("r", strtotime($item['date']));
        return zp_apply_filter('feed_news', $feeditem, $obj);
    }
    
    public function printFeed() {
        global $_zp_gallery;
        $feeditems = $this->getitems();
        
        header('Content-Type: application/xml');
        $this->hitcounter();
        $this->startCache();
        echo '<?xml-stylesheet type="text/css" href="' . WEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER . '/rss/rss.css" ?>' . "\n";
        ?>
        <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
            <channel>
                <title><![CDATA[<?php echo $this->channel_title; ?>]]></title>
                <link><?php echo PROTOCOL . '://' . $this->host . WEBPATH; ?></link>
                <atom:link href="<?php echo PROTOCOL; ?>://<?php echo $this->host; ?><?php echo html_encode(getRequestURI()); ?>" rel="self"    type="application/rss+xml" />
                <description><![CDATA[<?php echo getBare($_zp_gallery->getDesc($this->locale)); ?>]]></description>
                <language><?php echo $this->locale_xml; ?></language>
                <pubDate><?php echo date("r", time()); ?></pubDate>
                <lastBuildDate><?php echo date("r", time()); ?></lastBuildDate>
                <docs>http:
                <generator>Zenphoto RSS Generator</generator>
                
                <?php
                if (is_array($feeditems) && !empty($feeditems)) {
                    foreach ($feeditems as $feeditem) {
                        switch ($this->feedtype) {
                            case 'gallery':
                                $item = $this->getItemGallery($feeditem);
                                break;
                            case 'news':
                                $item = $this->getItemNews($feeditem);
                                break;
                            case 'pages':
                                $item = $this->getitemPages($feeditem, getOption('RSS_truncate_length'));
                                break;
                            case 'comments':
                                $item = $this->getitemComments($feeditem);
                                break;
                            default:
                                $item = $feeditem;
                                break;
                        }
                        ?>
                        <item>
                            <title><![CDATA[<?php echo $item['title']; ?>]]></title>
                            <link><?php echo html_encode($item['link']); ?></link>
                            <description><![CDATA[<?php echo $item['desc']; ?>]]></description>
                            <?php
                            if (!empty($item['enclosure'])) {
                                echo $item['enclosure']; 
                            }
                            if (!empty($item['category'])) {
                                ?>
                                <category><![CDATA[<?php echo $item['category']; ?>]]></category>
                                <?php
                            }
                            if (!empty($item['media_content'])) {
                                echo $item['media_content']; 
                            }
                            if (!empty($item['media_thumbnail'])) {
                                echo $item['media_thumbnail']; 
                            }
                            ?>
                            <guid><?php echo html_encode($item['link']); ?></guid>
                            <pubDate><?php echo html_encode($item['pubdate']); ?></pubDate>
                        </item>
                        <?php
                    } 
                } else {
                    ?>
                    <item>
                        <title><![CDATA[<?php echo gettext('No items available.'); ?>]]></title>
                    </item>
                    <?php
                }
                ?>
            </channel>
        </rss>
        <?php
        $this->endCache();
    }
}
function executeRSS() {
    if (!$_GET['rss']) {
        $_GET['rss'] = 'gallery';
    }
    $_zp_gallery_page = 'rss.php';
    $rss = new RSS(sanitize($_GET));
    $rss->printFeed();
    exitZP();
}
if (!OFFSET_PATH && isset($_GET['rss'])) {
    zp_register_filter('load_theme_script', 'executeRSS', 9999);
}
?>