[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

title

Body

[close]

/wp-includes/ -> class-simplepie.php (source)

   1  <?php
   2  if ( ! class_exists( 'SimplePie' ) ) :
   3  /**
   4   * SimplePie
   5   *
   6   * A PHP-Based RSS and Atom Feed Framework.
   7   * Takes the hard work out of managing a complete RSS/Atom solution.
   8   *
   9   * Copyright (c) 2004-2011, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
  10   * All rights reserved.
  11   *
  12   * Redistribution and use in source and binary forms, with or without modification, are
  13   * permitted provided that the following conditions are met:
  14   *
  15   *     * Redistributions of source code must retain the above copyright notice, this list of
  16   *       conditions and the following disclaimer.
  17   *
  18   *     * Redistributions in binary form must reproduce the above copyright notice, this list
  19   *       of conditions and the following disclaimer in the documentation and/or other materials
  20   *       provided with the distribution.
  21   *
  22   *     * Neither the name of the SimplePie Team nor the names of its contributors may be used
  23   *       to endorse or promote products derived from this software without specific prior
  24   *       written permission.
  25   *
  26   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
  27   * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  28   * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
  29   * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  30   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  31   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  32   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  33   * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  34   * POSSIBILITY OF SUCH DAMAGE.
  35   *
  36   * @package SimplePie
  37   * @version 1.2.1
  38   * @copyright 2004-2011 Ryan Parman, Geoffrey Sneddon, Ryan McCue
  39   * @author Ryan Parman
  40   * @author Geoffrey Sneddon
  41   * @author Ryan McCue
  42   * @link http://simplepie.org/ SimplePie
  43   * @link http://simplepie.org/support/ Please submit all bug reports and feature requests to the SimplePie forums
  44   * @license http://www.opensource.org/licenses/bsd-license.php BSD License
  45   * @todo phpDoc comments
  46   */
  47  
  48  /**
  49   * SimplePie Name
  50   */
  51  define('SIMPLEPIE_NAME', 'SimplePie');
  52  
  53  /**
  54   * SimplePie Version
  55   */
  56  define('SIMPLEPIE_VERSION', '1.2.1');
  57  
  58  /**
  59   * SimplePie Build
  60   */
  61  define('SIMPLEPIE_BUILD', '20111015034325');
  62  
  63  /**
  64   * SimplePie Website URL
  65   */
  66  define('SIMPLEPIE_URL', 'http://simplepie.org');
  67  
  68  /**
  69   * SimplePie Useragent
  70   * @see SimplePie::set_useragent()
  71   */
  72  define('SIMPLEPIE_USERAGENT', SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION . ' (Feed Parser; ' . SIMPLEPIE_URL . '; Allow like Gecko) Build/' . SIMPLEPIE_BUILD);
  73  
  74  /**
  75   * SimplePie Linkback
  76   */
  77  define('SIMPLEPIE_LINKBACK', '<a href="' . SIMPLEPIE_URL . '" title="' . SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . '">' . SIMPLEPIE_NAME . '</a>');
  78  
  79  /**
  80   * No Autodiscovery
  81   * @see SimplePie::set_autodiscovery_level()
  82   */
  83  define('SIMPLEPIE_LOCATOR_NONE', 0);
  84  
  85  /**
  86   * Feed Link Element Autodiscovery
  87   * @see SimplePie::set_autodiscovery_level()
  88   */
  89  define('SIMPLEPIE_LOCATOR_AUTODISCOVERY', 1);
  90  
  91  /**
  92   * Local Feed Extension Autodiscovery
  93   * @see SimplePie::set_autodiscovery_level()
  94   */
  95  define('SIMPLEPIE_LOCATOR_LOCAL_EXTENSION', 2);
  96  
  97  /**
  98   * Local Feed Body Autodiscovery
  99   * @see SimplePie::set_autodiscovery_level()
 100   */
 101  define('SIMPLEPIE_LOCATOR_LOCAL_BODY', 4);
 102  
 103  /**
 104   * Remote Feed Extension Autodiscovery
 105   * @see SimplePie::set_autodiscovery_level()
 106   */
 107  define('SIMPLEPIE_LOCATOR_REMOTE_EXTENSION', 8);
 108  
 109  /**
 110   * Remote Feed Body Autodiscovery
 111   * @see SimplePie::set_autodiscovery_level()
 112   */
 113  define('SIMPLEPIE_LOCATOR_REMOTE_BODY', 16);
 114  
 115  /**
 116   * All Feed Autodiscovery
 117   * @see SimplePie::set_autodiscovery_level()
 118   */
 119  define('SIMPLEPIE_LOCATOR_ALL', 31);
 120  
 121  /**
 122   * No known feed type
 123   */
 124  define('SIMPLEPIE_TYPE_NONE', 0);
 125  
 126  /**
 127   * RSS 0.90
 128   */
 129  define('SIMPLEPIE_TYPE_RSS_090', 1);
 130  
 131  /**
 132   * RSS 0.91 (Netscape)
 133   */
 134  define('SIMPLEPIE_TYPE_RSS_091_NETSCAPE', 2);
 135  
 136  /**
 137   * RSS 0.91 (Userland)
 138   */
 139  define('SIMPLEPIE_TYPE_RSS_091_USERLAND', 4);
 140  
 141  /**
 142   * RSS 0.91 (both Netscape and Userland)
 143   */
 144  define('SIMPLEPIE_TYPE_RSS_091', 6);
 145  
 146  /**
 147   * RSS 0.92
 148   */
 149  define('SIMPLEPIE_TYPE_RSS_092', 8);
 150  
 151  /**
 152   * RSS 0.93
 153   */
 154  define('SIMPLEPIE_TYPE_RSS_093', 16);
 155  
 156  /**
 157   * RSS 0.94
 158   */
 159  define('SIMPLEPIE_TYPE_RSS_094', 32);
 160  
 161  /**
 162   * RSS 1.0
 163   */
 164  define('SIMPLEPIE_TYPE_RSS_10', 64);
 165  
 166  /**
 167   * RSS 2.0
 168   */
 169  define('SIMPLEPIE_TYPE_RSS_20', 128);
 170  
 171  /**
 172   * RDF-based RSS
 173   */
 174  define('SIMPLEPIE_TYPE_RSS_RDF', 65);
 175  
 176  /**
 177   * Non-RDF-based RSS (truly intended as syndication format)
 178   */
 179  define('SIMPLEPIE_TYPE_RSS_SYNDICATION', 190);
 180  
 181  /**
 182   * All RSS
 183   */
 184  define('SIMPLEPIE_TYPE_RSS_ALL', 255);
 185  
 186  /**
 187   * Atom 0.3
 188   */
 189  define('SIMPLEPIE_TYPE_ATOM_03', 256);
 190  
 191  /**
 192   * Atom 1.0
 193   */
 194  define('SIMPLEPIE_TYPE_ATOM_10', 512);
 195  
 196  /**
 197   * All Atom
 198   */
 199  define('SIMPLEPIE_TYPE_ATOM_ALL', 768);
 200  
 201  /**
 202   * All feed types
 203   */
 204  define('SIMPLEPIE_TYPE_ALL', 1023);
 205  
 206  /**
 207   * No construct
 208   */
 209  define('SIMPLEPIE_CONSTRUCT_NONE', 0);
 210  
 211  /**
 212   * Text construct
 213   */
 214  define('SIMPLEPIE_CONSTRUCT_TEXT', 1);
 215  
 216  /**
 217   * HTML construct
 218   */
 219  define('SIMPLEPIE_CONSTRUCT_HTML', 2);
 220  
 221  /**
 222   * XHTML construct
 223   */
 224  define('SIMPLEPIE_CONSTRUCT_XHTML', 4);
 225  
 226  /**
 227   * base64-encoded construct
 228   */
 229  define('SIMPLEPIE_CONSTRUCT_BASE64', 8);
 230  
 231  /**
 232   * IRI construct
 233   */
 234  define('SIMPLEPIE_CONSTRUCT_IRI', 16);
 235  
 236  /**
 237   * A construct that might be HTML
 238   */
 239  define('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32);
 240  
 241  /**
 242   * All constructs
 243   */
 244  define('SIMPLEPIE_CONSTRUCT_ALL', 63);
 245  
 246  /**
 247   * Don't change case
 248   */
 249  define('SIMPLEPIE_SAME_CASE', 1);
 250  
 251  /**
 252   * Change to lowercase
 253   */
 254  define('SIMPLEPIE_LOWERCASE', 2);
 255  
 256  /**
 257   * Change to uppercase
 258   */
 259  define('SIMPLEPIE_UPPERCASE', 4);
 260  
 261  /**
 262   * PCRE for HTML attributes
 263   */
 264  define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*');
 265  
 266  /**
 267   * PCRE for XML attributes
 268   */
 269  define('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*');
 270  
 271  /**
 272   * XML Namespace
 273   */
 274  define('SIMPLEPIE_NAMESPACE_XML', 'http://www.w3.org/XML/1998/namespace');
 275  
 276  /**
 277   * Atom 1.0 Namespace
 278   */
 279  define('SIMPLEPIE_NAMESPACE_ATOM_10', 'http://www.w3.org/2005/Atom');
 280  
 281  /**
 282   * Atom 0.3 Namespace
 283   */
 284  define('SIMPLEPIE_NAMESPACE_ATOM_03', 'http://purl.org/atom/ns#');
 285  
 286  /**
 287   * RDF Namespace
 288   */
 289  define('SIMPLEPIE_NAMESPACE_RDF', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
 290  
 291  /**
 292   * RSS 0.90 Namespace
 293   */
 294  define('SIMPLEPIE_NAMESPACE_RSS_090', 'http://my.netscape.com/rdf/simple/0.9/');
 295  
 296  /**
 297   * RSS 1.0 Namespace
 298   */
 299  define('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/');
 300  
 301  /**
 302   * RSS 1.0 Content Module Namespace
 303   */
 304  define('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/');
 305  
 306  /**
 307   * RSS 2.0 Namespace
 308   * (Stupid, I know, but I'm certain it will confuse people less with support.)
 309   */
 310  define('SIMPLEPIE_NAMESPACE_RSS_20', '');
 311  
 312  /**
 313   * DC 1.0 Namespace
 314   */
 315  define('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/');
 316  
 317  /**
 318   * DC 1.1 Namespace
 319   */
 320  define('SIMPLEPIE_NAMESPACE_DC_11', 'http://purl.org/dc/elements/1.1/');
 321  
 322  /**
 323   * W3C Basic Geo (WGS84 lat/long) Vocabulary Namespace
 324   */
 325  define('SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO', 'http://www.w3.org/2003/01/geo/wgs84_pos#');
 326  
 327  /**
 328   * GeoRSS Namespace
 329   */
 330  define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss');
 331  
 332  /**
 333   * Media RSS Namespace
 334   */
 335  define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/');
 336  
 337  /**
 338   * Wrong Media RSS Namespace
 339   */
 340  define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss');
 341  
 342  /**
 343   * iTunes RSS Namespace
 344   */
 345  define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd');
 346  
 347  /**
 348   * XHTML Namespace
 349   */
 350  define('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml');
 351  
 352  /**
 353   * IANA Link Relations Registry
 354   */
 355  define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/');
 356  
 357  /**
 358   * Whether we're running on PHP5
 359   */
 360  define('SIMPLEPIE_PHP5', version_compare(PHP_VERSION, '5.0.0', '>='));
 361  
 362  /**
 363   * No file source
 364   */
 365  define('SIMPLEPIE_FILE_SOURCE_NONE', 0);
 366  
 367  /**
 368   * Remote file source
 369   */
 370  define('SIMPLEPIE_FILE_SOURCE_REMOTE', 1);
 371  
 372  /**
 373   * Local file source
 374   */
 375  define('SIMPLEPIE_FILE_SOURCE_LOCAL', 2);
 376  
 377  /**
 378   * fsockopen() file source
 379   */
 380  define('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4);
 381  
 382  /**
 383   * cURL file source
 384   */
 385  define('SIMPLEPIE_FILE_SOURCE_CURL', 8);
 386  
 387  /**
 388   * file_get_contents() file source
 389   */
 390  define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16);
 391  
 392  /**
 393   * SimplePie
 394   *
 395   * @package SimplePie
 396   */
 397  class SimplePie
 398  {
 399      /**
 400       * @var array Raw data
 401       * @access private
 402       */
 403      var $data = array();
 404  
 405      /**
 406       * @var mixed Error string
 407       * @access private
 408       */
 409      var $error;
 410  
 411      /**
 412       * @var object Instance of SimplePie_Sanitize (or other class)
 413       * @see SimplePie::set_sanitize_class()
 414       * @access private
 415       */
 416      var $sanitize;
 417  
 418      /**
 419       * @var string SimplePie Useragent
 420       * @see SimplePie::set_useragent()
 421       * @access private
 422       */
 423      var $useragent = SIMPLEPIE_USERAGENT;
 424  
 425      /**
 426       * @var string Feed URL
 427       * @see SimplePie::set_feed_url()
 428       * @access private
 429       */
 430      var $feed_url;
 431  
 432      /**
 433       * @var object Instance of SimplePie_File to use as a feed
 434       * @see SimplePie::set_file()
 435       * @access private
 436       */
 437      var $file;
 438  
 439      /**
 440       * @var string Raw feed data
 441       * @see SimplePie::set_raw_data()
 442       * @access private
 443       */
 444      var $raw_data;
 445  
 446      /**
 447       * @var int Timeout for fetching remote files
 448       * @see SimplePie::set_timeout()
 449       * @access private
 450       */
 451      var $timeout = 10;
 452  
 453      /**
 454       * @var bool Forces fsockopen() to be used for remote files instead
 455       * of cURL, even if a new enough version is installed
 456       * @see SimplePie::force_fsockopen()
 457       * @access private
 458       */
 459      var $force_fsockopen = false;
 460  
 461      /**
 462       * @var bool Force the given data/URL to be treated as a feed no matter what
 463       * it appears like
 464       * @see SimplePie::force_feed()
 465       * @access private
 466       */
 467      var $force_feed = false;
 468  
 469      /**
 470       * @var bool Enable/Disable XML dump
 471       * @see SimplePie::enable_xml_dump()
 472       * @access private
 473       */
 474      var $xml_dump = false;
 475  
 476      /**
 477       * @var bool Enable/Disable Caching
 478       * @see SimplePie::enable_cache()
 479       * @access private
 480       */
 481      var $cache = true;
 482  
 483      /**
 484       * @var int Cache duration (in seconds)
 485       * @see SimplePie::set_cache_duration()
 486       * @access private
 487       */
 488      var $cache_duration = 3600;
 489  
 490      /**
 491       * @var int Auto-discovery cache duration (in seconds)
 492       * @see SimplePie::set_autodiscovery_cache_duration()
 493       * @access private
 494       */
 495      var $autodiscovery_cache_duration = 604800; // 7 Days.
 496  
 497      /**
 498       * @var string Cache location (relative to executing script)
 499       * @see SimplePie::set_cache_location()
 500       * @access private
 501       */
 502      var $cache_location = './cache';
 503  
 504      /**
 505       * @var string Function that creates the cache filename
 506       * @see SimplePie::set_cache_name_function()
 507       * @access private
 508       */
 509      var $cache_name_function = 'md5';
 510  
 511      /**
 512       * @var bool Reorder feed by date descending
 513       * @see SimplePie::enable_order_by_date()
 514       * @access private
 515       */
 516      var $order_by_date = true;
 517  
 518      /**
 519       * @var mixed Force input encoding to be set to the follow value
 520       * (false, or anything type-cast to false, disables this feature)
 521       * @see SimplePie::set_input_encoding()
 522       * @access private
 523       */
 524      var $input_encoding = false;
 525  
 526      /**
 527       * @var int Feed Autodiscovery Level
 528       * @see SimplePie::set_autodiscovery_level()
 529       * @access private
 530       */
 531      var $autodiscovery = SIMPLEPIE_LOCATOR_ALL;
 532  
 533      /**
 534       * @var string Class used for caching feeds
 535       * @see SimplePie::set_cache_class()
 536       * @access private
 537       */
 538      var $cache_class = 'SimplePie_Cache';
 539  
 540      /**
 541       * @var string Class used for locating feeds
 542       * @see SimplePie::set_locator_class()
 543       * @access private
 544       */
 545      var $locator_class = 'SimplePie_Locator';
 546  
 547      /**
 548       * @var string Class used for parsing feeds
 549       * @see SimplePie::set_parser_class()
 550       * @access private
 551       */
 552      var $parser_class = 'SimplePie_Parser';
 553  
 554      /**
 555       * @var string Class used for fetching feeds
 556       * @see SimplePie::set_file_class()
 557       * @access private
 558       */
 559      var $file_class = 'SimplePie_File';
 560  
 561      /**
 562       * @var string Class used for items
 563       * @see SimplePie::set_item_class()
 564       * @access private
 565       */
 566      var $item_class = 'SimplePie_Item';
 567  
 568      /**
 569       * @var string Class used for authors
 570       * @see SimplePie::set_author_class()
 571       * @access private
 572       */
 573      var $author_class = 'SimplePie_Author';
 574  
 575      /**
 576       * @var string Class used for categories
 577       * @see SimplePie::set_category_class()
 578       * @access private
 579       */
 580      var $category_class = 'SimplePie_Category';
 581  
 582      /**
 583       * @var string Class used for enclosures
 584       * @see SimplePie::set_enclosures_class()
 585       * @access private
 586       */
 587      var $enclosure_class = 'SimplePie_Enclosure';
 588  
 589      /**
 590       * @var string Class used for Media RSS <media:text> captions
 591       * @see SimplePie::set_caption_class()
 592       * @access private
 593       */
 594      var $caption_class = 'SimplePie_Caption';
 595  
 596      /**
 597       * @var string Class used for Media RSS <media:copyright>
 598       * @see SimplePie::set_copyright_class()
 599       * @access private
 600       */
 601      var $copyright_class = 'SimplePie_Copyright';
 602  
 603      /**
 604       * @var string Class used for Media RSS <media:credit>
 605       * @see SimplePie::set_credit_class()
 606       * @access private
 607       */
 608      var $credit_class = 'SimplePie_Credit';
 609  
 610      /**
 611       * @var string Class used for Media RSS <media:rating>
 612       * @see SimplePie::set_rating_class()
 613       * @access private
 614       */
 615      var $rating_class = 'SimplePie_Rating';
 616  
 617      /**
 618       * @var string Class used for Media RSS <media:restriction>
 619       * @see SimplePie::set_restriction_class()
 620       * @access private
 621       */
 622      var $restriction_class = 'SimplePie_Restriction';
 623  
 624      /**
 625       * @var string Class used for content-type sniffing
 626       * @see SimplePie::set_content_type_sniffer_class()
 627       * @access private
 628       */
 629      var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer';
 630  
 631      /**
 632       * @var string Class used for item sources.
 633       * @see SimplePie::set_source_class()
 634       * @access private
 635       */
 636      var $source_class = 'SimplePie_Source';
 637  
 638      /**
 639       * @var mixed Set javascript query string parameter (false, or
 640       * anything type-cast to false, disables this feature)
 641       * @see SimplePie::set_javascript()
 642       * @access private
 643       */
 644      var $javascript = 'js';
 645  
 646      /**
 647       * @var int Maximum number of feeds to check with autodiscovery
 648       * @see SimplePie::set_max_checked_feeds()
 649       * @access private
 650       */
 651      var $max_checked_feeds = 10;
 652  
 653      /**
 654       * @var array All the feeds found during the autodiscovery process
 655       * @see SimplePie::get_all_discovered_feeds()
 656       * @access private
 657       */
 658      var $all_discovered_feeds = array();
 659  
 660      /**
 661       * @var string Web-accessible path to the handler_favicon.php file.
 662       * @see SimplePie::set_favicon_handler()
 663       * @access private
 664       */
 665      var $favicon_handler = '';
 666  
 667      /**
 668       * @var string Web-accessible path to the handler_image.php file.
 669       * @see SimplePie::set_image_handler()
 670       * @access private
 671       */
 672      var $image_handler = '';
 673  
 674      /**
 675       * @var array Stores the URLs when multiple feeds are being initialized.
 676       * @see SimplePie::set_feed_url()
 677       * @access private
 678       */
 679      var $multifeed_url = array();
 680  
 681      /**
 682       * @var array Stores SimplePie objects when multiple feeds initialized.
 683       * @access private
 684       */
 685      var $multifeed_objects = array();
 686  
 687      /**
 688       * @var array Stores the get_object_vars() array for use with multifeeds.
 689       * @see SimplePie::set_feed_url()
 690       * @access private
 691       */
 692      var $config_settings = null;
 693  
 694      /**
 695       * @var integer Stores the number of items to return per-feed with multifeeds.
 696       * @see SimplePie::set_item_limit()
 697       * @access private
 698       */
 699      var $item_limit = 0;
 700  
 701      /**
 702       * @var array Stores the default attributes to be stripped by strip_attributes().
 703       * @see SimplePie::strip_attributes()
 704       * @access private
 705       */
 706      var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
 707  
 708      /**
 709       * @var array Stores the default tags to be stripped by strip_htmltags().
 710       * @see SimplePie::strip_htmltags()
 711       * @access private
 712       */
 713      var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
 714  
 715      /**
 716       * The SimplePie class contains feed level data and options
 717       *
 718       * There are two ways that you can create a new SimplePie object. The first
 719       * is by passing a feed URL as a parameter to the SimplePie constructor
 720       * (as well as optionally setting the cache location and cache expiry). This
 721       * will initialise the whole feed with all of the default settings, and you
 722       * can begin accessing methods and properties immediately.
 723       *
 724       * The second way is to create the SimplePie object with no parameters
 725       * at all. This will enable you to set configuration options. After setting
 726       * them, you must initialise the feed using $feed->init(). At that point the
 727       * object's methods and properties will be available to you. This format is
 728       * what is used throughout this documentation.
 729       *
 730       * @access public
 731       * @since 1.0 Preview Release
 732       * @param string $feed_url This is the URL you want to parse.
 733       * @param string $cache_location This is where you want the cache to be stored.
 734       * @param int $cache_duration This is the number of seconds that you want to store the cache file for.
 735       */
 736  	function SimplePie($feed_url = null, $cache_location = null, $cache_duration = null)
 737      {
 738          // Other objects, instances created here so we can set options on them
 739          $this->sanitize =& new SimplePie_Sanitize;
 740  
 741          // Set options if they're passed to the constructor
 742          if ($cache_location !== null)
 743          {
 744              $this->set_cache_location($cache_location);
 745          }
 746  
 747          if ($cache_duration !== null)
 748          {
 749              $this->set_cache_duration($cache_duration);
 750          }
 751  
 752          // Only init the script if we're passed a feed URL
 753          if ($feed_url !== null)
 754          {
 755              $this->set_feed_url($feed_url);
 756              $this->init();
 757          }
 758      }
 759  
 760      /**
 761       * Used for converting object to a string
 762       */
 763  	function __toString()
 764      {
 765          return md5(serialize($this->data));
 766      }
 767  
 768      /**
 769       * Remove items that link back to this before destroying this object
 770       */
 771  	function __destruct()
 772      {
 773          if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
 774          {
 775              if (!empty($this->data['items']))
 776              {
 777                  foreach ($this->data['items'] as $item)
 778                  {
 779                      $item->__destruct();
 780                  }
 781                  unset($item, $this->data['items']);
 782              }
 783              if (!empty($this->data['ordered_items']))
 784              {
 785                  foreach ($this->data['ordered_items'] as $item)
 786                  {
 787                      $item->__destruct();
 788                  }
 789                  unset($item, $this->data['ordered_items']);
 790              }
 791          }
 792      }
 793  
 794      /**
 795       * Force the given data/URL to be treated as a feed no matter what it
 796       * appears like
 797       *
 798       * @access public
 799       * @since 1.1
 800       * @param bool $enable Force the given data/URL to be treated as a feed
 801       */
 802  	function force_feed($enable = false)
 803      {
 804          $this->force_feed = (bool) $enable;
 805      }
 806  
 807      /**
 808       * This is the URL of the feed you want to parse.
 809       *
 810       * This allows you to enter the URL of the feed you want to parse, or the
 811       * website you want to try to use auto-discovery on. This takes priority
 812       * over any set raw data.
 813       *
 814       * You can set multiple feeds to mash together by passing an array instead
 815       * of a string for the $url. Remember that with each additional feed comes
 816       * additional processing and resources.
 817       *
 818       * @access public
 819       * @since 1.0 Preview Release
 820       * @param mixed $url This is the URL (or array of URLs) that you want to parse.
 821       * @see SimplePie::set_raw_data()
 822       */
 823  	function set_feed_url($url)
 824      {
 825          if (is_array($url))
 826          {
 827              $this->multifeed_url = array();
 828              foreach ($url as $value)
 829              {
 830                  $this->multifeed_url[] = SimplePie_Misc::fix_protocol($value, 1);
 831              }
 832          }
 833          else
 834          {
 835              $this->feed_url = SimplePie_Misc::fix_protocol($url, 1);
 836          }
 837      }
 838  
 839      /**
 840       * Provides an instance of SimplePie_File to use as a feed
 841       *
 842       * @access public
 843       * @param object &$file Instance of SimplePie_File (or subclass)
 844       * @return bool True on success, false on failure
 845       */
 846  	function set_file(&$file)
 847      {
 848          if (is_a($file, 'SimplePie_File'))
 849          {
 850              $this->feed_url = $file->url;
 851              $this->file =& $file;
 852              return true;
 853          }
 854          return false;
 855      }
 856  
 857      /**
 858       * Allows you to use a string of RSS/Atom data instead of a remote feed.
 859       *
 860       * If you have a feed available as a string in PHP, you can tell SimplePie
 861       * to parse that data string instead of a remote feed. Any set feed URL
 862       * takes precedence.
 863       *
 864       * @access public
 865       * @since 1.0 Beta 3
 866       * @param string $data RSS or Atom data as a string.
 867       * @see SimplePie::set_feed_url()
 868       */
 869  	function set_raw_data($data)
 870      {
 871          $this->raw_data = $data;
 872      }
 873  
 874      /**
 875       * Allows you to override the default timeout for fetching remote feeds.
 876       *
 877       * This allows you to change the maximum time the feed's server to respond
 878       * and send the feed back.
 879       *
 880       * @access public
 881       * @since 1.0 Beta 3
 882       * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed.
 883       */
 884  	function set_timeout($timeout = 10)
 885      {
 886          $this->timeout = (int) $timeout;
 887      }
 888  
 889      /**
 890       * Forces SimplePie to use fsockopen() instead of the preferred cURL
 891       * functions.
 892       *
 893       * @access public
 894       * @since 1.0 Beta 3
 895       * @param bool $enable Force fsockopen() to be used
 896       */
 897  	function force_fsockopen($enable = false)
 898      {
 899          $this->force_fsockopen = (bool) $enable;
 900      }
 901  
 902      /**
 903       * Outputs the raw XML content of the feed, after it has gone through
 904       * SimplePie's filters.
 905       *
 906       * Used only for debugging, this function will output the XML content as
 907       * text/xml. When SimplePie reads in a feed, it does a bit of cleaning up
 908       * before trying to parse it. Many parts of the feed are re-written in
 909       * memory, and in the end, you have a parsable feed. XML dump shows you the
 910       * actual XML that SimplePie tries to parse, which may or may not be very
 911       * different from the original feed.
 912       *
 913       * @access public
 914       * @since 1.0 Preview Release
 915       * @param bool $enable Enable XML dump
 916       */
 917  	function enable_xml_dump($enable = false)
 918      {
 919          $this->xml_dump = (bool) $enable;
 920      }
 921  
 922      /**
 923       * Enables/disables caching in SimplePie.
 924       *
 925       * This option allows you to disable caching all-together in SimplePie.
 926       * However, disabling the cache can lead to longer load times.
 927       *
 928       * @access public
 929       * @since 1.0 Preview Release
 930       * @param bool $enable Enable caching
 931       */
 932  	function enable_cache($enable = true)
 933      {
 934          $this->cache = (bool) $enable;
 935      }
 936  
 937      /**
 938       * Set the length of time (in seconds) that the contents of a feed
 939       * will be cached.
 940       *
 941       * @access public
 942       * @param int $seconds The feed content cache duration.
 943       */
 944  	function set_cache_duration($seconds = 3600)
 945      {
 946          $this->cache_duration = (int) $seconds;
 947      }
 948  
 949      /**
 950       * Set the length of time (in seconds) that the autodiscovered feed
 951       * URL will be cached.
 952       *
 953       * @access public
 954       * @param int $seconds The autodiscovered feed URL cache duration.
 955       */
 956  	function set_autodiscovery_cache_duration($seconds = 604800)
 957      {
 958          $this->autodiscovery_cache_duration = (int) $seconds;
 959      }
 960  
 961      /**
 962       * Set the file system location where the cached files should be stored.
 963       *
 964       * @access public
 965       * @param string $location The file system location.
 966       */
 967  	function set_cache_location($location = './cache')
 968      {
 969          $this->cache_location = (string) $location;
 970      }
 971  
 972      /**
 973       * Determines whether feed items should be sorted into reverse chronological order.
 974       *
 975       * @access public
 976       * @param bool $enable Sort as reverse chronological order.
 977       */
 978  	function enable_order_by_date($enable = true)
 979      {
 980          $this->order_by_date = (bool) $enable;
 981      }
 982  
 983      /**
 984       * Allows you to override the character encoding reported by the feed.
 985       *
 986       * @access public
 987       * @param string $encoding Character encoding.
 988       */
 989  	function set_input_encoding($encoding = false)
 990      {
 991          if ($encoding)
 992          {
 993              $this->input_encoding = (string) $encoding;
 994          }
 995          else
 996          {
 997              $this->input_encoding = false;
 998          }
 999      }
1000  
1001      /**
1002       * Set how much feed autodiscovery to do
1003       *
1004       * @access public
1005       * @see SIMPLEPIE_LOCATOR_NONE
1006       * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY
1007       * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION
1008       * @see SIMPLEPIE_LOCATOR_LOCAL_BODY
1009       * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION
1010       * @see SIMPLEPIE_LOCATOR_REMOTE_BODY
1011       * @see SIMPLEPIE_LOCATOR_ALL
1012       * @param int $level Feed Autodiscovery Level (level can be a
1013       * combination of the above constants, see bitwise OR operator)
1014       */
1015  	function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL)
1016      {
1017          $this->autodiscovery = (int) $level;
1018      }
1019  
1020      /**
1021       * Allows you to change which class SimplePie uses for caching.
1022       * Useful when you are overloading or extending SimplePie's default classes.
1023       *
1024       * @access public
1025       * @param string $class Name of custom class.
1026       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1027       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1028       */
1029  	function set_cache_class($class = 'SimplePie_Cache')
1030      {
1031          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Cache'))
1032          {
1033              $this->cache_class = $class;
1034              return true;
1035          }
1036          return false;
1037      }
1038  
1039      /**
1040       * Allows you to change which class SimplePie uses for auto-discovery.
1041       * Useful when you are overloading or extending SimplePie's default classes.
1042       *
1043       * @access public
1044       * @param string $class Name of custom class.
1045       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1046       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1047       */
1048  	function set_locator_class($class = 'SimplePie_Locator')
1049      {
1050          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Locator'))
1051          {
1052              $this->locator_class = $class;
1053              return true;
1054          }
1055          return false;
1056      }
1057  
1058      /**
1059       * Allows you to change which class SimplePie uses for XML parsing.
1060       * Useful when you are overloading or extending SimplePie's default classes.
1061       *
1062       * @access public
1063       * @param string $class Name of custom class.
1064       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1065       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1066       */
1067  	function set_parser_class($class = 'SimplePie_Parser')
1068      {
1069          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Parser'))
1070          {
1071              $this->parser_class = $class;
1072              return true;
1073          }
1074          return false;
1075      }
1076  
1077      /**
1078       * Allows you to change which class SimplePie uses for remote file fetching.
1079       * Useful when you are overloading or extending SimplePie's default classes.
1080       *
1081       * @access public
1082       * @param string $class Name of custom class.
1083       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1084       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1085       */
1086  	function set_file_class($class = 'SimplePie_File')
1087      {
1088          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_File'))
1089          {
1090              $this->file_class = $class;
1091              return true;
1092          }
1093          return false;
1094      }
1095  
1096      /**
1097       * Allows you to change which class SimplePie uses for data sanitization.
1098       * Useful when you are overloading or extending SimplePie's default classes.
1099       *
1100       * @access public
1101       * @param string $class Name of custom class.
1102       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1103       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1104       */
1105  	function set_sanitize_class($class = 'SimplePie_Sanitize')
1106      {
1107          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Sanitize'))
1108          {
1109              $this->sanitize =& new $class;
1110              return true;
1111          }
1112          return false;
1113      }
1114  
1115      /**
1116       * Allows you to change which class SimplePie uses for handling feed items.
1117       * Useful when you are overloading or extending SimplePie's default classes.
1118       *
1119       * @access public
1120       * @param string $class Name of custom class.
1121       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1122       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1123       */
1124  	function set_item_class($class = 'SimplePie_Item')
1125      {
1126          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Item'))
1127          {
1128              $this->item_class = $class;
1129              return true;
1130          }
1131          return false;
1132      }
1133  
1134      /**
1135       * Allows you to change which class SimplePie uses for handling author data.
1136       * Useful when you are overloading or extending SimplePie's default classes.
1137       *
1138       * @access public
1139       * @param string $class Name of custom class.
1140       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1141       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1142       */
1143  	function set_author_class($class = 'SimplePie_Author')
1144      {
1145          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Author'))
1146          {
1147              $this->author_class = $class;
1148              return true;
1149          }
1150          return false;
1151      }
1152  
1153      /**
1154       * Allows you to change which class SimplePie uses for handling category data.
1155       * Useful when you are overloading or extending SimplePie's default classes.
1156       *
1157       * @access public
1158       * @param string $class Name of custom class.
1159       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1160       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1161       */
1162  	function set_category_class($class = 'SimplePie_Category')
1163      {
1164          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Category'))
1165          {
1166              $this->category_class = $class;
1167              return true;
1168          }
1169          return false;
1170      }
1171  
1172      /**
1173       * Allows you to change which class SimplePie uses for feed enclosures.
1174       * Useful when you are overloading or extending SimplePie's default classes.
1175       *
1176       * @access public
1177       * @param string $class Name of custom class.
1178       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1179       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1180       */
1181  	function set_enclosure_class($class = 'SimplePie_Enclosure')
1182      {
1183          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Enclosure'))
1184          {
1185              $this->enclosure_class = $class;
1186              return true;
1187          }
1188          return false;
1189      }
1190  
1191      /**
1192       * Allows you to change which class SimplePie uses for <media:text> captions
1193       * Useful when you are overloading or extending SimplePie's default classes.
1194       *
1195       * @access public
1196       * @param string $class Name of custom class.
1197       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1198       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1199       */
1200  	function set_caption_class($class = 'SimplePie_Caption')
1201      {
1202          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Caption'))
1203          {
1204              $this->caption_class = $class;
1205              return true;
1206          }
1207          return false;
1208      }
1209  
1210      /**
1211       * Allows you to change which class SimplePie uses for <media:copyright>
1212       * Useful when you are overloading or extending SimplePie's default classes.
1213       *
1214       * @access public
1215       * @param string $class Name of custom class.
1216       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1217       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1218       */
1219  	function set_copyright_class($class = 'SimplePie_Copyright')
1220      {
1221          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Copyright'))
1222          {
1223              $this->copyright_class = $class;
1224              return true;
1225          }
1226          return false;
1227      }
1228  
1229      /**
1230       * Allows you to change which class SimplePie uses for <media:credit>
1231       * Useful when you are overloading or extending SimplePie's default classes.
1232       *
1233       * @access public
1234       * @param string $class Name of custom class.
1235       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1236       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1237       */
1238  	function set_credit_class($class = 'SimplePie_Credit')
1239      {
1240          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Credit'))
1241          {
1242              $this->credit_class = $class;
1243              return true;
1244          }
1245          return false;
1246      }
1247  
1248      /**
1249       * Allows you to change which class SimplePie uses for <media:rating>
1250       * Useful when you are overloading or extending SimplePie's default classes.
1251       *
1252       * @access public
1253       * @param string $class Name of custom class.
1254       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1255       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1256       */
1257  	function set_rating_class($class = 'SimplePie_Rating')
1258      {
1259          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Rating'))
1260          {
1261              $this->rating_class = $class;
1262              return true;
1263          }
1264          return false;
1265      }
1266  
1267      /**
1268       * Allows you to change which class SimplePie uses for <media:restriction>
1269       * Useful when you are overloading or extending SimplePie's default classes.
1270       *
1271       * @access public
1272       * @param string $class Name of custom class.
1273       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1274       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1275       */
1276  	function set_restriction_class($class = 'SimplePie_Restriction')
1277      {
1278          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Restriction'))
1279          {
1280              $this->restriction_class = $class;
1281              return true;
1282          }
1283          return false;
1284      }
1285  
1286      /**
1287       * Allows you to change which class SimplePie uses for content-type sniffing.
1288       * Useful when you are overloading or extending SimplePie's default classes.
1289       *
1290       * @access public
1291       * @param string $class Name of custom class.
1292       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1293       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1294       */
1295  	function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer')
1296      {
1297          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Content_Type_Sniffer'))
1298          {
1299              $this->content_type_sniffer_class = $class;
1300              return true;
1301          }
1302          return false;
1303      }
1304  
1305      /**
1306       * Allows you to change which class SimplePie uses item sources.
1307       * Useful when you are overloading or extending SimplePie's default classes.
1308       *
1309       * @access public
1310       * @param string $class Name of custom class.
1311       * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
1312       * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
1313       */
1314  	function set_source_class($class = 'SimplePie_Source')
1315      {
1316          if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Source'))
1317          {
1318              $this->source_class = $class;
1319              return true;
1320          }
1321          return false;
1322      }
1323  
1324      /**
1325       * Allows you to override the default user agent string.
1326       *
1327       * @access public
1328       * @param string $ua New user agent string.
1329       */
1330  	function set_useragent($ua = SIMPLEPIE_USERAGENT)
1331      {
1332          $this->useragent = (string) $ua;
1333      }
1334  
1335      /**
1336       * Set callback function to create cache filename with
1337       *
1338       * @access public
1339       * @param mixed $function Callback function
1340       */
1341  	function set_cache_name_function($function = 'md5')
1342      {
1343          if (is_callable($function))
1344          {
1345              $this->cache_name_function = $function;
1346          }
1347      }
1348  
1349      /**
1350       * Set javascript query string parameter
1351       *
1352       * @access public
1353       * @param mixed $get Javascript query string parameter
1354       */
1355  	function set_javascript($get = 'js')
1356      {
1357          if ($get)
1358          {
1359              $this->javascript = (string) $get;
1360          }
1361          else
1362          {
1363              $this->javascript = false;
1364          }
1365      }
1366  
1367      /**
1368       * Set options to make SP as fast as possible.  Forgoes a
1369       * substantial amount of data sanitization in favor of speed.
1370       *
1371       * @access public
1372       * @param bool $set Whether to set them or not
1373       */
1374  	function set_stupidly_fast($set = false)
1375      {
1376          if ($set)
1377          {
1378              $this->enable_order_by_date(false);
1379              $this->remove_div(false);
1380              $this->strip_comments(false);
1381              $this->strip_htmltags(false);
1382              $this->strip_attributes(false);
1383              $this->set_image_handler(false);
1384          }
1385      }
1386  
1387      /**
1388       * Set maximum number of feeds to check with autodiscovery
1389       *
1390       * @access public
1391       * @param int $max Maximum number of feeds to check
1392       */
1393  	function set_max_checked_feeds($max = 10)
1394      {
1395          $this->max_checked_feeds = (int) $max;
1396      }
1397  
1398  	function remove_div($enable = true)
1399      {
1400          $this->sanitize->remove_div($enable);
1401      }
1402  
1403  	function strip_htmltags($tags = '', $encode = null)
1404      {
1405          if ($tags === '')
1406          {
1407              $tags = $this->strip_htmltags;
1408          }
1409          $this->sanitize->strip_htmltags($tags);
1410          if ($encode !== null)
1411          {
1412              $this->sanitize->encode_instead_of_strip($tags);
1413          }
1414      }
1415  
1416  	function encode_instead_of_strip($enable = true)
1417      {
1418          $this->sanitize->encode_instead_of_strip($enable);
1419      }
1420  
1421  	function strip_attributes($attribs = '')
1422      {
1423          if ($attribs === '')
1424          {
1425              $attribs = $this->strip_attributes;
1426          }
1427          $this->sanitize->strip_attributes($attribs);
1428      }
1429  
1430  	function set_output_encoding($encoding = 'UTF-8')
1431      {
1432          $this->sanitize->set_output_encoding($encoding);
1433      }
1434  
1435  	function strip_comments($strip = false)
1436      {
1437          $this->sanitize->strip_comments($strip);
1438      }
1439  
1440      /**
1441       * Set element/attribute key/value pairs of HTML attributes
1442       * containing URLs that need to be resolved relative to the feed
1443       *
1444       * @access public
1445       * @since 1.0
1446       * @param array $element_attribute Element/attribute key/value pairs
1447       */
1448  	function set_url_replacements($element_attribute = array('a' => 'href', 'area' => 'href', 'blockquote' => 'cite', 'del' => 'cite', 'form' => 'action', 'img' => array('longdesc', 'src'), 'input' => 'src', 'ins' => 'cite', 'q' => 'cite'))
1449      {
1450          $this->sanitize->set_url_replacements($element_attribute);
1451      }
1452  
1453      /**
1454       * Set the handler to enable the display of cached favicons.
1455       *
1456       * @access public
1457       * @param str $page Web-accessible path to the handler_favicon.php file.
1458       * @param str $qs The query string that the value should be passed to.
1459       */
1460  	function set_favicon_handler($page = false, $qs = 'i')
1461      {
1462          if ($page !== false)
1463          {
1464              $this->favicon_handler = $page . '?' . $qs . '=';
1465          }
1466          else
1467          {
1468              $this->favicon_handler = '';
1469          }
1470      }
1471  
1472      /**
1473       * Set the handler to enable the display of cached images.
1474       *
1475       * @access public
1476       * @param str $page Web-accessible path to the handler_image.php file.
1477       * @param str $qs The query string that the value should be passed to.
1478       */
1479  	function set_image_handler($page = false, $qs = 'i')
1480      {
1481          if ($page !== false)
1482          {
1483              $this->sanitize->set_image_handler($page . '?' . $qs . '=');
1484          }
1485          else
1486          {
1487              $this->image_handler = '';
1488          }
1489      }
1490  
1491      /**
1492       * Set the limit for items returned per-feed with multifeeds.
1493       *
1494       * @access public
1495       * @param integer $limit The maximum number of items to return.
1496       */
1497  	function set_item_limit($limit = 0)
1498      {
1499          $this->item_limit = (int) $limit;
1500      }
1501  
1502  	function init()
1503      {
1504          // Check absolute bare minimum requirements.
1505          if ((function_exists('version_compare') && version_compare(PHP_VERSION, '4.3.0', '<')) || !extension_loaded('xml') || !extension_loaded('pcre'))
1506          {
1507              return false;
1508          }
1509          // Then check the xml extension is sane (i.e., libxml 2.7.x issue on PHP < 5.2.9 and libxml 2.7.0 to 2.7.2 on any version) if we don't have xmlreader.
1510          elseif (!extension_loaded('xmlreader'))
1511          {
1512              static $xml_is_sane = null;
1513              if ($xml_is_sane === null)
1514              {
1515                  $parser_check = xml_parser_create();
1516                  xml_parse_into_struct($parser_check, '<foo>&amp;</foo>', $values);
1517                  xml_parser_free($parser_check);
1518                  $xml_is_sane = isset($values[0]['value']);
1519              }
1520              if (!$xml_is_sane)
1521              {
1522                  return false;
1523              }
1524          }
1525  
1526          if (isset($_GET[$this->javascript]))
1527          {
1528              SimplePie_Misc::output_javascript();
1529              exit;
1530          }
1531  
1532          // Pass whatever was set with config options over to the sanitizer.
1533          $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->cache_class);
1534          $this->sanitize->pass_file_data($this->file_class, $this->timeout, $this->useragent, $this->force_fsockopen);
1535  
1536          if ($this->feed_url !== null || $this->raw_data !== null)
1537          {
1538              $this->data = array();
1539              $this->multifeed_objects = array();
1540              $cache = false;
1541  
1542              if ($this->feed_url !== null)
1543              {
1544                  $parsed_feed_url = SimplePie_Misc::parse_url($this->feed_url);
1545                  // Decide whether to enable caching
1546                  if ($this->cache && $parsed_feed_url['scheme'] !== '')
1547                  {
1548                      $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc');
1549                  }
1550                  // If it's enabled and we don't want an XML dump, use the cache
1551                  if ($cache && !$this->xml_dump)
1552                  {
1553                      // Load the Cache
1554                      $this->data = $cache->load();
1555                      if (!empty($this->data))
1556                      {
1557                          // If the cache is for an outdated build of SimplePie
1558                          if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD)
1559                          {
1560                              $cache->unlink();
1561                              $this->data = array();
1562                          }
1563                          // If we've hit a collision just rerun it with caching disabled
1564                          elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url)
1565                          {
1566                              $cache = false;
1567                              $this->data = array();
1568                          }
1569                          // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL.
1570                          elseif (isset($this->data['feed_url']))
1571                          {
1572                              // If the autodiscovery cache is still valid use it.
1573                              if ($cache->mtime() + $this->autodiscovery_cache_duration > time())
1574                              {
1575                                  // Do not need to do feed autodiscovery yet.
1576                                  if ($this->data['feed_url'] === $this->data['url'])
1577                                  {
1578                                      $cache->unlink();
1579                                      $this->data = array();
1580                                  }
1581                                  else
1582                                  {
1583                                      $this->set_feed_url($this->data['feed_url']);
1584                                      return $this->init();
1585                                  }
1586                              }
1587                          }
1588                          // Check if the cache has been updated
1589                          elseif ($cache->mtime() + $this->cache_duration < time())
1590                          {
1591                              // If we have last-modified and/or etag set
1592                              if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag']))
1593                              {
1594                                  $headers = array();
1595                                  if (isset($this->data['headers']['last-modified']))
1596                                  {
1597                                      $headers['if-modified-since'] = $this->data['headers']['last-modified'];
1598                                  }
1599                                  if (isset($this->data['headers']['etag']))
1600                                  {
1601                                      $headers['if-none-match'] = '"' . $this->data['headers']['etag'] . '"';
1602                                  }
1603                                  $file =& new $this->file_class($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen);
1604                                  if ($file->success)
1605                                  {
1606                                      if ($file->status_code === 304)
1607                                      {
1608                                          $cache->touch();
1609                                          return true;
1610                                      }
1611                                      else
1612                                      {
1613                                          $headers = $file->headers;
1614                                      }
1615                                  }
1616                                  else
1617                                  {
1618                                      unset($file);
1619                                  }
1620                              }
1621                          }
1622                          // If the cache is still valid, just return true
1623                          else
1624                          {
1625                              return true;
1626                          }
1627                      }
1628                      // If the cache is empty, delete it
1629                      else
1630                      {
1631                          $cache->unlink();
1632                          $this->data = array();
1633                      }
1634                  }
1635                  // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it.
1636                  if (!isset($file))
1637                  {
1638                      if (is_a($this->file, 'SimplePie_File') && $this->file->url === $this->feed_url)
1639                      {
1640                          $file =& $this->file;
1641                      }
1642                      else
1643                      {
1644                          $file =& new $this->file_class($this->feed_url, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen);
1645                      }
1646                  }
1647                  // If the file connection has an error, set SimplePie::error to that and quit
1648                  if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
1649                  {
1650                      $this->error = $file->error;
1651                      if (!empty($this->data))
1652                      {
1653                          return true;
1654                      }
1655                      else
1656                      {
1657                          return false;
1658                      }
1659                  }
1660  
1661                  if (!$this->force_feed)
1662                  {
1663                      // Check if the supplied URL is a feed, if it isn't, look for it.
1664                      $locate =& new $this->locator_class($file, $this->timeout, $this->useragent, $this->file_class, $this->max_checked_feeds, $this->content_type_sniffer_class);
1665                      if (!$locate->is_feed($file))
1666                      {
1667                          // We need to unset this so that if SimplePie::set_file() has been called that object is untouched
1668                          unset($file);
1669                          if ($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds))
1670                          {
1671                              if ($cache)
1672                              {
1673                                  $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
1674                                  if (!$cache->save($this))
1675                                  {
1676                                      trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
1677                                  }
1678                                  $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc');
1679                              }
1680                              $this->feed_url = $file->url;
1681                          }
1682                          else
1683                          {
1684                              $this->error = "A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or " . SIMPLEPIE_NAME . " was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed.";
1685                              SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
1686                              return false;
1687                          }
1688                      }
1689                      $locate = null;
1690                  }
1691  
1692                  $headers = $file->headers;
1693                  $data = $file->body;
1694                  $sniffer =& new $this->content_type_sniffer_class($file);
1695                  $sniffed = $sniffer->get_type();
1696              }
1697              else
1698              {
1699                  $data = $this->raw_data;
1700              }
1701  
1702              // Set up array of possible encodings
1703              $encodings = array();
1704  
1705              // First check to see if input has been overridden.
1706              if ($this->input_encoding !== false)
1707              {
1708                  $encodings[] = $this->input_encoding;
1709              }
1710  
1711              $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity');
1712              $text_types = array('text/xml', 'text/xml-external-parsed-entity');
1713  
1714              // RFC 3023 (only applies to sniffed content)
1715              if (isset($sniffed))
1716              {
1717                  if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml')
1718                  {
1719                      if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
1720                      {
1721                          $encodings[] = strtoupper($charset[1]);
1722                      }
1723                      $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data));
1724                      $encodings[] = 'UTF-8';
1725                  }
1726                  elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml')
1727                  {
1728                      if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
1729                      {
1730                          $encodings[] = $charset[1];
1731                      }
1732                      $encodings[] = 'US-ASCII';
1733                  }
1734                  // Text MIME-type default
1735                  elseif (substr($sniffed, 0, 5) === 'text/')
1736                  {
1737                      $encodings[] = 'US-ASCII';
1738                  }
1739              }
1740  
1741              // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1
1742              $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data));
1743              $encodings[] = 'UTF-8';
1744              $encodings[] = 'ISO-8859-1';
1745  
1746              // There's no point in trying an encoding twice
1747              $encodings = array_unique($encodings);
1748  
1749              // If we want the XML, just output that with the most likely encoding and quit
1750              if ($this->xml_dump)
1751              {
1752                  header('Content-type: text/xml; charset=' . $encodings[0]);
1753                  echo $data;
1754                  exit;
1755              }
1756  
1757              // Loop through each possible encoding, till we return something, or run out of possibilities
1758              foreach ($encodings as $encoding)
1759              {
1760                  // Change the encoding to UTF-8 (as we always use UTF-8 internally)
1761                  if ($utf8_data = SimplePie_Misc::change_encoding($data, $encoding, 'UTF-8'))
1762                  {
1763                      // Create new parser
1764                      $parser =& new $this->parser_class();
1765  
1766                      // If it's parsed fine
1767                      if ($parser->parse($utf8_data, 'UTF-8'))
1768                      {
1769                          $this->data = $parser->get_data();
1770                          if ($this->get_type() & ~SIMPLEPIE_TYPE_NONE)
1771                          {
1772                              if (isset($headers))
1773                              {
1774                                  $this->data['headers'] = $headers;
1775                              }
1776                              $this->data['build'] = SIMPLEPIE_BUILD;
1777  
1778                              // Cache the file if caching is enabled
1779                              if ($cache && !$cache->save($this))
1780                              {
1781                                  trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
1782                              }
1783                              return true;
1784                          }
1785                          else
1786                          {
1787                              $this->error = "A feed could not be found at $this->feed_url. This does not appear to be a valid RSS or Atom feed.";
1788                              SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
1789                              return false;
1790                          }
1791                      }
1792                  }
1793              }
1794              if (isset($parser))
1795              {
1796                  // We have an error, just set SimplePie_Misc::error to it and quit
1797                  $this->error = sprintf('This XML document is invalid, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());
1798              }
1799              else
1800              {
1801                  $this->error = 'The data could not be converted to UTF-8. You MUST have either the iconv or mbstring extension installed. Upgrading to PHP 5.x (which includes iconv) is highly recommended.';
1802              }
1803              SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
1804              return false;
1805          }
1806          elseif (!empty($this->multifeed_url))
1807          {
1808              $i = 0;
1809              $success = 0;
1810              $this->multifeed_objects = array();
1811              foreach ($this->multifeed_url as $url)
1812              {
1813                  if (SIMPLEPIE_PHP5)
1814                  {
1815                      // This keyword needs to defy coding standards for PHP4 compatibility
1816                      $this->multifeed_objects[$i] = clone($this);
1817                  }
1818                  else
1819                  {
1820                      $this->multifeed_objects[$i] = $this;
1821                  }
1822                  $this->multifeed_objects[$i]->set_feed_url($url);
1823                  $success |= $this->multifeed_objects[$i]->init();
1824                  $i++;
1825              }
1826              return (bool) $success;
1827          }
1828          else
1829          {
1830              return false;
1831          }
1832      }
1833  
1834      /**
1835       * Return the error message for the occured error
1836       *
1837       * @access public
1838       * @return string Error message
1839       */
1840  	function error()
1841      {
1842          return $this->error;
1843      }
1844  
1845  	function get_encoding()
1846      {
1847          return $this->sanitize->output_encoding;
1848      }
1849  
1850  	function handle_content_type($mime = 'text/html')
1851      {
1852          if (!headers_sent())
1853          {
1854              $header = "Content-type: $mime;";
1855              if ($this->get_encoding())
1856              {
1857                  $header .= ' charset=' . $this->get_encoding();
1858              }
1859              else
1860              {
1861                  $header .= ' charset=UTF-8';
1862              }
1863              header($header);
1864          }
1865      }
1866  
1867  	function get_type()
1868      {
1869          if (!isset($this->data['type']))
1870          {
1871              $this->data['type'] = SIMPLEPIE_TYPE_ALL;
1872              if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed']))
1873              {
1874                  $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10;
1875              }
1876              elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed']))
1877              {
1878                  $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03;
1879              }
1880              elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF']))
1881              {
1882                  if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel'])
1883                  || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image'])
1884                  || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item'])
1885                  || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput']))
1886                  {
1887                      $this->data['type'] &= SIMPLEPIE_TYPE_RSS_10;
1888                  }
1889                  if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel'])
1890                  || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image'])
1891                  || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item'])
1892                  || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput']))
1893                  {
1894                      $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090;
1895                  }
1896              }
1897              elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss']))
1898              {
1899                  $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL;
1900                  if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version']))
1901                  {
1902                      switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version']))
1903                      {
1904                          case '0.91':
1905                              $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091;
1906                              if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data']))
1907                              {
1908                                  switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data']))
1909                                  {
1910                                      case '0':
1911                                          $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE;
1912                                          break;
1913  
1914                                      case '24':
1915                                          $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND;
1916                                          break;
1917                                  }
1918                              }
1919                              break;
1920  
1921                          case '0.92':
1922                              $this->data['type'] &= SIMPLEPIE_TYPE_RSS_092;
1923                              break;
1924  
1925                          case '0.93':
1926                              $this->data['type'] &= SIMPLEPIE_TYPE_RSS_093;
1927                              break;
1928  
1929                          case '0.94':
1930                              $this->data['type'] &= SIMPLEPIE_TYPE_RSS_094;
1931                              break;
1932  
1933                          case '2.0':
1934                              $this->data['type'] &= SIMPLEPIE_TYPE_RSS_20;
1935                              break;
1936                      }
1937                  }
1938              }
1939              else
1940              {
1941                  $this->data['type'] = SIMPLEPIE_TYPE_NONE;
1942              }
1943          }
1944          return $this->data['type'];
1945      }
1946  
1947      /**
1948       * Returns the URL for the favicon of the feed's website.
1949       *
1950       * @todo Cache atom:icon
1951       * @access public
1952       * @since 1.0
1953       */
1954  	function get_favicon()
1955      {
1956          if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
1957          {
1958              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
1959          }
1960          elseif (($url = $this->get_link()) !== null && preg_match('/^http(s)?:\/\//i', $url))
1961          {
1962              $favicon = SimplePie_Misc::absolutize_url('/favicon.ico', $url);
1963  
1964              if ($this->cache && $this->favicon_handler)
1965              {
1966                  $favicon_filename = call_user_func($this->cache_name_function, $favicon);
1967                  $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $favicon_filename, 'spi');
1968  
1969                  if ($cache->load())
1970                  {
1971                      return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI);
1972                  }
1973                  else
1974                  {
1975                      $file =& new $this->file_class($favicon, $this->timeout / 10, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen);
1976  
1977                      if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)) && strlen($file->body) > 0)
1978                      {
1979                          $sniffer =& new $this->content_type_sniffer_class($file);
1980                          if (substr($sniffer->get_type(), 0, 6) === 'image/')
1981                          {
1982                              if ($cache->save(array('headers' => $file->headers, 'body' => $file->body)))
1983                              {
1984                                  return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI);
1985                              }
1986                              else
1987                              {
1988                                  trigger_error("$cache->name is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
1989                                  return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
1990                              }
1991                          }
1992                          // not an image
1993                          else
1994                          {
1995                              return false;
1996                          }
1997                      }
1998                  }
1999              }
2000              else
2001              {
2002                  return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
2003              }
2004          }
2005          return false;
2006      }
2007  
2008      /**
2009       * @todo If we have a perm redirect we should return the new URL
2010       * @todo When we make the above change, let's support <itunes:new-feed-url> as well
2011       * @todo Also, |atom:link|@rel=self
2012       */
2013  	function subscribe_url()
2014      {
2015          if ($this->feed_url !== null)
2016          {
2017              return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI);
2018          }
2019          else
2020          {
2021              return null;
2022          }
2023      }
2024  
2025  	function subscribe_feed()
2026      {
2027          if ($this->feed_url !== null)
2028          {
2029              return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI);
2030          }
2031          else
2032          {
2033              return null;
2034          }
2035      }
2036  
2037  	function subscribe_outlook()
2038      {
2039          if ($this->feed_url !== null)
2040          {
2041              return $this->sanitize('outlook' . SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI);
2042          }
2043          else
2044          {
2045              return null;
2046          }
2047      }
2048  
2049  	function subscribe_podcast()
2050      {
2051          if ($this->feed_url !== null)
2052          {
2053              return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 3), SIMPLEPIE_CONSTRUCT_IRI);
2054          }
2055          else
2056          {
2057              return null;
2058          }
2059      }
2060  
2061  	function subscribe_itunes()
2062      {
2063          if ($this->feed_url !== null)
2064          {
2065              return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 4), SIMPLEPIE_CONSTRUCT_IRI);
2066          }
2067          else
2068          {
2069              return null;
2070          }
2071      }
2072  
2073      /**
2074       * Creates the subscribe_* methods' return data
2075       *
2076       * @access private
2077       * @param string $feed_url String to prefix to the feed URL
2078       * @param string $site_url String to prefix to the site URL (and
2079       * suffix to the feed URL)
2080       * @return mixed URL if feed exists, false otherwise
2081       */
2082  	function subscribe_service($feed_url, $site_url = null)
2083      {
2084          if ($this->subscribe_url())
2085          {
2086              $return = $feed_url . rawurlencode($this->feed_url);
2087              if ($site_url !== null && $this->get_link() !== null)
2088              {
2089                  $return .= $site_url . rawurlencode($this->get_link());
2090              }
2091              return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI);
2092          }
2093          else
2094          {
2095              return null;
2096          }
2097      }
2098  
2099  	function subscribe_aol()
2100      {
2101          return $this->subscribe_service('http://feeds.my.aol.com/add.jsp?url=');
2102      }
2103  
2104  	function subscribe_bloglines()
2105      {
2106          return $this->subscribe_service('http://www.bloglines.com/sub/');
2107      }
2108  
2109  	function subscribe_eskobo()
2110      {
2111          return $this->subscribe_service('http://www.eskobo.com/?AddToMyPage=');
2112      }
2113  
2114  	function subscribe_feedfeeds()
2115      {
2116          return $this->subscribe_service('http://www.feedfeeds.com/add?feed=');
2117      }
2118  
2119  	function subscribe_feedster()
2120      {
2121          return $this->subscribe_service('http://www.feedster.com/myfeedster.php?action=addrss&confirm=no&rssurl=');
2122      }
2123  
2124  	function subscribe_google()
2125      {
2126          return $this->subscribe_service('http://fusion.google.com/add?feedurl=');
2127      }
2128  
2129  	function subscribe_gritwire()
2130      {
2131          return $this->subscribe_service('http://my.gritwire.com/feeds/addExternalFeed.aspx?FeedUrl=');
2132      }
2133  
2134  	function subscribe_msn()
2135      {
2136          return $this->subscribe_service('http://my.msn.com/addtomymsn.armx?id=rss&ut=', '&ru=');
2137      }
2138  
2139  	function subscribe_netvibes()
2140      {
2141          return $this->subscribe_service('http://www.netvibes.com/subscribe.php?url=');
2142      }
2143  
2144  	function subscribe_newsburst()
2145      {
2146          return $this->subscribe_service('http://www.newsburst.com/Source/?add=');
2147      }
2148  
2149  	function subscribe_newsgator()
2150      {
2151          return $this->subscribe_service('http://www.newsgator.com/ngs/subscriber/subext.aspx?url=');
2152      }
2153  
2154  	function subscribe_odeo()
2155      {
2156          return $this->subscribe_service('http://www.odeo.com/listen/subscribe?feed=');
2157      }
2158  
2159  	function subscribe_podnova()
2160      {
2161          return $this->subscribe_service('http://www.podnova.com/index_your_podcasts.srf?action=add&url=');
2162      }
2163  
2164  	function subscribe_rojo()
2165      {
2166          return $this->subscribe_service('http://www.rojo.com/add-subscription?resource=');
2167      }
2168  
2169  	function subscribe_yahoo()
2170      {
2171          return $this->subscribe_service('http://add.my.yahoo.com/rss?url=');
2172      }
2173  
2174  	function get_feed_tags($namespace, $tag)
2175      {
2176          $type = $this->get_type();
2177          if ($type & SIMPLEPIE_TYPE_ATOM_10)
2178          {
2179              if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]))
2180              {
2181                  return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag];
2182              }
2183          }
2184          if ($type & SIMPLEPIE_TYPE_ATOM_03)
2185          {
2186              if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]))
2187              {
2188                  return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag];
2189              }
2190          }
2191          if ($type & SIMPLEPIE_TYPE_RSS_RDF)
2192          {
2193              if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]))
2194              {
2195                  return $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag];
2196              }
2197          }
2198          if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
2199          {
2200              if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]))
2201              {
2202                  return $this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag];
2203              }
2204          }
2205          return null;
2206      }
2207  
2208  	function get_channel_tags($namespace, $tag)
2209      {
2210          $type = $this->get_type();
2211          if ($type & SIMPLEPIE_TYPE_ATOM_ALL)
2212          {
2213              if ($return = $this->get_feed_tags($namespace, $tag))
2214              {
2215                  return $return;
2216              }
2217          }
2218          if ($type & SIMPLEPIE_TYPE_RSS_10)
2219          {
2220              if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel'))
2221              {
2222                  if (isset($channel[0]['child'][$namespace][$tag]))
2223                  {
2224                      return $channel[0]['child'][$namespace][$tag];
2225                  }
2226              }
2227          }
2228          if ($type & SIMPLEPIE_TYPE_RSS_090)
2229          {
2230              if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel'))
2231              {
2232                  if (isset($channel[0]['child'][$namespace][$tag]))
2233                  {
2234                      return $channel[0]['child'][$namespace][$tag];
2235                  }
2236              }
2237          }
2238          if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
2239          {
2240              if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel'))
2241              {
2242                  if (isset($channel[0]['child'][$namespace][$tag]))
2243                  {
2244                      return $channel[0]['child'][$namespace][$tag];
2245                  }
2246              }
2247          }
2248          return null;
2249      }
2250  
2251  	function get_image_tags($namespace, $tag)
2252      {
2253          $type = $this->get_type();
2254          if ($type & SIMPLEPIE_TYPE_RSS_10)
2255          {
2256              if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image'))
2257              {
2258                  if (isset($image[0]['child'][$namespace][$tag]))
2259                  {
2260                      return $image[0]['child'][$namespace][$tag];
2261                  }
2262              }
2263          }
2264          if ($type & SIMPLEPIE_TYPE_RSS_090)
2265          {
2266              if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image'))
2267              {
2268                  if (isset($image[0]['child'][$namespace][$tag]))
2269                  {
2270                      return $image[0]['child'][$namespace][$tag];
2271                  }
2272              }
2273          }
2274          if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
2275          {
2276              if ($image = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'image'))
2277              {
2278                  if (isset($image[0]['child'][$namespace][$tag]))
2279                  {
2280                      return $image[0]['child'][$namespace][$tag];
2281                  }
2282              }
2283          }
2284          return null;
2285      }
2286  
2287  	function get_base($element = array())
2288      {
2289          if (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base']))
2290          {
2291              return $element['xml_base'];
2292          }
2293          elseif ($this->get_link() !== null)
2294          {
2295              return $this->get_link();
2296          }
2297          else
2298          {
2299              return $this->subscribe_url();
2300          }
2301      }
2302  
2303  	function sanitize($data, $type, $base = '')
2304      {
2305          return $this->sanitize->sanitize($data, $type, $base);
2306      }
2307  
2308  	function get_title()
2309      {
2310          if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
2311          {
2312              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
2313          }
2314          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
2315          {
2316              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
2317          }
2318          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
2319          {
2320              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
2321          }
2322          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
2323          {
2324              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
2325          }
2326          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
2327          {
2328              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
2329          }
2330          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
2331          {
2332              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2333          }
2334          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
2335          {
2336              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2337          }
2338          else
2339          {
2340              return null;
2341          }
2342      }
2343  
2344  	function get_category($key = 0)
2345      {
2346          $categories = $this->get_categories();
2347          if (isset($categories[$key]))
2348          {
2349              return $categories[$key];
2350          }
2351          else
2352          {
2353              return null;
2354          }
2355      }
2356  
2357  	function get_categories()
2358      {
2359          $categories = array();
2360  
2361          foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
2362          {
2363              $term = null;
2364              $scheme = null;
2365              $label = null;
2366              if (isset($category['attribs']['']['term']))
2367              {
2368                  $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
2369              }
2370              if (isset($category['attribs']['']['scheme']))
2371              {
2372                  $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
2373              }
2374              if (isset($category['attribs']['']['label']))
2375              {
2376                  $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
2377              }
2378              $categories[] =& new $this->category_class($term, $scheme, $label);
2379          }
2380          foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
2381          {
2382              // This is really the label, but keep this as the term also for BC.
2383              // Label will also work on retrieving because that falls back to term.
2384              $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2385              if (isset($category['attribs']['']['domain']))
2386              {
2387                  $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
2388              }
2389              else
2390              {
2391                  $scheme = null;
2392              }
2393              $categories[] =& new $this->category_class($term, $scheme, null);
2394          }
2395          foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
2396          {
2397              $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
2398          }
2399          foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
2400          {
2401              $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
2402          }
2403  
2404          if (!empty($categories))
2405          {
2406              return SimplePie_Misc::array_unique($categories);
2407          }
2408          else
2409          {
2410              return null;
2411          }
2412      }
2413  
2414  	function get_author($key = 0)
2415      {
2416          $authors = $this->get_authors();
2417          if (isset($authors[$key]))
2418          {
2419              return $authors[$key];
2420          }
2421          else
2422          {
2423              return null;
2424          }
2425      }
2426  
2427  	function get_authors()
2428      {
2429          $authors = array();
2430          foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
2431          {
2432              $name = null;
2433              $uri = null;
2434              $email = null;
2435              if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
2436              {
2437                  $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2438              }
2439              if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
2440              {
2441                  $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
2442              }
2443              if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
2444              {
2445                  $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2446              }
2447              if ($name !== null || $email !== null || $uri !== null)
2448              {
2449                  $authors[] =& new $this->author_class($name, $uri, $email);
2450              }
2451          }
2452          if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
2453          {
2454              $name = null;
2455              $url = null;
2456              $email = null;
2457              if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
2458              {
2459                  $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2460              }
2461              if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
2462              {
2463                  $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
2464              }
2465              if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
2466              {
2467                  $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2468              }
2469              if ($name !== null || $email !== null || $url !== null)
2470              {
2471                  $authors[] =& new $this->author_class($name, $url, $email);
2472              }
2473          }
2474          foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
2475          {
2476              $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
2477          }
2478          foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
2479          {
2480              $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
2481          }
2482          foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
2483          {
2484              $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
2485          }
2486  
2487          if (!empty($authors))
2488          {
2489              return SimplePie_Misc::array_unique($authors);
2490          }
2491          else
2492          {
2493              return null;
2494          }
2495      }
2496  
2497  	function get_contributor($key = 0)
2498      {
2499          $contributors = $this->get_contributors();
2500          if (isset($contributors[$key]))
2501          {
2502              return $contributors[$key];
2503          }
2504          else
2505          {
2506              return null;
2507          }
2508      }
2509  
2510  	function get_contributors()
2511      {
2512          $contributors = array();
2513          foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
2514          {
2515              $name = null;
2516              $uri = null;
2517              $email = null;
2518              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
2519              {
2520                  $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2521              }
2522              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
2523              {
2524                  $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
2525              }
2526              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
2527              {
2528                  $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2529              }
2530              if ($name !== null || $email !== null || $uri !== null)
2531              {
2532                  $contributors[] =& new $this->author_class($name, $uri, $email);
2533              }
2534          }
2535          foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
2536          {
2537              $name = null;
2538              $url = null;
2539              $email = null;
2540              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
2541              {
2542                  $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2543              }
2544              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
2545              {
2546                  $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
2547              }
2548              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
2549              {
2550                  $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2551              }
2552              if ($name !== null || $email !== null || $url !== null)
2553              {
2554                  $contributors[] =& new $this->author_class($name, $url, $email);
2555              }
2556          }
2557  
2558          if (!empty($contributors))
2559          {
2560              return SimplePie_Misc::array_unique($contributors);
2561          }
2562          else
2563          {
2564              return null;
2565          }
2566      }
2567  
2568  	function get_link($key = 0, $rel = 'alternate')
2569      {
2570          $links = $this->get_links($rel);
2571          if (isset($links[$key]))
2572          {
2573              return $links[$key];
2574          }
2575          else
2576          {
2577              return null;
2578          }
2579      }
2580  
2581      /**
2582       * Added for parity between the parent-level and the item/entry-level.
2583       */
2584  	function get_permalink()
2585      {
2586          return $this->get_link(0);
2587      }
2588  
2589  	function get_links($rel = 'alternate')
2590      {
2591          if (!isset($this->data['links']))
2592          {
2593              $this->data['links'] = array();
2594              if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
2595              {
2596                  foreach ($links as $link)
2597                  {
2598                      if (isset($link['attribs']['']['href']))
2599                      {
2600                          $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
2601                          $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
2602                      }
2603                  }
2604              }
2605              if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
2606              {
2607                  foreach ($links as $link)
2608                  {
2609                      if (isset($link['attribs']['']['href']))
2610                      {
2611                          $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
2612                          $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
2613  
2614                      }
2615                  }
2616              }
2617              if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
2618              {
2619                  $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
2620              }
2621              if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
2622              {
2623                  $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
2624              }
2625              if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
2626              {
2627                  $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
2628              }
2629  
2630              $keys = array_keys($this->data['links']);
2631              foreach ($keys as $key)
2632              {
2633                  if (SimplePie_Misc::is_isegment_nz_nc($key))
2634                  {
2635                      if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
2636                      {
2637                          $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
2638                          $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
2639                      }
2640                      else
2641                      {
2642                          $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
2643                      }
2644                  }
2645                  elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
2646                  {
2647                      $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
2648                  }
2649                  $this->data['links'][$key] = array_unique($this->data['links'][$key]);
2650              }
2651          }
2652  
2653          if (isset($this->data['links'][$rel]))
2654          {
2655              return $this->data['links'][$rel];
2656          }
2657          else
2658          {
2659              return null;
2660          }
2661      }
2662  
2663  	function get_all_discovered_feeds()
2664      {
2665          return $this->all_discovered_feeds;
2666      }
2667  
2668  	function get_description()
2669      {
2670          if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
2671          {
2672              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
2673          }
2674          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
2675          {
2676              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
2677          }
2678          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
2679          {
2680              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
2681          }
2682          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
2683          {
2684              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
2685          }
2686          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
2687          {
2688              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
2689          }
2690          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
2691          {
2692              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2693          }
2694          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
2695          {
2696              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2697          }
2698          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
2699          {
2700              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
2701          }
2702          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
2703          {
2704              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
2705          }
2706          else
2707          {
2708              return null;
2709          }
2710      }
2711  
2712  	function get_copyright()
2713      {
2714          if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
2715          {
2716              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
2717          }
2718          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
2719          {
2720              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
2721          }
2722          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright'))
2723          {
2724              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2725          }
2726          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
2727          {
2728              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2729          }
2730          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
2731          {
2732              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2733          }
2734          else
2735          {
2736              return null;
2737          }
2738      }
2739  
2740  	function get_language()
2741      {
2742          if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language'))
2743          {
2744              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2745          }
2746          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
2747          {
2748              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2749          }
2750          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
2751          {
2752              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2753          }
2754          elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang']))
2755          {
2756              return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
2757          }
2758          elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang']))
2759          {
2760              return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
2761          }
2762          elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang']))
2763          {
2764              return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
2765          }
2766          elseif (isset($this->data['headers']['content-language']))
2767          {
2768              return $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT);
2769          }
2770          else
2771          {
2772              return null;
2773          }
2774      }
2775  
2776  	function get_latitude()
2777      {
2778  
2779          if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
2780          {
2781              return (float) $return[0]['data'];
2782          }
2783          elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
2784          {
2785              return (float) $match[1];
2786          }
2787          else
2788          {
2789              return null;
2790          }
2791      }
2792  
2793  	function get_longitude()
2794      {
2795          if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
2796          {
2797              return (float) $return[0]['data'];
2798          }
2799          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
2800          {
2801              return (float) $return[0]['data'];
2802          }
2803          elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
2804          {
2805              return (float) $match[2];
2806          }
2807          else
2808          {
2809              return null;
2810          }
2811      }
2812  
2813  	function get_image_title()
2814      {
2815          if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
2816          {
2817              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2818          }
2819          elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
2820          {
2821              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2822          }
2823          elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
2824          {
2825              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2826          }
2827          elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
2828          {
2829              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2830          }
2831          elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
2832          {
2833              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
2834          }
2835          else
2836          {
2837              return null;
2838          }
2839      }
2840  
2841  	function get_image_url()
2842      {
2843          if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
2844          {
2845              return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
2846          }
2847          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
2848          {
2849              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
2850          }
2851          elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
2852          {
2853              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
2854          }
2855          elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'url'))
2856          {
2857              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
2858          }
2859          elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'url'))
2860          {
2861              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
2862          }
2863          elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))
2864          {
2865              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
2866          }
2867          else
2868          {
2869              return null;
2870          }
2871      }
2872  
2873  	function get_image_link()
2874      {
2875          if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
2876          {
2877              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
2878          }
2879          elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
2880          {
2881              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
2882          }
2883          elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
2884          {
2885              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
2886          }
2887          else
2888          {
2889              return null;
2890          }
2891      }
2892  
2893  	function get_image_width()
2894      {
2895          if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'width'))
2896          {
2897              return round($return[0]['data']);
2898          }
2899          elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))
2900          {
2901              return 88.0;
2902          }
2903          else
2904          {
2905              return null;
2906          }
2907      }
2908  
2909  	function get_image_height()
2910      {
2911          if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'height'))
2912          {
2913              return round($return[0]['data']);
2914          }
2915          elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))
2916          {
2917              return 31.0;
2918          }
2919          else
2920          {
2921              return null;
2922          }
2923      }
2924  
2925  	function get_item_quantity($max = 0)
2926      {
2927          $max = (int) $max;
2928          $qty = count($this->get_items());
2929          if ($max === 0)
2930          {
2931              return $qty;
2932          }
2933          else
2934          {
2935              return ($qty > $max) ? $max : $qty;
2936          }
2937      }
2938  
2939  	function get_item($key = 0)
2940      {
2941          $items = $this->get_items();
2942          if (isset($items[$key]))
2943          {
2944              return $items[$key];
2945          }
2946          else
2947          {
2948              return null;
2949          }
2950      }
2951  
2952  	function get_items($start = 0, $end = 0)
2953      {
2954          if (!isset($this->data['items']))
2955          {
2956              if (!empty($this->multifeed_objects))
2957              {
2958                  $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit);
2959              }
2960              else
2961              {
2962                  $this->data['items'] = array();
2963                  if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry'))
2964                  {
2965                      $keys = array_keys($items);
2966                      foreach ($keys as $key)
2967                      {
2968                          $this->data['items'][] =& new $this->item_class($this, $items[$key]);
2969                      }
2970                  }
2971                  if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry'))
2972                  {
2973                      $keys = array_keys($items);
2974                      foreach ($keys as $key)
2975                      {
2976                          $this->data['items'][] =& new $this->item_class($this, $items[$key]);
2977                      }
2978                  }
2979                  if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item'))
2980                  {
2981                      $keys = array_keys($items);
2982                      foreach ($keys as $key)
2983                      {
2984                          $this->data['items'][] =& new $this->item_class($this, $items[$key]);
2985                      }
2986                  }
2987                  if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item'))
2988                  {
2989                      $keys = array_keys($items);
2990                      foreach ($keys as $key)
2991                      {
2992                          $this->data['items'][] =& new $this->item_class($this, $items[$key]);
2993                      }
2994                  }
2995                  if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item'))
2996                  {
2997                      $keys = array_keys($items);
2998                      foreach ($keys as $key)
2999                      {
3000                          $this->data['items'][] =& new $this->item_class($this, $items[$key]);
3001                      }
3002                  }
3003              }
3004          }
3005  
3006          if (!empty($this->data['items']))
3007          {
3008              // If we want to order it by date, check if all items have a date, and then sort it
3009              if ($this->order_by_date && empty($this->multifeed_objects))
3010              {
3011                  if (!isset($this->data['ordered_items']))
3012                  {
3013                      $do_sort = true;
3014                      foreach ($this->data['items'] as $item)
3015                      {
3016                          if (!$item->get_date('U'))
3017                          {
3018                              $do_sort = false;
3019                              break;
3020                          }
3021                      }
3022                      $item = null;
3023                      $this->data['ordered_items'] = $this->data['items'];
3024                      if ($do_sort)
3025                      {
3026                          usort($this->data['ordered_items'], array(&$this, 'sort_items'));
3027                      }
3028                  }
3029                  $items = $this->data['ordered_items'];
3030              }
3031              else
3032              {
3033                  $items = $this->data['items'];
3034              }
3035  
3036              // Slice the data as desired
3037              if ($end === 0)
3038              {
3039                  return array_slice($items, $start);
3040              }
3041              else
3042              {
3043                  return array_slice($items, $start, $end);
3044              }
3045          }
3046          else
3047          {
3048              return array();
3049          }
3050      }
3051  
3052      /**
3053       * @static
3054       */
3055  	function sort_items($a, $b)
3056      {
3057          return $a->get_date('U') <= $b->get_date('U');
3058      }
3059  
3060      /**
3061       * @static
3062       */
3063  	function merge_items($urls, $start = 0, $end = 0, $limit = 0)
3064      {
3065          if (is_array($urls) && sizeof($urls) > 0)
3066          {
3067              $items = array();
3068              foreach ($urls as $arg)
3069              {
3070                  if (is_a($arg, 'SimplePie'))
3071                  {
3072                      $items = array_merge($items, $arg->get_items(0, $limit));
3073                  }
3074                  else
3075                  {
3076                      trigger_error('Arguments must be SimplePie objects', E_USER_WARNING);
3077                  }
3078              }
3079  
3080              $do_sort = true;
3081              foreach ($items as $item)
3082              {
3083                  if (!$item->get_date('U'))
3084                  {
3085                      $do_sort = false;
3086                      break;
3087                  }
3088              }
3089              $item = null;
3090              if ($do_sort)
3091              {
3092                  usort($items, array('SimplePie', 'sort_items'));
3093              }
3094  
3095              if ($end === 0)
3096              {
3097                  return array_slice($items, $start);
3098              }
3099              else
3100              {
3101                  return array_slice($items, $start, $end);
3102              }
3103          }
3104          else
3105          {
3106              trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING);
3107              return array();
3108          }
3109      }
3110  }
3111  
3112  class SimplePie_Item
3113  {
3114      var $feed;
3115      var $data = array();
3116  
3117  	function SimplePie_Item($feed, $data)
3118      {
3119          $this->feed = $feed;
3120          $this->data = $data;
3121      }
3122  
3123  	function __toString()
3124      {
3125          return md5(serialize($this->data));
3126      }
3127  
3128      /**
3129       * Remove items that link back to this before destroying this object
3130       */
3131  	function __destruct()
3132      {
3133          if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
3134          {
3135              unset($this->feed);
3136          }
3137      }
3138  
3139  	function get_item_tags($namespace, $tag)
3140      {
3141          if (isset($this->data['child'][$namespace][$tag]))
3142          {
3143              return $this->data['child'][$namespace][$tag];
3144          }
3145          else
3146          {
3147              return null;
3148          }
3149      }
3150  
3151  	function get_base($element = array())
3152      {
3153          return $this->feed->get_base($element);
3154      }
3155  
3156  	function sanitize($data, $type, $base = '')
3157      {
3158          return $this->feed->sanitize($data, $type, $base);
3159      }
3160  
3161  	function get_feed()
3162      {
3163          return $this->feed;
3164      }
3165  
3166  	function get_id($hash = false)
3167      {
3168          if (!$hash)
3169          {
3170              if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id'))
3171              {
3172                  return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3173              }
3174              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id'))
3175              {
3176                  return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3177              }
3178              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
3179              {
3180                  return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3181              }
3182              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier'))
3183              {
3184                  return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3185              }
3186              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier'))
3187              {
3188                  return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3189              }
3190              elseif (($return = $this->get_permalink()) !== null)
3191              {
3192                  return $return;
3193              }
3194              elseif (($return = $this->get_title()) !== null)
3195              {
3196                  return $return;
3197              }
3198          }
3199          if ($this->get_permalink() !== null || $this->get_title() !== null)
3200          {
3201              return md5($this->get_permalink() . $this->get_title());
3202          }
3203          else
3204          {
3205              return md5(serialize($this->data));
3206          }
3207      }
3208  
3209  	function get_title()
3210      {
3211          if (!isset($this->data['title']))
3212          {
3213              if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
3214              {
3215                  $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
3216              }
3217              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
3218              {
3219                  $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
3220              }
3221              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
3222              {
3223                  $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
3224              }
3225              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
3226              {
3227                  $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
3228              }
3229              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
3230              {
3231                  $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
3232              }
3233              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
3234              {
3235                  $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3236              }
3237              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
3238              {
3239                  $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3240              }
3241              else
3242              {
3243                  $this->data['title'] = null;
3244              }
3245          }
3246          return $this->data['title'];
3247      }
3248  
3249  	function get_description($description_only = false)
3250      {
3251          if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary'))
3252          {
3253              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
3254          }
3255          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary'))
3256          {
3257              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
3258          }
3259          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
3260          {
3261              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
3262          }
3263          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
3264          {
3265              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
3266          }
3267          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
3268          {
3269              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3270          }
3271          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
3272          {
3273              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3274          }
3275          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
3276          {
3277              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
3278          }
3279          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
3280          {
3281              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3282          }
3283          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
3284          {
3285              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
3286          }
3287  
3288          elseif (!$description_only)
3289          {
3290              return $this->get_content(true);
3291          }
3292          else
3293          {
3294              return null;
3295          }
3296      }
3297  
3298  	function get_content($content_only = false)
3299      {
3300          if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content'))
3301          {
3302              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_content_construct_type($return[0]['attribs']), $this->get_base($return[0]));
3303          }
3304          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content'))
3305          {
3306              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
3307          }
3308          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded'))
3309          {
3310              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
3311          }
3312          elseif (!$content_only)
3313          {
3314              return $this->get_description(true);
3315          }
3316          else
3317          {
3318              return null;
3319          }
3320      }
3321  
3322  	function get_category($key = 0)
3323      {
3324          $categories = $this->get_categories();
3325          if (isset($categories[$key]))
3326          {
3327              return $categories[$key];
3328          }
3329          else
3330          {
3331              return null;
3332          }
3333      }
3334  
3335  	function get_categories()
3336      {
3337          $categories = array();
3338  
3339          foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
3340          {
3341              $term = null;
3342              $scheme = null;
3343              $label = null;
3344              if (isset($category['attribs']['']['term']))
3345              {
3346                  $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
3347              }
3348              if (isset($category['attribs']['']['scheme']))
3349              {
3350                  $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
3351              }
3352              if (isset($category['attribs']['']['label']))
3353              {
3354                  $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
3355              }
3356              $categories[] =& new $this->feed->category_class($term, $scheme, $label);
3357          }
3358          foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
3359          {
3360              // This is really the label, but keep this as the term also for BC.
3361              // Label will also work on retrieving because that falls back to term.
3362              $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3363              if (isset($category['attribs']['']['domain']))
3364              {
3365                  $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
3366              }
3367              else
3368              {
3369                  $scheme = null;
3370              }
3371              $categories[] =& new $this->feed->category_class($term, $scheme, null);
3372          }
3373          foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
3374          {
3375              $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
3376          }
3377          foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
3378          {
3379              $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
3380          }
3381  
3382          if (!empty($categories))
3383          {
3384              return SimplePie_Misc::array_unique($categories);
3385          }
3386          else
3387          {
3388              return null;
3389          }
3390      }
3391  
3392  	function get_author($key = 0)
3393      {
3394          $authors = $this->get_authors();
3395          if (isset($authors[$key]))
3396          {
3397              return $authors[$key];
3398          }
3399          else
3400          {
3401              return null;
3402          }
3403      }
3404  
3405  	function get_contributor($key = 0)
3406      {
3407          $contributors = $this->get_contributors();
3408          if (isset($contributors[$key]))
3409          {
3410              return $contributors[$key];
3411          }
3412          else
3413          {
3414              return null;
3415          }
3416      }
3417  
3418  	function get_contributors()
3419      {
3420          $contributors = array();
3421          foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
3422          {
3423              $name = null;
3424              $uri = null;
3425              $email = null;
3426              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
3427              {
3428                  $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3429              }
3430              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
3431              {
3432                  $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
3433              }
3434              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
3435              {
3436                  $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3437              }
3438              if ($name !== null || $email !== null || $uri !== null)
3439              {
3440                  $contributors[] =& new $this->feed->author_class($name, $uri, $email);
3441              }
3442          }
3443          foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
3444          {
3445              $name = null;
3446              $url = null;
3447              $email = null;
3448              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
3449              {
3450                  $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3451              }
3452              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
3453              {
3454                  $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
3455              }
3456              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
3457              {
3458                  $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3459              }
3460              if ($name !== null || $email !== null || $url !== null)
3461              {
3462                  $contributors[] =& new $this->feed->author_class($name, $url, $email);
3463              }
3464          }
3465  
3466          if (!empty($contributors))
3467          {
3468              return SimplePie_Misc::array_unique($contributors);
3469          }
3470          else
3471          {
3472              return null;
3473          }
3474      }
3475  
3476  	function get_authors()
3477      {
3478          $authors = array();
3479          foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
3480          {
3481              $name = null;
3482              $uri = null;
3483              $email = null;
3484              if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
3485              {
3486                  $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3487              }
3488              if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
3489              {
3490                  $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
3491              }
3492              if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
3493              {
3494                  $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3495              }
3496              if ($name !== null || $email !== null || $uri !== null)
3497              {
3498                  $authors[] =& new $this->feed->author_class($name, $uri, $email);
3499              }
3500          }
3501          if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
3502          {
3503              $name = null;
3504              $url = null;
3505              $email = null;
3506              if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
3507              {
3508                  $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3509              }
3510              if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
3511              {
3512                  $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
3513              }
3514              if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
3515              {
3516                  $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3517              }
3518              if ($name !== null || $email !== null || $url !== null)
3519              {
3520                  $authors[] =& new $this->feed->author_class($name, $url, $email);
3521              }
3522          }
3523          if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author'))
3524          {
3525              $authors[] =& new $this->feed->author_class(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
3526          }
3527          foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
3528          {
3529              $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
3530          }
3531          foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
3532          {
3533              $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
3534          }
3535          foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
3536          {
3537              $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
3538          }
3539  
3540          if (!empty($authors))
3541          {
3542              return SimplePie_Misc::array_unique($authors);
3543          }
3544          elseif (($source = $this->get_source()) && ($authors = $source->get_authors()))
3545          {
3546              return $authors;
3547          }
3548          elseif ($authors = $this->feed->get_authors())
3549          {
3550              return $authors;
3551          }
3552          else
3553          {
3554              return null;
3555          }
3556      }
3557  
3558  	function get_copyright()
3559      {
3560          if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
3561          {
3562              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
3563          }
3564          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
3565          {
3566              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3567          }
3568          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
3569          {
3570              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3571          }
3572          else
3573          {
3574              return null;
3575          }
3576      }
3577  
3578  	function get_date($date_format = 'j F Y, g:i a')
3579      {
3580          if (!isset($this->data['date']))
3581          {
3582              if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published'))
3583              {
3584                  $this->data['date']['raw'] = $return[0]['data'];
3585              }
3586              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
3587              {
3588                  $this->data['date']['raw'] = $return[0]['data'];
3589              }
3590              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
3591              {
3592                  $this->data['date']['raw'] = $return[0]['data'];
3593              }
3594              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
3595              {
3596                  $this->data['date']['raw'] = $return[0]['data'];
3597              }
3598              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
3599              {
3600                  $this->data['date']['raw'] = $return[0]['data'];
3601              }
3602              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate'))
3603              {
3604                  $this->data['date']['raw'] = $return[0]['data'];
3605              }
3606              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
3607              {
3608                  $this->data['date']['raw'] = $return[0]['data'];
3609              }
3610              elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
3611              {
3612                  $this->data['date']['raw'] = $return[0]['data'];
3613              }
3614  
3615              if (!empty($this->data['date']['raw']))
3616              {
3617                  $parser = SimplePie_Parse_Date::get();
3618                  $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']);
3619              }
3620              else
3621              {
3622                  $this->data['date'] = null;
3623              }
3624          }
3625          if ($this->data['date'])
3626          {
3627              $date_format = (string) $date_format;
3628              switch ($date_format)
3629              {
3630                  case '':
3631                      return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);
3632  
3633                  case 'U':
3634                      return $this->data['date']['parsed'];
3635  
3636                  default:
3637                      return date($date_format, $this->data['date']['parsed']);
3638              }
3639          }
3640          else
3641          {
3642              return null;
3643          }
3644      }
3645  
3646  	function get_local_date($date_format = '%c')
3647      {
3648          if (!$date_format)
3649          {
3650              return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
3651          }
3652          elseif (($date = $this->get_date('U')) !== null && $date !== false)
3653          {
3654              return strftime($date_format, $date);
3655          }
3656          else
3657          {
3658              return null;
3659          }
3660      }
3661  
3662  	function get_permalink()
3663      {
3664          $link = $this->get_link();
3665          $enclosure = $this->get_enclosure(0);
3666          if ($link !== null)
3667          {
3668              return $link;
3669          }
3670          elseif ($enclosure !== null)
3671          {
3672              return $enclosure->get_link();
3673          }
3674          else
3675          {
3676              return null;
3677          }
3678      }
3679  
3680  	function get_link($key = 0, $rel = 'alternate')
3681      {
3682          $links = $this->get_links($rel);
3683          if ($links[$key] !== null)
3684          {
3685              return $links[$key];
3686          }
3687          else
3688          {
3689              return null;
3690          }
3691      }
3692  
3693  	function get_links($rel = 'alternate')
3694      {
3695          if (!isset($this->data['links']))
3696          {
3697              $this->data['links'] = array();
3698              foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
3699              {
3700                  if (isset($link['attribs']['']['href']))
3701                  {
3702                      $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
3703                      $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
3704  
3705                  }
3706              }
3707              foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
3708              {
3709                  if (isset($link['attribs']['']['href']))
3710                  {
3711                      $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
3712                      $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
3713                  }
3714              }
3715              if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
3716              {
3717                  $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
3718              }
3719              if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
3720              {
3721                  $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
3722              }
3723              if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
3724              {
3725                  $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
3726              }
3727              if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
3728              {
3729                  if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true')
3730                  {
3731                      $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
3732                  }
3733              }
3734  
3735              $keys = array_keys($this->data['links']);
3736              foreach ($keys as $key)
3737              {
3738                  if (SimplePie_Misc::is_isegment_nz_nc($key))
3739                  {
3740                      if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
3741                      {
3742                          $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
3743                          $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
3744                      }
3745                      else
3746                      {
3747                          $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
3748                      }
3749                  }
3750                  elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
3751                  {
3752                      $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
3753                  }
3754                  $this->data['links'][$key] = array_unique($this->data['links'][$key]);
3755              }
3756          }
3757          if (isset($this->data['links'][$rel]))
3758          {
3759              return $this->data['links'][$rel];
3760          }
3761          else
3762          {
3763              return null;
3764          }
3765      }
3766  
3767      /**
3768       * @todo Add ability to prefer one type of content over another (in a media group).
3769       */
3770  	function get_enclosure($key = 0, $prefer = null)
3771      {
3772          $enclosures = $this->get_enclosures();
3773          if (isset($enclosures[$key]))
3774          {
3775              return $enclosures[$key];
3776          }
3777          else
3778          {
3779              return null;
3780          }
3781      }
3782  
3783      /**
3784       * Grabs all available enclosures (podcasts, etc.)
3785       *
3786       * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.
3787       *
3788       * At this point, we're pretty much assuming that all enclosures for an item are the same content.  Anything else is too complicated to properly support.
3789       *
3790       * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4).
3791       * @todo If an element exists at a level, but it's value is empty, we should fall back to the value from the parent (if it exists).
3792       */
3793  	function get_enclosures()
3794      {
3795          if (!isset($this->data['enclosures']))
3796          {
3797              $this->data['enclosures'] = array();
3798  
3799              // Elements
3800              $captions_parent = null;
3801              $categories_parent = null;
3802              $copyrights_parent = null;
3803              $credits_parent = null;
3804              $description_parent = null;
3805              $duration_parent = null;
3806              $hashes_parent = null;
3807              $keywords_parent = null;
3808              $player_parent = null;
3809              $ratings_parent = null;
3810              $restrictions_parent = null;
3811              $thumbnails_parent = null;
3812              $title_parent = null;
3813  
3814              // Let's do the channel and item-level ones first, and just re-use them if we need to.
3815              $parent = $this->get_feed();
3816  
3817              // CAPTIONS
3818              if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
3819              {
3820                  foreach ($captions as $caption)
3821                  {
3822                      $caption_type = null;
3823                      $caption_lang = null;
3824                      $caption_startTime = null;
3825                      $caption_endTime = null;
3826                      $caption_text = null;
3827                      if (isset($caption['attribs']['']['type']))
3828                      {
3829                          $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
3830                      }
3831                      if (isset($caption['attribs']['']['lang']))
3832                      {
3833                          $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
3834                      }
3835                      if (isset($caption['attribs']['']['start']))
3836                      {
3837                          $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
3838                      }
3839                      if (isset($caption['attribs']['']['end']))
3840                      {
3841                          $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
3842                      }
3843                      if (isset($caption['data']))
3844                      {
3845                          $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3846                      }
3847                      $captions_parent[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
3848                  }
3849              }
3850              elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
3851              {
3852                  foreach ($captions as $caption)
3853                  {
3854                      $caption_type = null;
3855                      $caption_lang = null;
3856                      $caption_startTime = null;
3857                      $caption_endTime = null;
3858                      $caption_text = null;
3859                      if (isset($caption['attribs']['']['type']))
3860                      {
3861                          $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
3862                      }
3863                      if (isset($caption['attribs']['']['lang']))
3864                      {
3865                          $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
3866                      }
3867                      if (isset($caption['attribs']['']['start']))
3868                      {
3869                          $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
3870                      }
3871                      if (isset($caption['attribs']['']['end']))
3872                      {
3873                          $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
3874                      }
3875                      if (isset($caption['data']))
3876                      {
3877                          $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3878                      }
3879                      $captions_parent[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
3880                  }
3881              }
3882              if (is_array($captions_parent))
3883              {
3884                  $captions_parent = array_values(SimplePie_Misc::array_unique($captions_parent));
3885              }
3886  
3887              // CATEGORIES
3888              foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
3889              {
3890                  $term = null;
3891                  $scheme = null;
3892                  $label = null;
3893                  if (isset($category['data']))
3894                  {
3895                      $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3896                  }
3897                  if (isset($category['attribs']['']['scheme']))
3898                  {
3899                      $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
3900                  }
3901                  else
3902                  {
3903                      $scheme = 'http://search.yahoo.com/mrss/category_schema';
3904                  }
3905                  if (isset($category['attribs']['']['label']))
3906                  {
3907                      $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
3908                  }
3909                  $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
3910              }
3911              foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
3912              {
3913                  $term = null;
3914                  $scheme = null;
3915                  $label = null;
3916                  if (isset($category['data']))
3917                  {
3918                      $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3919                  }
3920                  if (isset($category['attribs']['']['scheme']))
3921                  {
3922                      $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
3923                  }
3924                  else
3925                  {
3926                      $scheme = 'http://search.yahoo.com/mrss/category_schema';
3927                  }
3928                  if (isset($category['attribs']['']['label']))
3929                  {
3930                      $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
3931                  }
3932                  $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
3933              }
3934              foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category)
3935              {
3936                  $term = null;
3937                  $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
3938                  $label = null;
3939                  if (isset($category['attribs']['']['text']))
3940                  {
3941                      $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
3942                  }
3943                  $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
3944  
3945                  if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category']))
3946                  {
3947                      foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory)
3948                      {
3949                          if (isset($subcategory['attribs']['']['text']))
3950                          {
3951                              $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
3952                          }
3953                          $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
3954                      }
3955                  }
3956              }
3957              if (is_array($categories_parent))
3958              {
3959                  $categories_parent = array_values(SimplePie_Misc::array_unique($categories_parent));
3960              }
3961  
3962              // COPYRIGHT
3963              if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
3964              {
3965                  $copyright_url = null;
3966                  $copyright_label = null;
3967                  if (isset($copyright[0]['attribs']['']['url']))
3968                  {
3969                      $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
3970                  }
3971                  if (isset($copyright[0]['data']))
3972                  {
3973                      $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3974                  }
3975                  $copyrights_parent =& new $this->feed->copyright_class($copyright_url, $copyright_label);
3976              }
3977              elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
3978              {
3979                  $copyright_url = null;
3980                  $copyright_label = null;
3981                  if (isset($copyright[0]['attribs']['']['url']))
3982                  {
3983                      $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
3984                  }
3985                  if (isset($copyright[0]['data']))
3986                  {
3987                      $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
3988                  }
3989                  $copyrights_parent =& new $this->feed->copyright_class($copyright_url, $copyright_label);
3990              }
3991  
3992              // CREDITS
3993              if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
3994              {
3995                  foreach ($credits as $credit)
3996                  {
3997                      $credit_role = null;
3998                      $credit_scheme = null;
3999                      $credit_name = null;
4000                      if (isset($credit['attribs']['']['role']))
4001                      {
4002                          $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
4003                      }
4004                      if (isset($credit['attribs']['']['scheme']))
4005                      {
4006                          $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
4007                      }
4008                      else
4009                      {
4010                          $credit_scheme = 'urn:ebu';
4011                      }
4012                      if (isset($credit['data']))
4013                      {
4014                          $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4015                      }
4016                      $credits_parent[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
4017                  }
4018              }
4019              elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
4020              {
4021                  foreach ($credits as $credit)
4022                  {
4023                      $credit_role = null;
4024                      $credit_scheme = null;
4025                      $credit_name = null;
4026                      if (isset($credit['attribs']['']['role']))
4027                      {
4028                          $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
4029                      }
4030                      if (isset($credit['attribs']['']['scheme']))
4031                      {
4032                          $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
4033                      }
4034                      else
4035                      {
4036                          $credit_scheme = 'urn:ebu';
4037                      }
4038                      if (isset($credit['data']))
4039                      {
4040                          $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4041                      }
4042                      $credits_parent[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
4043                  }
4044              }
4045              if (is_array($credits_parent))
4046              {
4047                  $credits_parent = array_values(SimplePie_Misc::array_unique($credits_parent));
4048              }
4049  
4050              // DESCRIPTION
4051              if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
4052              {
4053                  if (isset($description_parent[0]['data']))
4054                  {
4055                      $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4056                  }
4057              }
4058              elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
4059              {
4060                  if (isset($description_parent[0]['data']))
4061                  {
4062                      $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4063                  }
4064              }
4065  
4066              // DURATION
4067              if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration'))
4068              {
4069                  $seconds = null;
4070                  $minutes = null;
4071                  $hours = null;
4072                  if (isset($duration_parent[0]['data']))
4073                  {
4074                      $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
4075                      if (sizeof($temp) > 0)
4076                      {
4077                          $seconds = (int) array_pop($temp);
4078                      }
4079                      if (sizeof($temp) > 0)
4080                      {
4081                          $minutes = (int) array_pop($temp);
4082                          $seconds += $minutes * 60;
4083                      }
4084                      if (sizeof($temp) > 0)
4085                      {
4086                          $hours = (int) array_pop($temp);
4087                          $seconds += $hours * 3600;
4088                      }
4089                      unset($temp);
4090                      $duration_parent = $seconds;
4091                  }
4092              }
4093  
4094              // HASHES
4095              if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
4096              {
4097                  foreach ($hashes_iterator as $hash)
4098                  {
4099                      $value = null;
4100                      $algo = null;
4101                      if (isset($hash['data']))
4102                      {
4103                          $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4104                      }
4105                      if (isset($hash['attribs']['']['algo']))
4106                      {
4107                          $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
4108                      }
4109                      else
4110                      {
4111                          $algo = 'md5';
4112                      }
4113                      $hashes_parent[] = $algo.':'.$value;
4114                  }
4115              }
4116              elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
4117              {
4118                  foreach ($hashes_iterator as $hash)
4119                  {
4120                      $value = null;
4121                      $algo = null;
4122                      if (isset($hash['data']))
4123                      {
4124                          $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4125                      }
4126                      if (isset($hash['attribs']['']['algo']))
4127                      {
4128                          $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
4129                      }
4130                      else
4131                      {
4132                          $algo = 'md5';
4133                      }
4134                      $hashes_parent[] = $algo.':'.$value;
4135                  }
4136              }
4137              if (is_array($hashes_parent))
4138              {
4139                  $hashes_parent = array_values(SimplePie_Misc::array_unique($hashes_parent));
4140              }
4141  
4142              // KEYWORDS
4143              if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
4144              {
4145                  if (isset($keywords[0]['data']))
4146                  {
4147                      $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
4148                      foreach ($temp as $word)
4149                      {
4150                          $keywords_parent[] = trim($word);
4151                      }
4152                  }
4153                  unset($temp);
4154              }
4155              elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
4156              {
4157                  if (isset($keywords[0]['data']))
4158                  {
4159                      $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
4160                      foreach ($temp as $word)
4161                      {
4162                          $keywords_parent[] = trim($word);
4163                      }
4164                  }
4165                  unset($temp);
4166              }
4167              elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
4168              {
4169                  if (isset($keywords[0]['data']))
4170                  {
4171                      $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
4172                      foreach ($temp as $word)
4173                      {
4174                          $keywords_parent[] = trim($word);
4175                      }
4176                  }
4177                  unset($temp);
4178              }
4179              elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
4180              {
4181                  if (isset($keywords[0]['data']))
4182                  {
4183                      $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
4184                      foreach ($temp as $word)
4185                      {
4186                          $keywords_parent[] = trim($word);
4187                      }
4188                  }
4189                  unset($temp);
4190              }
4191              if (is_array($keywords_parent))
4192              {
4193                  $keywords_parent = array_values(SimplePie_Misc::array_unique($keywords_parent));
4194              }
4195  
4196              // PLAYER
4197              if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
4198              {
4199                  if (isset($player_parent[0]['attribs']['']['url']))
4200                  {
4201                      $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
4202                  }
4203              }
4204              elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
4205              {
4206                  if (isset($player_parent[0]['attribs']['']['url']))
4207                  {
4208                      $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
4209                  }
4210              }
4211  
4212              // RATINGS
4213              if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
4214              {
4215                  foreach ($ratings as $rating)
4216                  {
4217                      $rating_scheme = null;
4218                      $rating_value = null;
4219                      if (isset($rating['attribs']['']['scheme']))
4220                      {
4221                          $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
4222                      }
4223                      else
4224                      {
4225                          $rating_scheme = 'urn:simple';
4226                      }
4227                      if (isset($rating['data']))
4228                      {
4229                          $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4230                      }
4231                      $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
4232                  }
4233              }
4234              elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
4235              {
4236                  foreach ($ratings as $rating)
4237                  {
4238                      $rating_scheme = 'urn:itunes';
4239                      $rating_value = null;
4240                      if (isset($rating['data']))
4241                      {
4242                          $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4243                      }
4244                      $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
4245                  }
4246              }
4247              elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
4248              {
4249                  foreach ($ratings as $rating)
4250                  {
4251                      $rating_scheme = null;
4252                      $rating_value = null;
4253                      if (isset($rating['attribs']['']['scheme']))
4254                      {
4255                          $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
4256                      }
4257                      else
4258                      {
4259                          $rating_scheme = 'urn:simple';
4260                      }
4261                      if (isset($rating['data']))
4262                      {
4263                          $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4264                      }
4265                      $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
4266                  }
4267              }
4268              elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
4269              {
4270                  foreach ($ratings as $rating)
4271                  {
4272                      $rating_scheme = 'urn:itunes';
4273                      $rating_value = null;
4274                      if (isset($rating['data']))
4275                      {
4276                          $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4277                      }
4278                      $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
4279                  }
4280              }
4281              if (is_array($ratings_parent))
4282              {
4283                  $ratings_parent = array_values(SimplePie_Misc::array_unique($ratings_parent));
4284              }
4285  
4286              // RESTRICTIONS
4287              if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
4288              {
4289                  foreach ($restrictions as $restriction)
4290                  {
4291                      $restriction_relationship = null;
4292                      $restriction_type = null;
4293                      $restriction_value = null;
4294                      if (isset($restriction['attribs']['']['relationship']))
4295                      {
4296                          $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
4297                      }
4298                      if (isset($restriction['attribs']['']['type']))
4299                      {
4300                          $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
4301                      }
4302                      if (isset($restriction['data']))
4303                      {
4304                          $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4305                      }
4306                      $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
4307                  }
4308              }
4309              elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
4310              {
4311                  foreach ($restrictions as $restriction)
4312                  {
4313                      $restriction_relationship = 'allow';
4314                      $restriction_type = null;
4315                      $restriction_value = 'itunes';
4316                      if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
4317                      {
4318                          $restriction_relationship = 'deny';
4319                      }
4320                      $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
4321                  }
4322              }
4323              elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
4324              {
4325                  foreach ($restrictions as $restriction)
4326                  {
4327                      $restriction_relationship = null;
4328                      $restriction_type = null;
4329                      $restriction_value = null;
4330                      if (isset($restriction['attribs']['']['relationship']))
4331                      {
4332                          $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
4333                      }
4334                      if (isset($restriction['attribs']['']['type']))
4335                      {
4336                          $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
4337                      }
4338                      if (isset($restriction['data']))
4339                      {
4340                          $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4341                      }
4342                      $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
4343                  }
4344              }
4345              elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
4346              {
4347                  foreach ($restrictions as $restriction)
4348                  {
4349                      $restriction_relationship = 'allow';
4350                      $restriction_type = null;
4351                      $restriction_value = 'itunes';
4352                      if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
4353                      {
4354                          $restriction_relationship = 'deny';
4355                      }
4356                      $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
4357                  }
4358              }
4359              if (is_array($restrictions_parent))
4360              {
4361                  $restrictions_parent = array_values(SimplePie_Misc::array_unique($restrictions_parent));
4362              }
4363  
4364              // THUMBNAILS
4365              if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
4366              {
4367                  foreach ($thumbnails as $thumbnail)
4368                  {
4369                      if (isset($thumbnail['attribs']['']['url']))
4370                      {
4371                          $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
4372                      }
4373                  }
4374              }
4375              elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
4376              {
4377                  foreach ($thumbnails as $thumbnail)
4378                  {
4379                      if (isset($thumbnail['attribs']['']['url']))
4380                      {
4381                          $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
4382                      }
4383                  }
4384              }
4385  
4386              // TITLES
4387              if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
4388              {
4389                  if (isset($title_parent[0]['data']))
4390                  {
4391                      $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4392                  }
4393              }
4394              elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
4395              {
4396                  if (isset($title_parent[0]['data']))
4397                  {
4398                      $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4399                  }
4400              }
4401  
4402              // Clear the memory
4403              unset($parent);
4404  
4405              // Attributes
4406              $bitrate = null;
4407              $channels = null;
4408              $duration = null;
4409              $expression = null;
4410              $framerate = null;
4411              $height = null;
4412              $javascript = null;
4413              $lang = null;
4414              $length = null;
4415              $medium = null;
4416              $samplingrate = null;
4417              $type = null;
4418              $url = null;
4419              $width = null;
4420  
4421              // Elements
4422              $captions = null;
4423              $categories = null;
4424              $copyrights = null;
4425              $credits = null;
4426              $description = null;
4427              $hashes = null;
4428              $keywords = null;
4429              $player = null;
4430              $ratings = null;
4431              $restrictions = null;
4432              $thumbnails = null;
4433              $title = null;
4434  
4435              // If we have media:group tags, loop through them.
4436              foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
4437              {
4438                  if(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
4439                  {
4440                      // If we have media:content tags, loop through them.
4441                      foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
4442                      {
4443                          if (isset($content['attribs']['']['url']))
4444                          {
4445                              // Attributes
4446                              $bitrate = null;
4447                              $channels = null;
4448                              $duration = null;
4449                              $expression = null;
4450                              $framerate = null;
4451                              $height = null;
4452                              $javascript = null;
4453                              $lang = null;
4454                              $length = null;
4455                              $medium = null;
4456                              $samplingrate = null;
4457                              $type = null;
4458                              $url = null;
4459                              $width = null;
4460  
4461                              // Elements
4462                              $captions = null;
4463                              $categories = null;
4464                              $copyrights = null;
4465                              $credits = null;
4466                              $description = null;
4467                              $hashes = null;
4468                              $keywords = null;
4469                              $player = null;
4470                              $ratings = null;
4471                              $restrictions = null;
4472                              $thumbnails = null;
4473                              $title = null;
4474  
4475                              // Start checking the attributes of media:content
4476                              if (isset($content['attribs']['']['bitrate']))
4477                              {
4478                                  $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
4479                              }
4480                              if (isset($content['attribs']['']['channels']))
4481                              {
4482                                  $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
4483                              }
4484                              if (isset($content['attribs']['']['duration']))
4485                              {
4486                                  $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
4487                              }
4488                              else
4489                              {
4490                                  $duration = $duration_parent;
4491                              }
4492                              if (isset($content['attribs']['']['expression']))
4493                              {
4494                                  $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
4495                              }
4496                              if (isset($content['attribs']['']['framerate']))
4497                              {
4498                                  $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
4499                              }
4500                              if (isset($content['attribs']['']['height']))
4501                              {
4502                                  $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
4503                              }
4504                              if (isset($content['attribs']['']['lang']))
4505                              {
4506                                  $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
4507                              }
4508                              if (isset($content['attribs']['']['fileSize']))
4509                              {
4510                                  $length = ceil($content['attribs']['']['fileSize']);
4511                              }
4512                              if (isset($content['attribs']['']['medium']))
4513                              {
4514                                  $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
4515                              }
4516                              if (isset($content['attribs']['']['samplingrate']))
4517                              {
4518                                  $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
4519                              }
4520                              if (isset($content['attribs']['']['type']))
4521                              {
4522                                  $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
4523                              }
4524                              if (isset($content['attribs']['']['width']))
4525                              {
4526                                  $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
4527                              }
4528                              $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
4529  
4530                              // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
4531  
4532                              // CAPTIONS
4533                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
4534                              {
4535                                  foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
4536                                  {
4537                                      $caption_type = null;
4538                                      $caption_lang = null;
4539                                      $caption_startTime = null;
4540                                      $caption_endTime = null;
4541                                      $caption_text = null;
4542                                      if (isset($caption['attribs']['']['type']))
4543                                      {
4544                                          $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
4545                                      }
4546                                      if (isset($caption['attribs']['']['lang']))
4547                                      {
4548                                          $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
4549                                      }
4550                                      if (isset($caption['attribs']['']['start']))
4551                                      {
4552                                          $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
4553                                      }
4554                                      if (isset($caption['attribs']['']['end']))
4555                                      {
4556                                          $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
4557                                      }
4558                                      if (isset($caption['data']))
4559                                      {
4560                                          $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4561                                      }
4562                                      $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
4563                                  }
4564                                  if (is_array($captions))
4565                                  {
4566                                      $captions = array_values(SimplePie_Misc::array_unique($captions));
4567                                  }
4568                              }
4569                              elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
4570                              {
4571                                  foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
4572                                  {
4573                                      $caption_type = null;
4574                                      $caption_lang = null;
4575                                      $caption_startTime = null;
4576                                      $caption_endTime = null;
4577                                      $caption_text = null;
4578                                      if (isset($caption['attribs']['']['type']))
4579                                      {
4580                                          $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
4581                                      }
4582                                      if (isset($caption['attribs']['']['lang']))
4583                                      {
4584                                          $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
4585                                      }
4586                                      if (isset($caption['attribs']['']['start']))
4587                                      {
4588                                          $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
4589                                      }
4590                                      if (isset($caption['attribs']['']['end']))
4591                                      {
4592                                          $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
4593                                      }
4594                                      if (isset($caption['data']))
4595                                      {
4596                                          $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4597                                      }
4598                                      $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
4599                                  }
4600                                  if (is_array($captions))
4601                                  {
4602                                      $captions = array_values(SimplePie_Misc::array_unique($captions));
4603                                  }
4604                              }
4605                              else
4606                              {
4607                                  $captions = $captions_parent;
4608                              }
4609  
4610                              // CATEGORIES
4611                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
4612                              {
4613                                  foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
4614                                  {
4615                                      $term = null;
4616                                      $scheme = null;
4617                                      $label = null;
4618                                      if (isset($category['data']))
4619                                      {
4620                                          $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4621                                      }
4622                                      if (isset($category['attribs']['']['scheme']))
4623                                      {
4624                                          $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
4625                                      }
4626                                      else
4627                                      {
4628                                          $scheme = 'http://search.yahoo.com/mrss/category_schema';
4629                                      }
4630                                      if (isset($category['attribs']['']['label']))
4631                                      {
4632                                          $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
4633                                      }
4634                                      $categories[] =& new $this->feed->category_class($term, $scheme, $label);
4635                                  }
4636                              }
4637                              if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
4638                              {
4639                                  foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
4640                                  {
4641                                      $term = null;
4642                                      $scheme = null;
4643                                      $label = null;
4644                                      if (isset($category['data']))
4645                                      {
4646                                          $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4647                                      }
4648                                      if (isset($category['attribs']['']['scheme']))
4649                                      {
4650                                          $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
4651                                      }
4652                                      else
4653                                      {
4654                                          $scheme = 'http://search.yahoo.com/mrss/category_schema';
4655                                      }
4656                                      if (isset($category['attribs']['']['label']))
4657                                      {
4658                                          $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
4659                                      }
4660                                      $categories[] =& new $this->feed->category_class($term, $scheme, $label);
4661                                  }
4662                              }
4663                              if (is_array($categories) && is_array($categories_parent))
4664                              {
4665                                  $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent)));
4666                              }
4667                              elseif (is_array($categories))
4668                              {
4669                                  $categories = array_values(SimplePie_Misc::array_unique($categories));
4670                              }
4671                              elseif (is_array($categories_parent))
4672                              {
4673                                  $categories = array_values(SimplePie_Misc::array_unique($categories_parent));
4674                              }
4675  
4676                              // COPYRIGHTS
4677                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
4678                              {
4679                                  $copyright_url = null;
4680                                  $copyright_label = null;
4681                                  if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
4682                                  {
4683                                      $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
4684                                  }
4685                                  if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
4686                                  {
4687                                      $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4688                                  }
4689                                  $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label);
4690                              }
4691                              elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
4692                              {
4693                                  $copyright_url = null;
4694                                  $copyright_label = null;
4695                                  if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
4696                                  {
4697                                      $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
4698                                  }
4699                                  if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
4700                                  {
4701                                      $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4702                                  }
4703                                  $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label);
4704                              }
4705                              else
4706                              {
4707                                  $copyrights = $copyrights_parent;
4708                              }
4709  
4710                              // CREDITS
4711                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
4712                              {
4713                                  foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
4714                                  {
4715                                      $credit_role = null;
4716                                      $credit_scheme = null;
4717                                      $credit_name = null;
4718                                      if (isset($credit['attribs']['']['role']))
4719                                      {
4720                                          $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
4721                                      }
4722                                      if (isset($credit['attribs']['']['scheme']))
4723                                      {
4724                                          $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
4725                                      }
4726                                      else
4727                                      {
4728                                          $credit_scheme = 'urn:ebu';
4729                                      }
4730                                      if (isset($credit['data']))
4731                                      {
4732                                          $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4733                                      }
4734                                      $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
4735                                  }
4736                                  if (is_array($credits))
4737                                  {
4738                                      $credits = array_values(SimplePie_Misc::array_unique($credits));
4739                                  }
4740                              }
4741                              elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
4742                              {
4743                                  foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
4744                                  {
4745                                      $credit_role = null;
4746                                      $credit_scheme = null;
4747                                      $credit_name = null;
4748                                      if (isset($credit['attribs']['']['role']))
4749                                      {
4750                                          $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
4751                                      }
4752                                      if (isset($credit['attribs']['']['scheme']))
4753                                      {
4754                                          $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
4755                                      }
4756                                      else
4757                                      {
4758                                          $credit_scheme = 'urn:ebu';
4759                                      }
4760                                      if (isset($credit['data']))
4761                                      {
4762                                          $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4763                                      }
4764                                      $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
4765                                  }
4766                                  if (is_array($credits))
4767                                  {
4768                                      $credits = array_values(SimplePie_Misc::array_unique($credits));
4769                                  }
4770                              }
4771                              else
4772                              {
4773                                  $credits = $credits_parent;
4774                              }
4775  
4776                              // DESCRIPTION
4777                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
4778                              {
4779                                  $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4780                              }
4781                              elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
4782                              {
4783                                  $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4784                              }
4785                              else
4786                              {
4787                                  $description = $description_parent;
4788                              }
4789  
4790                              // HASHES
4791                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
4792                              {
4793                                  foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
4794                                  {
4795                                      $value = null;
4796                                      $algo = null;
4797                                      if (isset($hash['data']))
4798                                      {
4799                                          $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4800                                      }
4801                                      if (isset($hash['attribs']['']['algo']))
4802                                      {
4803                                          $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
4804                                      }
4805                                      else
4806                                      {
4807                                          $algo = 'md5';
4808                                      }
4809                                      $hashes[] = $algo.':'.$value;
4810                                  }
4811                                  if (is_array($hashes))
4812                                  {
4813                                      $hashes = array_values(SimplePie_Misc::array_unique($hashes));
4814                                  }
4815                              }
4816                              elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
4817                              {
4818                                  foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
4819                                  {
4820                                      $value = null;
4821                                      $algo = null;
4822                                      if (isset($hash['data']))
4823                                      {
4824                                          $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4825                                      }
4826                                      if (isset($hash['attribs']['']['algo']))
4827                                      {
4828                                          $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
4829                                      }
4830                                      else
4831                                      {
4832                                          $algo = 'md5';
4833                                      }
4834                                      $hashes[] = $algo.':'.$value;
4835                                  }
4836                                  if (is_array($hashes))
4837                                  {
4838                                      $hashes = array_values(SimplePie_Misc::array_unique($hashes));
4839                                  }
4840                              }
4841                              else
4842                              {
4843                                  $hashes = $hashes_parent;
4844                              }
4845  
4846                              // KEYWORDS
4847                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
4848                              {
4849                                  if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
4850                                  {
4851                                      $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
4852                                      foreach ($temp as $word)
4853                                      {
4854                                          $keywords[] = trim($word);
4855                                      }
4856                                      unset($temp);
4857                                  }
4858                                  if (is_array($keywords))
4859                                  {
4860                                      $keywords = array_values(SimplePie_Misc::array_unique($keywords));
4861                                  }
4862                              }
4863                              elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
4864                              {
4865                                  if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
4866                                  {
4867                                      $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
4868                                      foreach ($temp as $word)
4869                                      {
4870                                          $keywords[] = trim($word);
4871                                      }
4872                                      unset($temp);
4873                                  }
4874                                  if (is_array($keywords))
4875                                  {
4876                                      $keywords = array_values(SimplePie_Misc::array_unique($keywords));
4877                                  }
4878                              }
4879                              else
4880                              {
4881                                  $keywords = $keywords_parent;
4882                              }
4883  
4884                              // PLAYER
4885                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
4886                              {
4887                                  $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
4888                              }
4889                              elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
4890                              {
4891                                  $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
4892                              }
4893                              else
4894                              {
4895                                  $player = $player_parent;
4896                              }
4897  
4898                              // RATINGS
4899                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
4900                              {
4901                                  foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
4902                                  {
4903                                      $rating_scheme = null;
4904                                      $rating_value = null;
4905                                      if (isset($rating['attribs']['']['scheme']))
4906                                      {
4907                                          $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
4908                                      }
4909                                      else
4910                                      {
4911                                          $rating_scheme = 'urn:simple';
4912                                      }
4913                                      if (isset($rating['data']))
4914                                      {
4915                                          $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4916                                      }
4917                                      $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
4918                                  }
4919                                  if (is_array($ratings))
4920                                  {
4921                                      $ratings = array_values(SimplePie_Misc::array_unique($ratings));
4922                                  }
4923                              }
4924                              elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
4925                              {
4926                                  foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
4927                                  {
4928                                      $rating_scheme = null;
4929                                      $rating_value = null;
4930                                      if (isset($rating['attribs']['']['scheme']))
4931                                      {
4932                                          $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
4933                                      }
4934                                      else
4935                                      {
4936                                          $rating_scheme = 'urn:simple';
4937                                      }
4938                                      if (isset($rating['data']))
4939                                      {
4940                                          $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4941                                      }
4942                                      $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
4943                                  }
4944                                  if (is_array($ratings))
4945                                  {
4946                                      $ratings = array_values(SimplePie_Misc::array_unique($ratings));
4947                                  }
4948                              }
4949                              else
4950                              {
4951                                  $ratings = $ratings_parent;
4952                              }
4953  
4954                              // RESTRICTIONS
4955                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
4956                              {
4957                                  foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
4958                                  {
4959                                      $restriction_relationship = null;
4960                                      $restriction_type = null;
4961                                      $restriction_value = null;
4962                                      if (isset($restriction['attribs']['']['relationship']))
4963                                      {
4964                                          $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
4965                                      }
4966                                      if (isset($restriction['attribs']['']['type']))
4967                                      {
4968                                          $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
4969                                      }
4970                                      if (isset($restriction['data']))
4971                                      {
4972                                          $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4973                                      }
4974                                      $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
4975                                  }
4976                                  if (is_array($restrictions))
4977                                  {
4978                                      $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
4979                                  }
4980                              }
4981                              elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
4982                              {
4983                                  foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
4984                                  {
4985                                      $restriction_relationship = null;
4986                                      $restriction_type = null;
4987                                      $restriction_value = null;
4988                                      if (isset($restriction['attribs']['']['relationship']))
4989                                      {
4990                                          $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
4991                                      }
4992                                      if (isset($restriction['attribs']['']['type']))
4993                                      {
4994                                          $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
4995                                      }
4996                                      if (isset($restriction['data']))
4997                                      {
4998                                          $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
4999                                      }
5000                                      $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
5001                                  }
5002                                  if (is_array($restrictions))
5003                                  {
5004                                      $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
5005                                  }
5006                              }
5007                              else
5008                              {
5009                                  $restrictions = $restrictions_parent;
5010                              }
5011  
5012                              // THUMBNAILS
5013                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
5014                              {
5015                                  foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
5016                                  {
5017                                      $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
5018                                  }
5019                                  if (is_array($thumbnails))
5020                                  {
5021                                      $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
5022                                  }
5023                              }
5024                              elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
5025                              {
5026                                  foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
5027                                  {
5028                                      $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
5029                                  }
5030                                  if (is_array($thumbnails))
5031                                  {
5032                                      $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
5033                                  }
5034                              }
5035                              else
5036                              {
5037                                  $thumbnails = $thumbnails_parent;
5038                              }
5039  
5040                              // TITLES
5041                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
5042                              {
5043                                  $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5044                              }
5045                              elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
5046                              {
5047                                  $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5048                              }
5049                              else
5050                              {
5051                                  $title = $title_parent;
5052                              }
5053  
5054                              $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width);
5055                          }
5056                      }
5057                  }
5058              }
5059  
5060              // If we have standalone media:content tags, loop through them.
5061              if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
5062              {
5063                  foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
5064                  {
5065                      if (isset($content['attribs']['']['url']) || isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
5066                      {
5067                          // Attributes
5068                          $bitrate = null;
5069                          $channels = null;
5070                          $duration = null;
5071                          $expression = null;
5072                          $framerate = null;
5073                          $height = null;
5074                          $javascript = null;
5075                          $lang = null;
5076                          $length = null;
5077                          $medium = null;
5078                          $samplingrate = null;
5079                          $type = null;
5080                          $url = null;
5081                          $width = null;
5082  
5083                          // Elements
5084                          $captions = null;
5085                          $categories = null;
5086                          $copyrights = null;
5087                          $credits = null;
5088                          $description = null;
5089                          $hashes = null;
5090                          $keywords = null;
5091                          $player = null;
5092                          $ratings = null;
5093                          $restrictions = null;
5094                          $thumbnails = null;
5095                          $title = null;
5096  
5097                          // Start checking the attributes of media:content
5098                          if (isset($content['attribs']['']['bitrate']))
5099                          {
5100                              $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
5101                          }
5102                          if (isset($content['attribs']['']['channels']))
5103                          {
5104                              $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
5105                          }
5106                          if (isset($content['attribs']['']['duration']))
5107                          {
5108                              $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
5109                          }
5110                          else
5111                          {
5112                              $duration = $duration_parent;
5113                          }
5114                          if (isset($content['attribs']['']['expression']))
5115                          {
5116                              $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
5117                          }
5118                          if (isset($content['attribs']['']['framerate']))
5119                          {
5120                              $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
5121                          }
5122                          if (isset($content['attribs']['']['height']))
5123                          {
5124                              $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
5125                          }
5126                          if (isset($content['attribs']['']['lang']))
5127                          {
5128                              $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
5129                          }
5130                          if (isset($content['attribs']['']['fileSize']))
5131                          {
5132                              $length = ceil($content['attribs']['']['fileSize']);
5133                          }
5134                          if (isset($content['attribs']['']['medium']))
5135                          {
5136                              $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
5137                          }
5138                          if (isset($content['attribs']['']['samplingrate']))
5139                          {
5140                              $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
5141                          }
5142                          if (isset($content['attribs']['']['type']))
5143                          {
5144                              $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
5145                          }
5146                          if (isset($content['attribs']['']['width']))
5147                          {
5148                              $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
5149                          }
5150                          if (isset($content['attribs']['']['url']))
5151                          {
5152                              $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
5153                          }
5154                          // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
5155  
5156                          // CAPTIONS
5157                          if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
5158                          {
5159                              foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
5160                              {
5161                                  $caption_type = null;
5162                                  $caption_lang = null;
5163                                  $caption_startTime = null;
5164                                  $caption_endTime = null;
5165                                  $caption_text = null;
5166                                  if (isset($caption['attribs']['']['type']))
5167                                  {
5168                                      $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
5169                                  }
5170                                  if (isset($caption['attribs']['']['lang']))
5171                                  {
5172                                      $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
5173                                  }
5174                                  if (isset($caption['attribs']['']['start']))
5175                                  {
5176                                      $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
5177                                  }
5178                                  if (isset($caption['attribs']['']['end']))
5179                                  {
5180                                      $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
5181                                  }
5182                                  if (isset($caption['data']))
5183                                  {
5184                                      $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5185                                  }
5186                                  $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
5187                              }
5188                              if (is_array($captions))
5189                              {
5190                                  $captions = array_values(SimplePie_Misc::array_unique($captions));
5191                              }
5192                          }
5193                          else
5194                          {
5195                              $captions = $captions_parent;
5196                          }
5197  
5198                          // CATEGORIES
5199                          if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
5200                          {
5201                              foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
5202                              {
5203                                  $term = null;
5204                                  $scheme = null;
5205                                  $label = null;
5206                                  if (isset($category['data']))
5207                                  {
5208                                      $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5209                                  }
5210                                  if (isset($category['attribs']['']['scheme']))
5211                                  {
5212                                      $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
5213                                  }
5214                                  else
5215                                  {
5216                                      $scheme = 'http://search.yahoo.com/mrss/category_schema';
5217                                  }
5218                                  if (isset($category['attribs']['']['label']))
5219                                  {
5220                                      $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
5221                                  }
5222                                  $categories[] =& new $this->feed->category_class($term, $scheme, $label);
5223                              }
5224                          }
5225                          if (is_array($categories) && is_array($categories_parent))
5226                          {
5227                              $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent)));
5228                          }
5229                          elseif (is_array($categories))
5230                          {
5231                              $categories = array_values(SimplePie_Misc::array_unique($categories));
5232                          }
5233                          elseif (is_array($categories_parent))
5234                          {
5235                              $categories = array_values(SimplePie_Misc::array_unique($categories_parent));
5236                          }
5237                          else
5238                          {
5239                              $categories = null;
5240                          }
5241  
5242                          // COPYRIGHTS
5243                          if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
5244                          {
5245                              $copyright_url = null;
5246                              $copyright_label = null;
5247                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
5248                              {
5249                                  $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
5250                              }
5251                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
5252                              {
5253                                  $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5254                              }
5255                              $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label);
5256                          }
5257                          else
5258                          {
5259                              $copyrights = $copyrights_parent;
5260                          }
5261  
5262                          // CREDITS
5263                          if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
5264                          {
5265                              foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
5266                              {
5267                                  $credit_role = null;
5268                                  $credit_scheme = null;
5269                                  $credit_name = null;
5270                                  if (isset($credit['attribs']['']['role']))
5271                                  {
5272                                      $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
5273                                  }
5274                                  if (isset($credit['attribs']['']['scheme']))
5275                                  {
5276                                      $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
5277                                  }
5278                                  else
5279                                  {
5280                                      $credit_scheme = 'urn:ebu';
5281                                  }
5282                                  if (isset($credit['data']))
5283                                  {
5284                                      $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5285                                  }
5286                                  $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
5287                              }
5288                              if (is_array($credits))
5289                              {
5290                                  $credits = array_values(SimplePie_Misc::array_unique($credits));
5291                              }
5292                          }
5293                          else
5294                          {
5295                              $credits = $credits_parent;
5296                          }
5297  
5298                          // DESCRIPTION
5299                          if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
5300                          {
5301                              $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5302                          }
5303                          else
5304                          {
5305                              $description = $description_parent;
5306                          }
5307  
5308                          // HASHES
5309                          if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
5310                          {
5311                              foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
5312                              {
5313                                  $value = null;
5314                                  $algo = null;
5315                                  if (isset($hash['data']))
5316                                  {
5317                                      $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5318                                  }
5319                                  if (isset($hash['attribs']['']['algo']))
5320                                  {
5321                                      $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
5322                                  }
5323                                  else
5324                                  {
5325                                      $algo = 'md5';
5326                                  }
5327                                  $hashes[] = $algo.':'.$value;
5328                              }
5329                              if (is_array($hashes))
5330                              {
5331                                  $hashes = array_values(SimplePie_Misc::array_unique($hashes));
5332                              }
5333                          }
5334                          else
5335                          {
5336                              $hashes = $hashes_parent;
5337                          }
5338  
5339                          // KEYWORDS
5340                          if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
5341                          {
5342                              if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
5343                              {
5344                                  $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
5345                                  foreach ($temp as $word)
5346                                  {
5347                                      $keywords[] = trim($word);
5348                                  }
5349                                  unset($temp);
5350                              }
5351                              if (is_array($keywords))
5352                              {
5353                                  $keywords = array_values(SimplePie_Misc::array_unique($keywords));
5354                              }
5355                          }
5356                          else
5357                          {
5358                              $keywords = $keywords_parent;
5359                          }
5360  
5361                          // PLAYER
5362                          if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
5363                          {
5364                              $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
5365                          }
5366                          else
5367                          {
5368                              $player = $player_parent;
5369                          }
5370  
5371                          // RATINGS
5372                          if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
5373                          {
5374                              foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
5375                              {
5376                                  $rating_scheme = null;
5377                                  $rating_value = null;
5378                                  if (isset($rating['attribs']['']['scheme']))
5379                                  {
5380                                      $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
5381                                  }
5382                                  else
5383                                  {
5384                                      $rating_scheme = 'urn:simple';
5385                                  }
5386                                  if (isset($rating['data']))
5387                                  {
5388                                      $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5389                                  }
5390                                  $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
5391                              }
5392                              if (is_array($ratings))
5393                              {
5394                                  $ratings = array_values(SimplePie_Misc::array_unique($ratings));
5395                              }
5396                          }
5397                          else
5398                          {
5399                              $ratings = $ratings_parent;
5400                          }
5401  
5402                          // RESTRICTIONS
5403                          if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
5404                          {
5405                              foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
5406                              {
5407                                  $restriction_relationship = null;
5408                                  $restriction_type = null;
5409                                  $restriction_value = null;
5410                                  if (isset($restriction['attribs']['']['relationship']))
5411                                  {
5412                                      $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
5413                                  }
5414                                  if (isset($restriction['attribs']['']['type']))
5415                                  {
5416                                      $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
5417                                  }
5418                                  if (isset($restriction['data']))
5419                                  {
5420                                      $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5421                                  }
5422                                  $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
5423                              }
5424                              if (is_array($restrictions))
5425                              {
5426                                  $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
5427                              }
5428                          }
5429                          else
5430                          {
5431                              $restrictions = $restrictions_parent;
5432                          }
5433  
5434                          // THUMBNAILS
5435                          if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
5436                          {
5437                              foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
5438                              {
5439                                  $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
5440                              }
5441                              if (is_array($thumbnails))
5442                              {
5443                                  $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
5444                              }
5445                          }
5446                          else
5447                          {
5448                              $thumbnails = $thumbnails_parent;
5449                          }
5450  
5451                          // TITLES
5452                          if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
5453                          {
5454                              $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5455                          }
5456                          else
5457                          {
5458                              $title = $title_parent;
5459                          }
5460  
5461                          $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width);
5462                      }
5463                  }
5464              }
5465  
5466              foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
5467              {
5468                  if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')
5469                  {
5470                      // Attributes
5471                      $bitrate = null;
5472                      $channels = null;
5473                      $duration = null;
5474                      $expression = null;
5475                      $framerate = null;
5476                      $height = null;
5477                      $javascript = null;
5478                      $lang = null;
5479                      $length = null;
5480                      $medium = null;
5481                      $samplingrate = null;
5482                      $type = null;
5483                      $url = null;
5484                      $width = null;
5485  
5486                      $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
5487                      if (isset($link['attribs']['']['type']))
5488                      {
5489                          $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
5490                      }
5491                      if (isset($link['attribs']['']['length']))
5492                      {
5493                          $length = ceil($link['attribs']['']['length']);
5494                      }
5495  
5496                      // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
5497                      $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
5498                  }
5499              }
5500  
5501              foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
5502              {
5503                  if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')
5504                  {
5505                      // Attributes
5506                      $bitrate = null;
5507                      $channels = null;
5508                      $duration = null;
5509                      $expression = null;
5510                      $framerate = null;
5511                      $height = null;
5512                      $javascript = null;
5513                      $lang = null;
5514                      $length = null;
5515                      $medium = null;
5516                      $samplingrate = null;
5517                      $type = null;
5518                      $url = null;
5519                      $width = null;
5520  
5521                      $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
5522                      if (isset($link['attribs']['']['type']))
5523                      {
5524                          $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
5525                      }
5526                      if (isset($link['attribs']['']['length']))
5527                      {
5528                          $length = ceil($link['attribs']['']['length']);
5529                      }
5530  
5531                      // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
5532                      $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
5533                  }
5534              }
5535  
5536              if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure'))
5537              {
5538                  if (isset($enclosure[0]['attribs']['']['url']))
5539                  {
5540                      // Attributes
5541                      $bitrate = null;
5542                      $channels = null;
5543                      $duration = null;
5544                      $expression = null;
5545                      $framerate = null;
5546                      $height = null;
5547                      $javascript = null;
5548                      $lang = null;
5549                      $length = null;
5550                      $medium = null;
5551                      $samplingrate = null;
5552                      $type = null;
5553                      $url = null;
5554                      $width = null;
5555  
5556                      $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));
5557                      if (isset($enclosure[0]['attribs']['']['type']))
5558                      {
5559                          $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
5560                      }
5561                      if (isset($enclosure[0]['attribs']['']['length']))
5562                      {
5563                          $length = ceil($enclosure[0]['attribs']['']['length']);
5564                      }
5565  
5566                      // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
5567                      $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
5568                  }
5569              }
5570  
5571              if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width))
5572              {
5573                  // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
5574                  $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
5575              }
5576  
5577              $this->data['enclosures'] = array_values(SimplePie_Misc::array_unique($this->data['enclosures']));
5578          }
5579          if (!empty($this->data['enclosures']))
5580          {
5581              return $this->data['enclosures'];
5582          }
5583          else
5584          {
5585              return null;
5586          }
5587      }
5588  
5589  	function get_latitude()
5590      {
5591          if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
5592          {
5593              return (float) $return[0]['data'];
5594          }
5595          elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
5596          {
5597              return (float) $match[1];
5598          }
5599          else
5600          {
5601              return null;
5602          }
5603      }
5604  
5605  	function get_longitude()
5606      {
5607          if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
5608          {
5609              return (float) $return[0]['data'];
5610          }
5611          elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
5612          {
5613              return (float) $return[0]['data'];
5614          }
5615          elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
5616          {
5617              return (float) $match[2];
5618          }
5619          else
5620          {
5621              return null;
5622          }
5623      }
5624  
5625  	function get_source()
5626      {
5627          if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source'))
5628          {
5629              return new $this->feed->source_class($this, $return[0]);
5630          }
5631          else
5632          {
5633              return null;
5634          }
5635      }
5636  
5637      /**
5638       * Creates the add_to_* methods' return data
5639       *
5640       * @access private
5641       * @param string $item_url String to prefix to the item permalink
5642       * @param string $title_url String to prefix to the item title
5643       * (and suffix to the item permalink)
5644       * @return mixed URL if feed exists, false otherwise
5645       */
5646  	function add_to_service($item_url, $title_url = null, $summary_url = null)
5647      {
5648          if ($this->get_permalink() !== null)
5649          {
5650              $return = $item_url . rawurlencode($this->get_permalink());
5651              if ($title_url !== null && $this->get_title() !== null)
5652              {
5653                  $return .= $title_url . rawurlencode($this->get_title());
5654              }
5655              if ($summary_url !== null && $this->get_description() !== null)
5656              {
5657                  $return .= $summary_url . rawurlencode($this->get_description());
5658              }
5659              return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI);
5660          }
5661          else
5662          {
5663              return null;
5664          }
5665      }
5666  
5667  	function add_to_blinklist()
5668      {
5669          return $this->add_to_service('http://www.blinklist.com/index.php?Action=Blink/addblink.php&Description=&Url=', '&Title=');
5670      }
5671  
5672  	function add_to_blogmarks()
5673      {
5674          return $this->add_to_service('http://blogmarks.net/my/new.php?mini=1&simple=1&url=', '&title=');
5675      }
5676  
5677  	function add_to_delicious()
5678      {
5679          return $this->add_to_service('http://del.icio.us/post/?v=4&url=', '&title=');
5680      }
5681  
5682  	function add_to_digg()
5683      {
5684          return $this->add_to_service('http://digg.com/submit?url=', '&title=', '&bodytext=');
5685      }
5686  
5687  	function add_to_furl()
5688      {
5689          return $this->add_to_service('http://www.furl.net/storeIt.jsp?u=', '&t=');
5690      }
5691  
5692  	function add_to_magnolia()
5693      {
5694          return $this->add_to_service('http://ma.gnolia.com/bookmarklet/add?url=', '&title=');
5695      }
5696  
5697  	function add_to_myweb20()
5698      {
5699          return $this->add_to_service('http://myweb2.search.yahoo.com/myresults/bookmarklet?u=', '&t=');
5700      }
5701  
5702  	function add_to_newsvine()
5703      {
5704          return $this->add_to_service('http://www.newsvine.com/_wine/save?u=', '&h=');
5705      }
5706  
5707  	function add_to_reddit()
5708      {
5709          return $this->add_to_service('http://reddit.com/submit?url=', '&title=');
5710      }
5711  
5712  	function add_to_segnalo()
5713      {
5714          return $this->add_to_service('http://segnalo.com/post.html.php?url=', '&title=');
5715      }
5716  
5717  	function add_to_simpy()
5718      {
5719          return $this->add_to_service('http://www.simpy.com/simpy/LinkAdd.do?href=', '&title=');
5720      }
5721  
5722  	function add_to_spurl()
5723      {
5724          return $this->add_to_service('http://www.spurl.net/spurl.php?v=3&url=', '&title=');
5725      }
5726  
5727  	function add_to_wists()
5728      {
5729          return $this->add_to_service('http://wists.com/r.php?c=&r=', '&title=');
5730      }
5731  
5732  	function search_technorati()
5733      {
5734          return $this->add_to_service('http://www.technorati.com/search/');
5735      }
5736  }
5737  
5738  class SimplePie_Source
5739  {
5740      var $item;
5741      var $data = array();
5742  
5743  	function SimplePie_Source($item, $data)
5744      {
5745          $this->item = $item;
5746          $this->data = $data;
5747      }
5748  
5749  	function __toString()
5750      {
5751          return md5(serialize($this->data));
5752      }
5753  
5754  	function get_source_tags($namespace, $tag)
5755      {
5756          if (isset($this->data['child'][$namespace][$tag]))
5757          {
5758              return $this->data['child'][$namespace][$tag];
5759          }
5760          else
5761          {
5762              return null;
5763          }
5764      }
5765  
5766  	function get_base($element = array())
5767      {
5768          return $this->item->get_base($element);
5769      }
5770  
5771  	function sanitize($data, $type, $base = '')
5772      {
5773          return $this->item->sanitize($data, $type, $base);
5774      }
5775  
5776  	function get_item()
5777      {
5778          return $this->item;
5779      }
5780  
5781  	function get_title()
5782      {
5783          if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
5784          {
5785              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
5786          }
5787          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
5788          {
5789              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
5790          }
5791          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
5792          {
5793              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
5794          }
5795          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
5796          {
5797              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
5798          }
5799          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
5800          {
5801              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
5802          }
5803          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
5804          {
5805              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5806          }
5807          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
5808          {
5809              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5810          }
5811          else
5812          {
5813              return null;
5814          }
5815      }
5816  
5817  	function get_category($key = 0)
5818      {
5819          $categories = $this->get_categories();
5820          if (isset($categories[$key]))
5821          {
5822              return $categories[$key];
5823          }
5824          else
5825          {
5826              return null;
5827          }
5828      }
5829  
5830  	function get_categories()
5831      {
5832          $categories = array();
5833  
5834          foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
5835          {
5836              $term = null;
5837              $scheme = null;
5838              $label = null;
5839              if (isset($category['attribs']['']['term']))
5840              {
5841                  $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
5842              }
5843              if (isset($category['attribs']['']['scheme']))
5844              {
5845                  $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
5846              }
5847              if (isset($category['attribs']['']['label']))
5848              {
5849                  $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
5850              }
5851              $categories[] =& new $this->item->feed->category_class($term, $scheme, $label);
5852          }
5853          foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
5854          {
5855              // This is really the label, but keep this as the term also for BC.
5856              // Label will also work on retrieving because that falls back to term.
5857              $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5858              if (isset($category['attribs']['']['domain']))
5859              {
5860                  $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
5861              }
5862              else
5863              {
5864                  $scheme = null;
5865              }
5866              $categories[] =& new $this->item->feed->category_class($term, $scheme, null);
5867          }
5868          foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
5869          {
5870              $categories[] =& new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
5871          }
5872          foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
5873          {
5874              $categories[] =& new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
5875          }
5876  
5877          if (!empty($categories))
5878          {
5879              return SimplePie_Misc::array_unique($categories);
5880          }
5881          else
5882          {
5883              return null;
5884          }
5885      }
5886  
5887  	function get_author($key = 0)
5888      {
5889          $authors = $this->get_authors();
5890          if (isset($authors[$key]))
5891          {
5892              return $authors[$key];
5893          }
5894          else
5895          {
5896              return null;
5897          }
5898      }
5899  
5900  	function get_authors()
5901      {
5902          $authors = array();
5903          foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
5904          {
5905              $name = null;
5906              $uri = null;
5907              $email = null;
5908              if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
5909              {
5910                  $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5911              }
5912              if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
5913              {
5914                  $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
5915              }
5916              if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
5917              {
5918                  $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5919              }
5920              if ($name !== null || $email !== null || $uri !== null)
5921              {
5922                  $authors[] =& new $this->item->feed->author_class($name, $uri, $email);
5923              }
5924          }
5925          if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
5926          {
5927              $name = null;
5928              $url = null;
5929              $email = null;
5930              if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
5931              {
5932                  $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5933              }
5934              if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
5935              {
5936                  $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
5937              }
5938              if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
5939              {
5940                  $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5941              }
5942              if ($name !== null || $email !== null || $url !== null)
5943              {
5944                  $authors[] =& new $this->item->feed->author_class($name, $url, $email);
5945              }
5946          }
5947          foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
5948          {
5949              $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
5950          }
5951          foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
5952          {
5953              $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
5954          }
5955          foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
5956          {
5957              $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
5958          }
5959  
5960          if (!empty($authors))
5961          {
5962              return SimplePie_Misc::array_unique($authors);
5963          }
5964          else
5965          {
5966              return null;
5967          }
5968      }
5969  
5970  	function get_contributor($key = 0)
5971      {
5972          $contributors = $this->get_contributors();
5973          if (isset($contributors[$key]))
5974          {
5975              return $contributors[$key];
5976          }
5977          else
5978          {
5979              return null;
5980          }
5981      }
5982  
5983  	function get_contributors()
5984      {
5985          $contributors = array();
5986          foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
5987          {
5988              $name = null;
5989              $uri = null;
5990              $email = null;
5991              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
5992              {
5993                  $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
5994              }
5995              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
5996              {
5997                  $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
5998              }
5999              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
6000              {
6001                  $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6002              }
6003              if ($name !== null || $email !== null || $uri !== null)
6004              {
6005                  $contributors[] =& new $this->item->feed->author_class($name, $uri, $email);
6006              }
6007          }
6008          foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
6009          {
6010              $name = null;
6011              $url = null;
6012              $email = null;
6013              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
6014              {
6015                  $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6016              }
6017              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
6018              {
6019                  $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
6020              }
6021              if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
6022              {
6023                  $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6024              }
6025              if ($name !== null || $email !== null || $url !== null)
6026              {
6027                  $contributors[] =& new $this->item->feed->author_class($name, $url, $email);
6028              }
6029          }
6030  
6031          if (!empty($contributors))
6032          {
6033              return SimplePie_Misc::array_unique($contributors);
6034          }
6035          else
6036          {
6037              return null;
6038          }
6039      }
6040  
6041  	function get_link($key = 0, $rel = 'alternate')
6042      {
6043          $links = $this->get_links($rel);
6044          if (isset($links[$key]))
6045          {
6046              return $links[$key];
6047          }
6048          else
6049          {
6050              return null;
6051          }
6052      }
6053  
6054      /**
6055       * Added for parity between the parent-level and the item/entry-level.
6056       */
6057  	function get_permalink()
6058      {
6059          return $this->get_link(0);
6060      }
6061  
6062  	function get_links($rel = 'alternate')
6063      {
6064          if (!isset($this->data['links']))
6065          {
6066              $this->data['links'] = array();
6067              if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
6068              {
6069                  foreach ($links as $link)
6070                  {
6071                      if (isset($link['attribs']['']['href']))
6072                      {
6073                          $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
6074                          $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
6075                      }
6076                  }
6077              }
6078              if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
6079              {
6080                  foreach ($links as $link)
6081                  {
6082                      if (isset($link['attribs']['']['href']))
6083                      {
6084                          $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
6085                          $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
6086  
6087                      }
6088                  }
6089              }
6090              if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
6091              {
6092                  $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
6093              }
6094              if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
6095              {
6096                  $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
6097              }
6098              if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
6099              {
6100                  $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
6101              }
6102  
6103              $keys = array_keys($this->data['links']);
6104              foreach ($keys as $key)
6105              {
6106                  if (SimplePie_Misc::is_isegment_nz_nc($key))
6107                  {
6108                      if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
6109                      {
6110                          $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
6111                          $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
6112                      }
6113                      else
6114                      {
6115                          $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
6116                      }
6117                  }
6118                  elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
6119                  {
6120                      $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
6121                  }
6122                  $this->data['links'][$key] = array_unique($this->data['links'][$key]);
6123              }
6124          }
6125  
6126          if (isset($this->data['links'][$rel]))
6127          {
6128              return $this->data['links'][$rel];
6129          }
6130          else
6131          {
6132              return null;
6133          }
6134      }
6135  
6136  	function get_description()
6137      {
6138          if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
6139          {
6140              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
6141          }
6142          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
6143          {
6144              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
6145          }
6146          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
6147          {
6148              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
6149          }
6150          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
6151          {
6152              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
6153          }
6154          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
6155          {
6156              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
6157          }
6158          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
6159          {
6160              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6161          }
6162          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
6163          {
6164              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6165          }
6166          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
6167          {
6168              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
6169          }
6170          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
6171          {
6172              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
6173          }
6174          else
6175          {
6176              return null;
6177          }
6178      }
6179  
6180  	function get_copyright()
6181      {
6182          if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
6183          {
6184              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
6185          }
6186          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
6187          {
6188              return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
6189          }
6190          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright'))
6191          {
6192              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6193          }
6194          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
6195          {
6196              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6197          }
6198          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
6199          {
6200              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6201          }
6202          else
6203          {
6204              return null;
6205          }
6206      }
6207  
6208  	function get_language()
6209      {
6210          if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language'))
6211          {
6212              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6213          }
6214          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
6215          {
6216              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6217          }
6218          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
6219          {
6220              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6221          }
6222          elseif (isset($this->data['xml_lang']))
6223          {
6224              return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
6225          }
6226          else
6227          {
6228              return null;
6229          }
6230      }
6231  
6232  	function get_latitude()
6233      {
6234          if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
6235          {
6236              return (float) $return[0]['data'];
6237          }
6238          elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
6239          {
6240              return (float) $match[1];
6241          }
6242          else
6243          {
6244              return null;
6245          }
6246      }
6247  
6248  	function get_longitude()
6249      {
6250          if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
6251          {
6252              return (float) $return[0]['data'];
6253          }
6254          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
6255          {
6256              return (float) $return[0]['data'];
6257          }
6258          elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
6259          {
6260              return (float) $match[2];
6261          }
6262          else
6263          {
6264              return null;
6265          }
6266      }
6267  
6268  	function get_image_url()
6269      {
6270          if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
6271          {
6272              return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
6273          }
6274          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
6275          {
6276              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
6277          }
6278          elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
6279          {
6280              return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
6281          }
6282          else
6283          {
6284              return null;
6285          }
6286      }
6287  }
6288  
6289  class SimplePie_Author
6290  {
6291      var $name;
6292      var $link;
6293      var $email;
6294  
6295      // Constructor, used to input the data
6296  	function SimplePie_Author($name = null, $link = null, $email = null)
6297      {
6298          $this->name = $name;
6299          $this->link = $link;
6300          $this->email = $email;
6301      }
6302  
6303  	function __toString()
6304      {
6305          // There is no $this->data here
6306          return md5(serialize($this));
6307      }
6308  
6309  	function get_name()
6310      {
6311          if ($this->name !== null)
6312          {
6313              return $this->name;
6314          }
6315          else
6316          {
6317              return null;
6318          }
6319      }
6320  
6321  	function get_link()
6322      {
6323          if ($this->link !== null)
6324          {
6325              return $this->link;
6326          }
6327          else
6328          {
6329              return null;
6330          }
6331      }
6332  
6333  	function get_email()
6334      {
6335          if ($this->email !== null)
6336          {
6337              return $this->email;
6338          }
6339          else
6340          {
6341              return null;
6342          }
6343      }
6344  }
6345  
6346  class SimplePie_Category
6347  {
6348      var $term;
6349      var $scheme;
6350      var $label;
6351  
6352      // Constructor, used to input the data
6353  	function SimplePie_Category($term = null, $scheme = null, $label = null)
6354      {
6355          $this->term = $term;
6356          $this->scheme = $scheme;
6357          $this->label = $label;
6358      }
6359  
6360  	function __toString()
6361      {
6362          // There is no $this->data here
6363          return md5(serialize($this));
6364      }
6365  
6366  	function get_term()
6367      {
6368          if ($this->term !== null)
6369          {
6370              return $this->term;
6371          }
6372          else
6373          {
6374              return null;
6375          }
6376      }
6377  
6378  	function get_scheme()
6379      {
6380          if ($this->scheme !== null)
6381          {
6382              return $this->scheme;
6383          }
6384          else
6385          {
6386              return null;
6387          }
6388      }
6389  
6390  	function get_label()
6391      {
6392          if ($this->label !== null)
6393          {
6394              return $this->label;
6395          }
6396          else
6397          {
6398              return $this->get_term();
6399          }
6400      }
6401  }
6402  
6403  class SimplePie_Enclosure
6404  {
6405      var $bitrate;
6406      var $captions;
6407      var $categories;
6408      var $channels;
6409      var $copyright;
6410      var $credits;
6411      var $description;
6412      var $duration;
6413      var $expression;
6414      var $framerate;
6415      var $handler;
6416      var $hashes;
6417      var $height;
6418      var $javascript;
6419      var $keywords;
6420      var $lang;
6421      var $length;
6422      var $link;
6423      var $medium;
6424      var $player;
6425      var $ratings;
6426      var $restrictions;
6427      var $samplingrate;
6428      var $thumbnails;
6429      var $title;
6430      var $type;
6431      var $width;
6432  
6433      // Constructor, used to input the data
6434  	function SimplePie_Enclosure($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null)
6435      {
6436          $this->bitrate = $bitrate;
6437          $this->captions = $captions;
6438          $this->categories = $categories;
6439          $this->channels = $channels;
6440          $this->copyright = $copyright;
6441          $this->credits = $credits;
6442          $this->description = $description;
6443          $this->duration = $duration;
6444          $this->expression = $expression;
6445          $this->framerate = $framerate;
6446          $this->hashes = $hashes;
6447          $this->height = $height;
6448          $this->javascript = $javascript;
6449          $this->keywords = $keywords;
6450          $this->lang = $lang;
6451          $this->length = $length;
6452          $this->link = $link;
6453          $this->medium = $medium;
6454          $this->player = $player;
6455          $this->ratings = $ratings;
6456          $this->restrictions = $restrictions;
6457          $this->samplingrate = $samplingrate;
6458          $this->thumbnails = $thumbnails;
6459          $this->title = $title;
6460          $this->type = $type;
6461          $this->width = $width;
6462          if (class_exists('idna_convert'))
6463          {
6464              $idn =& new idna_convert;
6465              $parsed = SimplePie_Misc::parse_url($link);
6466              $this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
6467          }
6468          $this->handler = $this->get_handler(); // Needs to load last
6469      }
6470  
6471  	function __toString()
6472      {
6473          // There is no $this->data here
6474          return md5(serialize($this));
6475      }
6476  
6477  	function get_bitrate()
6478      {
6479          if ($this->bitrate !== null)
6480          {
6481              return $this->bitrate;
6482          }
6483          else
6484          {
6485              return null;
6486          }
6487      }
6488  
6489  	function get_caption($key = 0)
6490      {
6491          $captions = $this->get_captions();
6492          if (isset($captions[$key]))
6493          {
6494              return $captions[$key];
6495          }
6496          else
6497          {
6498              return null;
6499          }
6500      }
6501  
6502  	function get_captions()
6503      {
6504          if ($this->captions !== null)
6505          {
6506              return $this->captions;
6507          }
6508          else
6509          {
6510              return null;
6511          }
6512      }
6513  
6514  	function get_category($key = 0)
6515      {
6516          $categories = $this->get_categories();
6517          if (isset($categories[$key]))
6518          {
6519              return $categories[$key];
6520          }
6521          else
6522          {
6523              return null;
6524          }
6525      }
6526  
6527  	function get_categories()
6528      {
6529          if ($this->categories !== null)
6530          {
6531              return $this->categories;
6532          }
6533          else
6534          {
6535              return null;
6536          }
6537      }
6538  
6539  	function get_channels()
6540      {
6541          if ($this->channels !== null)
6542          {
6543              return $this->channels;
6544          }
6545          else
6546          {
6547              return null;
6548          }
6549      }
6550  
6551  	function get_copyright()
6552      {
6553          if ($this->copyright !== null)
6554          {
6555              return $this->copyright;
6556          }
6557          else
6558          {
6559              return null;
6560          }
6561      }
6562  
6563  	function get_credit($key = 0)
6564      {
6565          $credits = $this->get_credits();
6566          if (isset($credits[$key]))
6567          {
6568              return $credits[$key];
6569          }
6570          else
6571          {
6572              return null;
6573          }
6574      }
6575  
6576  	function get_credits()
6577      {
6578          if ($this->credits !== null)
6579          {
6580              return $this->credits;
6581          }
6582          else
6583          {
6584              return null;
6585          }
6586      }
6587  
6588  	function get_description()
6589      {
6590          if ($this->description !== null)
6591          {
6592              return $this->description;
6593          }
6594          else
6595          {
6596              return null;
6597          }
6598      }
6599  
6600  	function get_duration($convert = false)
6601      {
6602          if ($this->duration !== null)
6603          {
6604              if ($convert)
6605              {
6606                  $time = SimplePie_Misc::time_hms($this->duration);
6607                  return $time;
6608              }
6609              else
6610              {
6611                  return $this->duration;
6612              }
6613          }
6614          else
6615          {
6616              return null;
6617          }
6618      }
6619  
6620  	function get_expression()
6621      {
6622          if ($this->expression !== null)
6623          {
6624              return $this->expression;
6625          }
6626          else
6627          {
6628              return 'full';
6629          }
6630      }
6631  
6632  	function get_extension()
6633      {
6634          if ($this->link !== null)
6635          {
6636              $url = SimplePie_Misc::parse_url($this->link);
6637              if ($url['path'] !== '')
6638              {
6639                  return pathinfo($url['path'], PATHINFO_EXTENSION);
6640              }
6641          }
6642          return null;
6643      }
6644  
6645  	function get_framerate()
6646      {
6647          if ($this->framerate !== null)
6648          {
6649              return $this->framerate;
6650          }
6651          else
6652          {
6653              return null;
6654          }
6655      }
6656  
6657  	function get_handler()
6658      {
6659          return $this->get_real_type(true);
6660      }
6661  
6662  	function get_hash($key = 0)
6663      {
6664          $hashes = $this->get_hashes();
6665          if (isset($hashes[$key]))
6666          {
6667              return $hashes[$key];
6668          }
6669          else
6670          {
6671              return null;
6672          }
6673      }
6674  
6675  	function get_hashes()
6676      {
6677          if ($this->hashes !== null)
6678          {
6679              return $this->hashes;
6680          }
6681          else
6682          {
6683              return null;
6684          }
6685      }
6686  
6687  	function get_height()
6688      {
6689          if ($this->height !== null)
6690          {
6691              return $this->height;
6692          }
6693          else
6694          {
6695              return null;
6696          }
6697      }
6698  
6699  	function get_language()
6700      {
6701          if ($this->lang !== null)
6702          {
6703              return $this->lang;
6704          }
6705          else
6706          {
6707              return null;
6708          }
6709      }
6710  
6711  	function get_keyword($key = 0)
6712      {
6713          $keywords = $this->get_keywords();
6714          if (isset($keywords[$key]))
6715          {
6716              return $keywords[$key];
6717          }
6718          else
6719          {
6720              return null;
6721          }
6722      }
6723  
6724  	function get_keywords()
6725      {
6726          if ($this->keywords !== null)
6727          {
6728              return $this->keywords;
6729          }
6730          else
6731          {
6732              return null;
6733          }
6734      }
6735  
6736  	function get_length()
6737      {
6738          if ($this->length !== null)
6739          {
6740              return $this->length;
6741          }
6742          else
6743          {
6744              return null;
6745          }
6746      }
6747  
6748  	function get_link()
6749      {
6750          if ($this->link !== null)
6751          {
6752              return urldecode($this->link);
6753          }
6754          else
6755          {
6756              return null;
6757          }
6758      }
6759  
6760  	function get_medium()
6761      {
6762          if ($this->medium !== null)
6763          {
6764              return $this->medium;
6765          }
6766          else
6767          {
6768              return null;
6769          }
6770      }
6771  
6772  	function get_player()
6773      {
6774          if ($this->player !== null)
6775          {
6776              return $this->player;
6777          }
6778          else
6779          {
6780              return null;
6781          }
6782      }
6783  
6784  	function get_rating($key = 0)
6785      {
6786          $ratings = $this->get_ratings();
6787          if (isset($ratings[$key]))
6788          {
6789              return $ratings[$key];
6790          }
6791          else
6792          {
6793              return null;
6794          }
6795      }
6796  
6797  	function get_ratings()
6798      {
6799          if ($this->ratings !== null)
6800          {
6801              return $this->ratings;
6802          }
6803          else
6804          {
6805              return null;
6806          }
6807      }
6808  
6809  	function get_restriction($key = 0)
6810      {
6811          $restrictions = $this->get_restrictions();
6812          if (isset($restrictions[$key]))
6813          {
6814              return $restrictions[$key];
6815          }
6816          else
6817          {
6818              return null;
6819          }
6820      }
6821  
6822  	function get_restrictions()
6823      {
6824          if ($this->restrictions !== null)
6825          {
6826              return $this->restrictions;
6827          }
6828          else
6829          {
6830              return null;
6831          }
6832      }
6833  
6834  	function get_sampling_rate()
6835      {
6836          if ($this->samplingrate !== null)
6837          {
6838              return $this->samplingrate;
6839          }
6840          else
6841          {
6842              return null;
6843          }
6844      }
6845  
6846  	function get_size()
6847      {
6848          $length = $this->get_length();
6849          if ($length !== null)
6850          {
6851              return round($length/1048576, 2);
6852          }
6853          else
6854          {
6855              return null;
6856          }
6857      }
6858  
6859  	function get_thumbnail($key = 0)
6860      {
6861          $thumbnails = $this->get_thumbnails();
6862          if (isset($thumbnails[$key]))
6863          {
6864              return $thumbnails[$key];
6865          }
6866          else
6867          {
6868              return null;
6869          }
6870      }
6871  
6872  	function get_thumbnails()
6873      {
6874          if ($this->thumbnails !== null)
6875          {
6876              return $this->thumbnails;
6877          }
6878          else
6879          {
6880              return null;
6881          }
6882      }
6883  
6884  	function get_title()
6885      {
6886          if ($this->title !== null)
6887          {
6888              return $this->title;
6889          }
6890          else
6891          {
6892              return null;
6893          }
6894      }
6895  
6896  	function get_type()
6897      {
6898          if ($this->type !== null)
6899          {
6900              return $this->type;
6901          }
6902          else
6903          {
6904              return null;
6905          }
6906      }
6907  
6908  	function get_width()
6909      {
6910          if ($this->width !== null)
6911          {
6912              return $this->width;
6913          }
6914          else
6915          {
6916              return null;
6917          }
6918      }
6919  
6920  	function native_embed($options='')
6921      {
6922          return $this->embed($options, true);
6923      }
6924  
6925      /**
6926       * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'.
6927       */
6928  	function embed($options = '', $native = false)
6929      {
6930          // Set up defaults
6931          $audio = '';
6932          $video = '';
6933          $alt = '';
6934          $altclass = '';
6935          $loop = 'false';
6936          $width = 'auto';
6937          $height = 'auto';
6938          $bgcolor = '#ffffff';
6939          $mediaplayer = '';
6940          $widescreen = false;
6941          $handler = $this->get_handler();
6942          $type = $this->get_real_type();
6943  
6944          // Process options and reassign values as necessary
6945          if (is_array($options))
6946          {
6947              extract($options);
6948          }
6949          else
6950          {
6951              $options = explode(',', $options);
6952              foreach($options as $option)
6953              {
6954                  $opt = explode(':', $option, 2);
6955                  if (isset($opt[0], $opt[1]))
6956                  {
6957                      $opt[0] = trim($opt[0]);
6958                      $opt[1] = trim($opt[1]);
6959                      switch ($opt[0])
6960                      {
6961                          case 'audio':
6962                              $audio = $opt[1];
6963                              break;
6964  
6965                          case 'video':
6966                              $video = $opt[1];
6967                              break;
6968  
6969                          case 'alt':
6970                              $alt = $opt[1];
6971                              break;
6972  
6973                          case 'altclass':
6974                              $altclass = $opt[1];
6975                              break;
6976  
6977                          case 'loop':
6978                              $loop = $opt[1];
6979                              break;
6980  
6981                          case 'width':
6982                              $width = $opt[1];
6983                              break;
6984  
6985                          case 'height':
6986                              $height = $opt[1];
6987                              break;
6988  
6989                          case 'bgcolor':
6990                              $bgcolor = $opt[1];
6991                              break;
6992  
6993                          case 'mediaplayer':
6994                              $mediaplayer = $opt[1];
6995                              break;
6996  
6997                          case 'widescreen':
6998                              $widescreen = $opt[1];
6999                              break;
7000                      }
7001                  }
7002              }
7003          }
7004  
7005          $mime = explode('/', $type, 2);
7006          $mime = $mime[0];
7007  
7008          // Process values for 'auto'
7009          if ($width === 'auto')
7010          {
7011              if ($mime === 'video')
7012              {
7013                  if ($height === 'auto')
7014                  {
7015                      $width = 480;
7016                  }
7017                  elseif ($widescreen)
7018                  {
7019                      $width = round((intval($height)/9)*16);
7020                  }
7021                  else
7022                  {
7023                      $width = round((intval($height)/3)*4);
7024                  }
7025              }
7026              else
7027              {
7028                  $width = '100%';
7029              }
7030          }
7031  
7032          if ($height === 'auto')
7033          {
7034              if ($mime === 'audio')
7035              {
7036                  $height = 0;
7037              }
7038              elseif ($mime === 'video')
7039              {
7040                  if ($width === 'auto')
7041                  {
7042                      if ($widescreen)
7043                      {
7044                          $height = 270;
7045                      }
7046                      else
7047                      {
7048                          $height = 360;
7049                      }
7050                  }
7051                  elseif ($widescreen)
7052                  {
7053                      $height = round((intval($width)/16)*9);
7054                  }
7055                  else
7056                  {
7057                      $height = round((intval($width)/4)*3);
7058                  }
7059              }
7060              else
7061              {
7062                  $height = 376;
7063              }
7064          }
7065          elseif ($mime === 'audio')
7066          {
7067              $height = 0;
7068          }
7069  
7070          // Set proper placeholder value
7071          if ($mime === 'audio')
7072          {
7073              $placeholder = $audio;
7074          }
7075          elseif ($mime === 'video')
7076          {
7077              $placeholder = $video;
7078          }
7079  
7080          $embed = '';
7081  
7082          // Make sure the JS library is included
7083          if (!$native)
7084          {
7085              static $javascript_outputted = null;
7086              if (!$javascript_outputted && $this->javascript)
7087              {
7088                  $embed .= '<script type="text/javascript" src="?' . htmlspecialchars($this->javascript) . '"></script>';
7089                  $javascript_outputted = true;
7090              }
7091          }
7092  
7093          // Odeo Feed MP3's
7094          if ($handler === 'odeo')
7095          {
7096              if ($native)
7097              {
7098                  $embed .= '<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://adobe.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="440" height="80" wmode="transparent" allowScriptAccess="any" flashvars="valid_sample_rate=true&external_url=' . $this->get_link() . '"></embed>';
7099              }
7100              else
7101              {
7102                  $embed .= '<script type="text/javascript">embed_odeo("' . $this->get_link() . '");</script>';
7103              }
7104          }
7105  
7106          // Flash
7107          elseif ($handler === 'flash')
7108          {
7109              if ($native)
7110              {
7111                  $embed .= "<embed src=\"" . $this->get_link() . "\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\"></embed>";
7112              }
7113              else
7114              {
7115                  $embed .= "<script type='text/javascript'>embed_flash('$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$loop', '$type');</script>";
7116              }
7117          }
7118  
7119          // Flash Media Player file types.
7120          // Preferred handler for MP3 file types.
7121          elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== ''))
7122          {
7123              $height += 20;
7124              if ($native)
7125              {
7126                  $embed .= "<embed src=\"$mediaplayer\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"application/x-shockwave-flash\" quality=\"high\" width=\"$width\" height=\"$height\" wmode=\"transparent\" flashvars=\"file=" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\"></embed>";
7127              }
7128              else
7129              {
7130                  $embed .= "<script type='text/javascript'>embed_flv('$width', '$height', '" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "', '$placeholder', '$loop', '$mediaplayer');</script>";
7131              }
7132          }
7133  
7134          // QuickTime 7 file types.  Need to test with QuickTime 6.
7135          // Only handle MP3's if the Flash Media Player is not present.
7136          elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === ''))
7137          {
7138              $height += 16;
7139              if ($native)
7140              {
7141                  if ($placeholder !== '')
7142                  {
7143                      $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" href=\"" . $this->get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>";
7144                  }
7145                  else
7146                  {
7147                      $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" src=\"" . $this->get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>";
7148                  }
7149              }
7150              else
7151              {
7152                  $embed .= "<script type='text/javascript'>embed_quicktime('$type', '$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$placeholder', '$loop');</script>";
7153              }
7154          }
7155  
7156          // Windows Media
7157          elseif ($handler === 'wmedia')
7158          {
7159              $height += 45;
7160              if ($native)
7161              {
7162                  $embed .= "<embed type=\"application/x-mplayer2\" src=\"" . $this->get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\"></embed>";
7163              }
7164              else
7165              {
7166                  $embed .= "<script type='text/javascript'>embed_wmedia('$width', '$height', '" . $this->get_link() . "');</script>";
7167              }
7168          }
7169  
7170          // Everything else
7171          else $embed .= '<a href="' . $this->get_link() . '" class="' . $altclass . '">' . $alt . '</a>';
7172  
7173          return $embed;
7174      }
7175  
7176  	function get_real_type($find_handler = false)
7177      {
7178          // If it's Odeo, let's get it out of the way.
7179          if (substr(strtolower($this->get_link()), 0, 15) === 'http://odeo.com')
7180          {
7181              return 'odeo';
7182          }
7183  
7184          // Mime-types by handler.
7185          $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash
7186          $types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player
7187          $types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime
7188          $types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media
7189          $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3
7190  
7191          if ($this->get_type() !== null)
7192          {
7193              $type = strtolower($this->type);
7194          }
7195          else
7196          {
7197              $type = null;
7198          }
7199  
7200          // If we encounter an unsupported mime-type, check the file extension and guess intelligently.
7201          if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3)))
7202          {
7203              switch (strtolower($this->get_extension()))
7204              {
7205                  // Audio mime-types
7206                  case 'aac':
7207                  case 'adts':
7208                      $type = 'audio/acc';
7209                      break;
7210  
7211                  case 'aif':
7212                  case 'aifc':
7213                  case 'aiff':
7214                  case 'cdda':
7215                      $type = 'audio/aiff';
7216                      break;
7217  
7218                  case 'bwf':
7219                      $type = 'audio/wav';
7220                      break;
7221  
7222                  case 'kar':
7223                  case 'mid':
7224                  case 'midi':
7225                  case 'smf':
7226                      $type = 'audio/midi';
7227                      break;
7228  
7229                  case 'm4a':
7230                      $type = 'audio/x-m4a';
7231                      break;
7232  
7233                  case 'mp3':
7234                  case 'swa':
7235                      $type = 'audio/mp3';
7236                      break;
7237  
7238                  case 'wav':
7239                      $type = 'audio/wav';
7240                      break;
7241  
7242                  case 'wax':
7243                      $type = 'audio/x-ms-wax';
7244                      break;
7245  
7246                  case 'wma':
7247                      $type = 'audio/x-ms-wma';
7248                      break;
7249  
7250                  // Video mime-types
7251                  case '3gp':
7252                  case '3gpp':
7253                      $type = 'video/3gpp';
7254                      break;
7255  
7256                  case '3g2':
7257                  case '3gp2':
7258                      $type = 'video/3gpp2';
7259                      break;
7260  
7261                  case 'asf':
7262                      $type = 'video/x-ms-asf';
7263                      break;
7264  
7265                  case 'flv':
7266                      $type = 'video/x-flv';
7267                      break;
7268  
7269                  case 'm1a':
7270                  case 'm1s':
7271                  case 'm1v':
7272                  case 'm15':
7273                  case 'm75':
7274                  case 'mp2':
7275                  case 'mpa':
7276                  case 'mpeg':
7277                  case 'mpg':
7278                  case 'mpm':
7279                  case 'mpv':
7280                      $type = 'video/mpeg';
7281                      break;
7282  
7283                  case 'm4v':
7284                      $type = 'video/x-m4v';
7285                      break;
7286  
7287                  case 'mov':
7288                  case 'qt':
7289                      $type = 'video/quicktime';
7290                      break;
7291  
7292                  case 'mp4':
7293                  case 'mpg4':
7294                      $type = 'video/mp4';
7295                      break;
7296  
7297                  case 'sdv':
7298                      $type = 'video/sd-video';
7299                      break;
7300  
7301                  case 'wm':
7302                      $type = 'video/x-ms-wm';
7303                      break;
7304  
7305                  case 'wmv':
7306                      $type = 'video/x-ms-wmv';
7307                      break;
7308  
7309                  case 'wvx':
7310                      $type = 'video/x-ms-wvx';
7311                      break;
7312  
7313                  // Flash mime-types
7314                  case 'spl':
7315                      $type = 'application/futuresplash';
7316                      break;
7317  
7318                  case 'swf':
7319                      $type = 'application/x-shockwave-flash';
7320                      break;
7321              }
7322          }
7323  
7324          if ($find_handler)
7325          {
7326              if (in_array($type, $types_flash))
7327              {
7328                  return 'flash';
7329              }
7330              elseif (in_array($type, $types_fmedia))
7331              {
7332                  return 'fmedia';
7333              }
7334              elseif (in_array($type, $types_quicktime))
7335              {
7336                  return 'quicktime';
7337              }
7338              elseif (in_array($type, $types_wmedia))
7339              {
7340                  return 'wmedia';
7341              }
7342              elseif (in_array($type, $types_mp3))
7343              {
7344                  return 'mp3';
7345              }
7346              else
7347              {
7348                  return null;
7349              }
7350          }
7351          else
7352          {
7353              return $type;
7354          }
7355      }
7356  }
7357  
7358  class SimplePie_Caption
7359  {
7360      var $type;
7361      var $lang;
7362      var $startTime;
7363      var $endTime;
7364      var $text;
7365  
7366      // Constructor, used to input the data
7367  	function SimplePie_Caption($type = null, $lang = null, $startTime = null, $endTime = null, $text = null)
7368      {
7369          $this->type = $type;
7370          $this->lang = $lang;
7371          $this->startTime = $startTime;
7372          $this->endTime = $endTime;
7373          $this->text = $text;
7374      }
7375  
7376  	function __toString()
7377      {
7378          // There is no $this->data here
7379          return md5(serialize($this));
7380      }
7381  
7382  	function get_endtime()
7383      {
7384          if ($this->endTime !== null)
7385          {
7386              return $this->endTime;
7387          }
7388          else
7389          {
7390              return null;
7391          }
7392      }
7393  
7394  	function get_language()
7395      {
7396          if ($this->lang !== null)
7397          {
7398              return $this->lang;
7399          }
7400          else
7401          {
7402              return null;
7403          }
7404      }
7405  
7406  	function get_starttime()
7407      {
7408          if ($this->startTime !== null)
7409          {
7410              return $this->startTime;
7411          }
7412          else
7413          {
7414              return null;
7415          }
7416      }
7417  
7418  	function get_text()
7419      {
7420          if ($this->text !== null)
7421          {
7422              return $this->text;
7423          }
7424          else
7425          {
7426              return null;
7427          }
7428      }
7429  
7430  	function get_type()
7431      {
7432          if ($this->type !== null)
7433          {
7434              return $this->type;
7435          }
7436          else
7437          {
7438              return null;
7439          }
7440      }
7441  }
7442  
7443  class SimplePie_Credit
7444  {
7445      var $role;
7446      var $scheme;
7447      var $name;
7448  
7449      // Constructor, used to input the data
7450  	function SimplePie_Credit($role = null, $scheme = null, $name = null)
7451      {
7452          $this->role = $role;
7453          $this->scheme = $scheme;
7454          $this->name = $name;
7455      }
7456  
7457  	function __toString()
7458      {
7459          // There is no $this->data here
7460          return md5(serialize($this));
7461      }
7462  
7463  	function get_role()
7464      {
7465          if ($this->role !== null)
7466          {
7467              return $this->role;
7468          }
7469          else
7470          {
7471              return null;
7472          }
7473      }
7474  
7475  	function get_scheme()
7476      {
7477          if ($this->scheme !== null)
7478          {
7479              return $this->scheme;
7480          }
7481          else
7482          {
7483              return null;
7484          }
7485      }
7486  
7487  	function get_name()
7488      {
7489          if ($this->name !== null)
7490          {
7491              return $this->name;
7492          }
7493          else
7494          {
7495              return null;
7496          }
7497      }
7498  }
7499  
7500  class SimplePie_Copyright
7501  {
7502      var $url;
7503      var $label;
7504  
7505      // Constructor, used to input the data
7506  	function SimplePie_Copyright($url = null, $label = null)
7507      {
7508          $this->url = $url;
7509          $this->label = $label;
7510      }
7511  
7512  	function __toString()
7513      {
7514          // There is no $this->data here
7515          return md5(serialize($this));
7516      }
7517  
7518  	function get_url()
7519      {
7520          if ($this->url !== null)
7521          {
7522              return $this->url;
7523          }
7524          else
7525          {
7526              return null;
7527          }
7528      }
7529  
7530  	function get_attribution()
7531      {
7532          if ($this->label !== null)
7533          {
7534              return $this->label;
7535          }
7536          else
7537          {
7538              return null;
7539          }
7540      }
7541  }
7542  
7543  class SimplePie_Rating
7544  {
7545      var $scheme;
7546      var $value;
7547  
7548      // Constructor, used to input the data
7549  	function SimplePie_Rating($scheme = null, $value = null)
7550      {
7551          $this->scheme = $scheme;
7552          $this->value = $value;
7553      }
7554  
7555  	function __toString()
7556      {
7557          // There is no $this->data here
7558          return md5(serialize($this));
7559      }
7560  
7561  	function get_scheme()
7562      {
7563          if ($this->scheme !== null)
7564          {
7565              return $this->scheme;
7566          }
7567          else
7568          {
7569              return null;
7570          }
7571      }
7572  
7573  	function get_value()
7574      {
7575          if ($this->value !== null)
7576          {
7577              return $this->value;
7578          }
7579          else
7580          {
7581              return null;
7582          }
7583      }
7584  }
7585  
7586  class SimplePie_Restriction
7587  {
7588      var $relationship;
7589      var $type;
7590      var $value;
7591  
7592      // Constructor, used to input the data
7593  	function SimplePie_Restriction($relationship = null, $type = null, $value = null)
7594      {
7595          $this->relationship = $relationship;
7596          $this->type = $type;
7597          $this->value = $value;
7598      }
7599  
7600  	function __toString()
7601      {
7602          // There is no $this->data here
7603          return md5(serialize($this));
7604      }
7605  
7606  	function get_relationship()
7607      {
7608          if ($this->relationship !== null)
7609          {
7610              return $this->relationship;
7611          }
7612          else
7613          {
7614              return null;
7615          }
7616      }
7617  
7618  	function get_type()
7619      {
7620          if ($this->type !== null)
7621          {
7622              return $this->type;
7623          }
7624          else
7625          {
7626              return null;
7627          }
7628      }
7629  
7630  	function get_value()
7631      {
7632          if ($this->value !== null)
7633          {
7634              return $this->value;
7635          }
7636          else
7637          {
7638              return null;
7639          }
7640      }
7641  }
7642  
7643  /**
7644   * @todo Move to properly supporting RFC2616 (HTTP/1.1)
7645   */
7646  class SimplePie_File
7647  {
7648      var $url;
7649      var $useragent;
7650      var $success = true;
7651      var $headers = array();
7652      var $body;
7653      var $status_code;
7654      var $redirects = 0;
7655      var $error;
7656      var $method = SIMPLEPIE_FILE_SOURCE_NONE;
7657  
7658  	function SimplePie_File($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
7659      {
7660          if (class_exists('idna_convert'))
7661          {
7662              $idn =& new idna_convert;
7663              $parsed = SimplePie_Misc::parse_url($url);
7664              $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
7665          }
7666          $this->url = $url;
7667          $this->useragent = $useragent;
7668          if (preg_match('/^http(s)?:\/\//i', $url))
7669          {
7670              if ($useragent === null)
7671              {
7672                  $useragent = ini_get('user_agent');
7673                  $this->useragent = $useragent;
7674              }
7675              if (!is_array($headers))
7676              {
7677                  $headers = array();
7678              }
7679              if (!$force_fsockopen && function_exists('curl_exec'))
7680              {
7681                  $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL;
7682                  $fp = curl_init();
7683                  $headers2 = array();
7684                  foreach ($headers as $key => $value)
7685                  {
7686                      $headers2[] = "$key: $value";
7687                  }
7688                  if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>='))
7689                  {
7690                      curl_setopt($fp, CURLOPT_ENCODING, '');
7691                  }
7692                  curl_setopt($fp, CURLOPT_URL, $url);
7693                  curl_setopt($fp, CURLOPT_HEADER, 1);
7694                  curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
7695                  curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
7696                  curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
7697                  curl_setopt($fp, CURLOPT_REFERER, $url);
7698                  curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
7699                  curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
7700                  if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>='))
7701                  {
7702                      curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
7703                      curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);
7704                  }
7705  
7706                  $this->headers = curl_exec($fp);
7707                  if (curl_errno($fp) === 23 || curl_errno($fp) === 61)
7708                  {
7709                      curl_setopt($fp, CURLOPT_ENCODING, 'none');
7710                      $this->headers = curl_exec($fp);
7711                  }
7712                  if (curl_errno($fp))
7713                  {
7714                      $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);
7715                      $this->success = false;
7716                  }
7717                  else
7718                  {
7719                      $info = curl_getinfo($fp);
7720                      curl_close($fp);
7721                      $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1);
7722                      $this->headers = array_pop($this->headers);
7723                      $parser =& new SimplePie_HTTP_Parser($this->headers);
7724                      if ($parser->parse())
7725                      {
7726                          $this->headers = $parser->headers;
7727                          $this->body = $parser->body;
7728                          $this->status_code = $parser->status_code;
7729                          if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
7730                          {
7731                              $this->redirects++;
7732                              $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
7733                              return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
7734                          }
7735                      }
7736                  }
7737              }
7738              else
7739              {
7740                  $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
7741                  $url_parts = parse_url($url);
7742                  $socket_host = $url_parts['host'];
7743                  if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https')
7744                  {
7745                      $socket_host = "ssl://$url_parts[host]";
7746                      $url_parts['port'] = 443;
7747                  }
7748                  if (!isset($url_parts['port']))
7749                  {
7750                      $url_parts['port'] = 80;
7751                  }
7752                  $fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout);
7753                  if (!$fp)
7754                  {
7755                      $this->error = 'fsockopen error: ' . $errstr;
7756                      $this->success = false;
7757                  }
7758                  else
7759                  {
7760                      stream_set_timeout($fp, $timeout);
7761                      if (isset($url_parts['path']))
7762                      {
7763                          if (isset($url_parts['query']))
7764                          {
7765                              $get = "$url_parts[path]?$url_parts[query]";
7766                          }
7767                          else
7768                          {
7769                              $get = $url_parts['path'];
7770                          }
7771                      }
7772                      else
7773                      {
7774                          $get = '/';
7775                      }
7776                      $out = "GET $get HTTP/1.0\r\n";
7777                      $out .= "Host: $url_parts[host]\r\n";
7778                      $out .= "User-Agent: $useragent\r\n";
7779                      if (extension_loaded('zlib'))
7780                      {
7781                          $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n";
7782                      }
7783  
7784                      if (isset($url_parts['user']) && isset($url_parts['pass']))
7785                      {
7786                          $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n";
7787                      }
7788                      foreach ($headers as $key => $value)
7789                      {
7790                          $out .= "$key: $value\r\n";
7791                      }
7792                      $out .= "Connection: Close\r\n\r\n";
7793                      fwrite($fp, $out);
7794  
7795                      $info = stream_get_meta_data($fp);
7796  
7797                      $this->headers = '';
7798                      while (!$info['eof'] && !$info['timed_out'])
7799                      {
7800                          $this->headers .= fread($fp, 1160);
7801                          $info = stream_get_meta_data($fp);
7802                      }
7803                      if (!$info['timed_out'])
7804                      {
7805                          $parser =& new SimplePie_HTTP_Parser($this->headers);
7806                          if ($parser->parse())
7807                          {
7808                              $this->headers = $parser->headers;
7809                              $this->body = $parser->body;
7810                              $this->status_code = $parser->status_code;
7811                              if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
7812                              {
7813                                  $this->redirects++;
7814                                  $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
7815                                  return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
7816                              }
7817                              if (isset($this->headers['content-encoding']))
7818                              {
7819                                  // Hey, we act dumb elsewhere, so let's do that here too
7820                                  switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20")))
7821                                  {
7822                                      case 'gzip':
7823                                      case 'x-gzip':
7824                                          $decoder =& new SimplePie_gzdecode($this->body);
7825                                          if (!$decoder->parse())
7826                                          {
7827                                              $this->error = 'Unable to decode HTTP "gzip" stream';
7828                                              $this->success = false;
7829                                          }
7830                                          else
7831                                          {
7832                                              $this->body = $decoder->data;
7833                                          }
7834                                          break;
7835  
7836                                      case 'deflate':
7837                                          if (($body = gzuncompress($this->body)) === false)
7838                                          {
7839                                              if (($body = gzinflate($this->body)) === false)
7840                                              {
7841                                                  $this->error = 'Unable to decode HTTP "deflate" stream';
7842                                                  $this->success = false;
7843                                              }
7844                                          }
7845                                          $this->body = $body;
7846                                          break;
7847  
7848                                      default:
7849                                          $this->error = 'Unknown content coding';
7850                                          $this->success = false;
7851                                  }
7852                              }
7853                          }
7854                      }
7855                      else
7856                      {
7857                          $this->error = 'fsocket timed out';
7858                          $this->success = false;
7859                      }
7860                      fclose($fp);
7861                  }
7862              }
7863          }
7864          else
7865          {
7866              $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS;
7867              if (!$this->body = file_get_contents($url))
7868              {
7869                  $this->error = 'file_get_contents could not read the file';
7870                  $this->success = false;
7871              }
7872          }
7873      }
7874  }
7875  
7876  /**
7877   * HTTP Response Parser
7878   *
7879   * @package SimplePie
7880   */
7881  class SimplePie_HTTP_Parser
7882  {
7883      /**
7884       * HTTP Version
7885       *
7886       * @access public
7887       * @var float
7888       */
7889      var $http_version = 0.0;
7890  
7891      /**
7892       * Status code
7893       *
7894       * @access public
7895       * @var int
7896       */
7897      var $status_code = 0;
7898  
7899      /**
7900       * Reason phrase
7901       *
7902       * @access public
7903       * @var string
7904       */
7905      var $reason = '';
7906  
7907      /**
7908       * Key/value pairs of the headers
7909       *
7910       * @access public
7911       * @var array
7912       */
7913      var $headers = array();
7914  
7915      /**
7916       * Body of the response
7917       *
7918       * @access public
7919       * @var string
7920       */
7921      var $body = '';
7922  
7923      /**
7924       * Current state of the state machine
7925       *
7926       * @access private
7927       * @var string
7928       */
7929      var $state = 'http_version';
7930  
7931      /**
7932       * Input data
7933       *
7934       * @access private
7935       * @var string
7936       */
7937      var $data = '';
7938  
7939      /**
7940       * Input data length (to avoid calling strlen() everytime this is needed)
7941       *
7942       * @access private
7943       * @var int
7944       */
7945      var $data_length = 0;
7946  
7947      /**
7948       * Current position of the pointer
7949       *
7950       * @var int
7951       * @access private
7952       */
7953      var $position = 0;
7954  
7955      /**
7956       * Name of the hedaer currently being parsed
7957       *
7958       * @access private
7959       * @var string
7960       */
7961      var $name = '';
7962  
7963      /**
7964       * Value of the hedaer currently being parsed
7965       *
7966       * @access private
7967       * @var string
7968       */
7969      var $value = '';
7970  
7971      /**
7972       * Create an instance of the class with the input data
7973       *
7974       * @access public
7975       * @param string $data Input data
7976       */
7977  	function SimplePie_HTTP_Parser($data)
7978      {
7979          $this->data = $data;
7980          $this->data_length = strlen($this->data);
7981      }
7982  
7983      /**
7984       * Parse the input data
7985       *
7986       * @access public
7987       * @return bool true on success, false on failure
7988       */
7989  	function parse()
7990      {
7991          while ($this->state && $this->state !== 'emit' && $this->has_data())
7992          {
7993              $state = $this->state;
7994              $this->$state();
7995          }
7996          $this->data = '';
7997          if ($this->state === 'emit' || $this->state === 'body')
7998          {
7999              return true;
8000          }
8001          else
8002          {
8003              $this->http_version = '';
8004              $this->status_code = '';
8005              $this->reason = '';
8006              $this->headers = array();
8007              $this->body = '';
8008              return false;
8009          }
8010      }
8011  
8012      /**
8013       * Check whether there is data beyond the pointer
8014       *
8015       * @access private
8016       * @return bool true if there is further data, false if not
8017       */
8018  	function has_data()
8019      {
8020          return (bool) ($this->position < $this->data_length);
8021      }
8022  
8023      /**
8024       * See if the next character is LWS
8025       *
8026       * @access private
8027       * @return bool true if the next character is LWS, false if not
8028       */
8029  	function is_linear_whitespace()
8030      {
8031          return (bool) ($this->data[$this->position] === "\x09"
8032              || $this->data[$this->position] === "\x20"
8033              || ($this->data[$this->position] === "\x0A"
8034                  && isset($this->data[$this->position + 1])
8035                  && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20")));
8036      }
8037  
8038      /**
8039       * Parse the HTTP version
8040       *
8041       * @access private
8042       */
8043  	function http_version()
8044      {
8045          if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/')
8046          {
8047              $len = strspn($this->data, '0123456789.', 5);
8048              $this->http_version = substr($this->data, 5, $len);
8049              $this->position += 5 + $len;
8050              if (substr_count($this->http_version, '.') <= 1)
8051              {
8052                  $this->http_version = (float) $this->http_version;
8053                  $this->position += strspn($this->data, "\x09\x20", $this->position);
8054                  $this->state = 'status';
8055              }
8056              else
8057              {
8058                  $this->state = false;
8059              }
8060          }
8061          else
8062          {
8063              $this->state = false;
8064          }
8065      }
8066  
8067      /**
8068       * Parse the status code
8069       *
8070       * @access private
8071       */
8072  	function status()
8073      {
8074          if ($len = strspn($this->data, '0123456789', $this->position))
8075          {
8076              $this->status_code = (int) substr($this->data, $this->position, $len);
8077              $this->position += $len;
8078              $this->state = 'reason';
8079          }
8080          else
8081          {
8082              $this->state = false;
8083          }
8084      }
8085  
8086      /**
8087       * Parse the reason phrase
8088       *
8089       * @access private
8090       */
8091  	function reason()
8092      {
8093          $len = strcspn($this->data, "\x0A", $this->position);
8094          $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20");
8095          $this->position += $len + 1;
8096          $this->state = 'new_line';
8097      }
8098  
8099      /**
8100       * Deal with a new line, shifting data around as needed
8101       *
8102       * @access private
8103       */
8104  	function new_line()
8105      {
8106          $this->value = trim($this->value, "\x0D\x20");
8107          if ($this->name !== '' && $this->value !== '')
8108          {
8109              $this->name = strtolower($this->name);
8110              if (isset($this->headers[$this->name]))
8111              {
8112                  $this->headers[$this->name] .= ', ' . $this->value;
8113              }
8114              else
8115              {
8116                  $this->headers[$this->name] = $this->value;
8117              }
8118          }
8119          $this->name = '';
8120          $this->value = '';
8121          if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A")
8122          {
8123              $this->position += 2;
8124              $this->state = 'body';
8125          }
8126          elseif ($this->data[$this->position] === "\x0A")
8127          {
8128              $this->position++;
8129              $this->state = 'body';
8130          }
8131          else
8132          {
8133              $this->state = 'name';
8134          }
8135      }
8136  
8137      /**
8138       * Parse a header name
8139       *
8140       * @access private
8141       */
8142  	function name()
8143      {
8144          $len = strcspn($this->data, "\x0A:", $this->position);
8145          if (isset($this->data[$this->position + $len]))
8146          {
8147              if ($this->data[$this->position + $len] === "\x0A")
8148              {
8149                  $this->position += $len;
8150                  $this->state = 'new_line';
8151              }
8152              else
8153              {
8154                  $this->name = substr($this->data, $this->position, $len);
8155                  $this->position += $len + 1;
8156                  $this->state = 'value';
8157              }
8158          }
8159          else
8160          {
8161              $this->state = false;
8162          }
8163      }
8164  
8165      /**
8166       * Parse LWS, replacing consecutive LWS characters with a single space
8167       *
8168       * @access private
8169       */
8170  	function linear_whitespace()
8171      {
8172          do
8173          {
8174              if (substr($this->data, $this->position, 2) === "\x0D\x0A")
8175              {
8176                  $this->position += 2;
8177              }
8178              elseif ($this->data[$this->position] === "\x0A")
8179              {
8180                  $this->position++;
8181              }
8182              $this->position += strspn($this->data, "\x09\x20", $this->position);
8183          } while ($this->has_data() && $this->is_linear_whitespace());
8184          $this->value .= "\x20";
8185      }
8186  
8187      /**
8188       * See what state to move to while within non-quoted header values
8189       *
8190       * @access private
8191       */
8192  	function value()
8193      {
8194          if ($this->is_linear_whitespace())
8195          {
8196              $this->linear_whitespace();
8197          }
8198          else
8199          {
8200              switch ($this->data[$this->position])
8201              {
8202                  case '"':
8203                      $this->position++;
8204                      $this->state = 'quote';
8205                      break;
8206  
8207                  case "\x0A":
8208                      $this->position++;
8209                      $this->state = 'new_line';
8210                      break;
8211  
8212                  default:
8213                      $this->state = 'value_char';
8214                      break;
8215              }
8216          }
8217      }
8218  
8219      /**
8220       * Parse a header value while outside quotes
8221       *
8222       * @access private
8223       */
8224  	function value_char()
8225      {
8226          $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position);
8227          $this->value .= substr($this->data, $this->position, $len);
8228          $this->position += $len;
8229          $this->state = 'value';
8230      }
8231  
8232      /**
8233       * See what state to move to while within quoted header values
8234       *
8235       * @access private
8236       */
8237  	function quote()
8238      {
8239          if ($this->is_linear_whitespace())
8240          {
8241              $this->linear_whitespace();
8242          }
8243          else
8244          {
8245              switch ($this->data[$this->position])
8246              {
8247                  case '"':
8248                      $this->position++;
8249                      $this->state = 'value';
8250                      break;
8251  
8252                  case "\x0A":
8253                      $this->position++;
8254                      $this->state = 'new_line';
8255                      break;
8256  
8257                  case '\\':
8258                      $this->position++;
8259                      $this->state = 'quote_escaped';
8260                      break;
8261  
8262                  default:
8263                      $this->state = 'quote_char';
8264                      break;
8265              }
8266          }
8267      }
8268  
8269      /**
8270       * Parse a header value while within quotes
8271       *
8272       * @access private
8273       */
8274  	function quote_char()
8275      {
8276          $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position);
8277          $this->value .= substr($this->data, $this->position, $len);
8278          $this->position += $len;
8279          $this->state = 'value';
8280      }
8281  
8282      /**
8283       * Parse an escaped character within quotes
8284       *
8285       * @access private
8286       */
8287  	function quote_escaped()
8288      {
8289          $this->value .= $this->data[$this->position];
8290          $this->position++;
8291          $this->state = 'quote';
8292      }
8293  
8294      /**
8295       * Parse the body
8296       *
8297       * @access private
8298       */
8299  	function body()
8300      {
8301          $this->body = substr($this->data, $this->position);
8302          $this->state = 'emit';
8303      }
8304  }
8305  
8306  /**
8307   * gzdecode
8308   *
8309   * @package SimplePie
8310   */
8311  class SimplePie_gzdecode
8312  {
8313      /**
8314       * Compressed data
8315       *
8316       * @access private
8317       * @see gzdecode::$data
8318       */
8319      var $compressed_data;
8320  
8321      /**
8322       * Size of compressed data
8323       *
8324       * @access private
8325       */
8326      var $compressed_size;
8327  
8328      /**
8329       * Minimum size of a valid gzip string
8330       *
8331       * @access private
8332       */
8333      var $min_compressed_size = 18;
8334  
8335      /**
8336       * Current position of pointer
8337       *
8338       * @access private
8339       */
8340      var $position = 0;
8341  
8342      /**
8343       * Flags (FLG)
8344       *
8345       * @access private
8346       */
8347      var $flags;
8348  
8349      /**
8350       * Uncompressed data
8351       *
8352       * @access public
8353       * @see gzdecode::$compressed_data
8354       */
8355      var $data;
8356  
8357      /**
8358       * Modified time
8359       *
8360       * @access public
8361       */
8362      var $MTIME;
8363  
8364      /**
8365       * Extra Flags
8366       *
8367       * @access public
8368       */
8369      var $XFL;
8370  
8371      /**
8372       * Operating System
8373       *
8374       * @access public
8375       */
8376      var $OS;
8377  
8378      /**
8379       * Subfield ID 1
8380       *
8381       * @access public
8382       * @see gzdecode::$extra_field
8383       * @see gzdecode::$SI2
8384       */
8385      var $SI1;
8386  
8387      /**
8388       * Subfield ID 2
8389       *
8390       * @access public
8391       * @see gzdecode::$extra_field
8392       * @see gzdecode::$SI1
8393       */
8394      var $SI2;
8395  
8396      /**
8397       * Extra field content
8398       *
8399       * @access public
8400       * @see gzdecode::$SI1
8401       * @see gzdecode::$SI2
8402       */
8403      var $extra_field;
8404  
8405      /**
8406       * Original filename
8407       *
8408       * @access public
8409       */
8410      var $filename;
8411  
8412      /**
8413       * Human readable comment
8414       *
8415       * @access public
8416       */
8417      var $comment;
8418  
8419      /**
8420       * Don't allow anything to be set
8421       *
8422       * @access public
8423       */
8424  	function __set($name, $value)
8425      {
8426          trigger_error("Cannot write property $name", E_USER_ERROR);
8427      }
8428  
8429      /**
8430       * Set the compressed string and related properties
8431       *
8432       * @access public
8433       */
8434  	function SimplePie_gzdecode($data)
8435      {
8436          $this->compressed_data = $data;
8437          $this->compressed_size = strlen($data);
8438      }
8439  
8440      /**
8441       * Decode the GZIP stream
8442       *
8443       * @access public
8444       */
8445  	function parse()
8446      {
8447          if ($this->compressed_size >= $this->min_compressed_size)
8448          {
8449              // Check ID1, ID2, and CM
8450              if (substr($this->compressed_data, 0, 3) !== "\x1F\x8B\x08")
8451              {
8452                  return false;
8453              }
8454  
8455              // Get the FLG (FLaGs)
8456              $this->flags = ord($this->compressed_data[3]);
8457  
8458              // FLG bits above (1 << 4) are reserved
8459              if ($this->flags > 0x1F)
8460              {
8461                  return false;
8462              }
8463  
8464              // Advance the pointer after the above
8465              $this->position += 4;
8466  
8467              // MTIME
8468              $mtime = substr($this->compressed_data, $this->position, 4);
8469              // Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness
8470              if (current(unpack('S', "\x00\x01")) === 1)
8471              {
8472                  $mtime = strrev($mtime);
8473              }
8474              $this->MTIME = current(unpack('l', $mtime));
8475              $this->position += 4;
8476  
8477              // Get the XFL (eXtra FLags)
8478              $this->XFL = ord($this->compressed_data[$this->position++]);
8479  
8480              // Get the OS (Operating System)
8481              $this->OS = ord($this->compressed_data[$this->position++]);
8482  
8483              // Parse the FEXTRA
8484              if ($this->flags & 4)
8485              {
8486                  // Read subfield IDs
8487                  $this->SI1 = $this->compressed_data[$this->position++];
8488                  $this->SI2 = $this->compressed_data[$this->position++];
8489  
8490                  // SI2 set to zero is reserved for future use
8491                  if ($this->SI2 === "\x00")
8492                  {
8493                      return false;
8494                  }
8495  
8496                  // Get the length of the extra field
8497                  $len = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
8498                  $this->position += 2;
8499  
8500                  // Check the length of the string is still valid
8501                  $this->min_compressed_size += $len + 4;
8502                  if ($this->compressed_size >= $this->min_compressed_size)
8503                  {
8504                      // Set the extra field to the given data
8505                      $this->extra_field = substr($this->compressed_data, $this->position, $len);
8506                      $this->position += $len;
8507                  }
8508                  else
8509                  {
8510                      return false;
8511                  }
8512              }
8513  
8514              // Parse the FNAME
8515              if ($this->flags & 8)
8516              {
8517                  // Get the length of the filename
8518                  $len = strcspn($this->compressed_data, "\x00", $this->position);
8519  
8520                  // Check the length of the string is still valid
8521                  $this->min_compressed_size += $len + 1;
8522                  if ($this->compressed_size >= $this->min_compressed_size)
8523                  {
8524                      // Set the original filename to the given string
8525                      $this->filename = substr($this->compressed_data, $this->position, $len);
8526                      $this->position += $len + 1;
8527                  }
8528                  else
8529                  {
8530                      return false;
8531                  }
8532              }
8533  
8534              // Parse the FCOMMENT
8535              if ($this->flags & 16)
8536              {
8537                  // Get the length of the comment
8538                  $len = strcspn($this->compressed_data, "\x00", $this->position);
8539  
8540                  // Check the length of the string is still valid
8541                  $this->min_compressed_size += $len + 1;
8542                  if ($this->compressed_size >= $this->min_compressed_size)
8543                  {
8544                      // Set the original comment to the given string
8545                      $this->comment = substr($this->compressed_data, $this->position, $len);
8546                      $this->position += $len + 1;
8547                  }
8548                  else
8549                  {
8550                      return false;
8551                  }
8552              }
8553  
8554              // Parse the FHCRC
8555              if ($this->flags & 2)
8556              {
8557                  // Check the length of the string is still valid
8558                  $this->min_compressed_size += $len + 2;
8559                  if ($this->compressed_size >= $this->min_compressed_size)
8560                  {
8561                      // Read the CRC
8562                      $crc = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
8563  
8564                      // Check the CRC matches
8565                      if ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc)
8566                      {
8567                          $this->position += 2;
8568                      }
8569                      else
8570                      {
8571                          return false;
8572                      }
8573                  }
8574                  else
8575                  {
8576                      return false;
8577                  }
8578              }
8579  
8580              // Decompress the actual data
8581              if (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false)
8582              {
8583                  return false;
8584              }
8585              else
8586              {
8587                  $this->position = $this->compressed_size - 8;
8588              }
8589  
8590              // Check CRC of data
8591              $crc = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
8592              $this->position += 4;
8593              /*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc))
8594              {
8595                  return false;
8596              }*/
8597  
8598              // Check ISIZE of data
8599              $isize = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
8600              $this->position += 4;
8601              if (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize))
8602              {
8603                  return false;
8604              }
8605  
8606              // Wow, against all odds, we've actually got a valid gzip string
8607              return true;
8608          }
8609          else
8610          {
8611              return false;
8612          }
8613      }
8614  }
8615  
8616  class SimplePie_Cache
8617  {
8618      /**
8619       * Don't call the constructor. Please.
8620       *
8621       * @access private
8622       */
8623  	function SimplePie_Cache()
8624      {
8625          trigger_error('Please call SimplePie_Cache::create() instead of the constructor', E_USER_ERROR);
8626      }
8627  
8628      /**
8629       * Create a new SimplePie_Cache object
8630       *
8631       * @static
8632       * @access public
8633       */
8634  	function create($location, $filename, $extension)
8635      {
8636          $location_iri =& new SimplePie_IRI($location);
8637          switch ($location_iri->get_scheme())
8638          {
8639              case 'mysql':
8640                  if (extension_loaded('mysql'))
8641                  {
8642                      return new SimplePie_Cache_MySQL($location_iri, $filename, $extension);
8643                  }
8644                  break;
8645  
8646              default:
8647                  return new SimplePie_Cache_File($location, $filename, $extension);
8648          }
8649      }
8650  }
8651  
8652  class SimplePie_Cache_File
8653  {
8654      var $location;
8655      var $filename;
8656      var $extension;
8657      var $name;
8658  
8659  	function SimplePie_Cache_File($location, $filename, $extension)
8660      {
8661          $this->location = $location;
8662          $this->filename = $filename;
8663          $this->extension = $extension;
8664          $this->name = "$this->location/$this->filename.$this->extension";
8665      }
8666  
8667  	function save($data)
8668      {
8669          if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location))
8670          {
8671              if (is_a($data, 'SimplePie'))
8672              {
8673                  $data = $data->data;
8674              }
8675  
8676              $data = serialize($data);
8677  
8678              if (function_exists('file_put_contents'))
8679              {
8680                  return (bool) file_put_contents($this->name, $data);
8681              }
8682              else
8683              {
8684                  $fp = fopen($this->name, 'wb');
8685                  if ($fp)
8686                  {
8687                      fwrite($fp, $data);
8688                      fclose($fp);
8689                      return true;
8690                  }
8691              }
8692          }
8693          return false;
8694      }
8695  
8696  	function load()
8697      {
8698          if (file_exists($this->name) && is_readable($this->name))
8699          {
8700              return unserialize(file_get_contents($this->name));
8701          }
8702          return false;
8703      }
8704  
8705  	function mtime()
8706      {
8707          if (file_exists($this->name))
8708          {
8709              return filemtime($this->name);
8710          }
8711          return false;
8712      }
8713  
8714  	function touch()
8715      {
8716          if (file_exists($this->name))
8717          {
8718              return touch($this->name);
8719          }
8720          return false;
8721      }
8722  
8723  	function unlink()
8724      {
8725          if (file_exists($this->name))
8726          {
8727              return unlink($this->name);
8728          }
8729          return false;
8730      }
8731  }
8732  
8733  class SimplePie_Cache_DB
8734  {
8735  	function prepare_simplepie_object_for_cache($data)
8736      {
8737          $items = $data->get_items();
8738          $items_by_id = array();
8739  
8740          if (!empty($items))
8741          {
8742              foreach ($items as $item)
8743              {
8744                  $items_by_id[$item->get_id()] = $item;
8745              }
8746  
8747              if (count($items_by_id) !== count($items))
8748              {
8749                  $items_by_id = array();
8750                  foreach ($items as $item)
8751                  {
8752                      $items_by_id[$item->get_id(true)] = $item;
8753                  }
8754              }
8755  
8756              if (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))
8757              {
8758                  $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];
8759              }
8760              elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))
8761              {
8762                  $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];
8763              }
8764              elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))
8765              {
8766                  $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];
8767              }
8768              elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]))
8769              {
8770                  $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0];
8771              }
8772              else
8773              {
8774                  $channel = null;
8775              }
8776  
8777              if ($channel !== null)
8778              {
8779                  if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']))
8780                  {
8781                      unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']);
8782                  }
8783                  if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']))
8784                  {
8785                      unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']);
8786                  }
8787                  if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']))
8788                  {
8789                      unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']);
8790                  }
8791                  if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']))
8792                  {
8793                      unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']);
8794                  }
8795                  if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']))
8796                  {
8797                      unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']);
8798                  }
8799              }
8800              if (isset($data->data['items']))
8801              {
8802                  unset($data->data['items']);
8803              }
8804              if (isset($data->data['ordered_items']))
8805              {
8806                  unset($data->data['ordered_items']);
8807              }
8808          }
8809          return array(serialize($data->data), $items_by_id);
8810      }
8811  }
8812  
8813  class SimplePie_Cache_MySQL extends SimplePie_Cache_DB
8814  {
8815      var $mysql;
8816      var $options;
8817      var $id;
8818  
8819  	function SimplePie_Cache_MySQL($mysql_location, $name, $extension)
8820      {
8821          $host = $mysql_location->get_host();
8822          if (SimplePie_Misc::stripos($host, 'unix(') === 0 && substr($host, -1) === ')')
8823          {
8824              $server = ':' . substr($host, 5, -1);
8825          }
8826          else
8827          {
8828              $server = $host;
8829              if ($mysql_location->get_port() !== null)
8830              {
8831                  $server .= ':' . $mysql_location->get_port();
8832              }
8833          }
8834  
8835          if (strpos($mysql_location->get_userinfo(), ':') !== false)
8836          {
8837              list($username, $password) = explode(':', $mysql_location->get_userinfo(), 2);
8838          }
8839          else
8840          {
8841              $username = $mysql_location->get_userinfo();
8842              $password = null;
8843          }
8844  
8845          if ($this->mysql = mysql_connect($server, $username, $password))
8846          {
8847              $this->id = $name . $extension;
8848              $this->options = SimplePie_Misc::parse_str($mysql_location->get_query());
8849              if (!isset($this->options['prefix'][0]))
8850              {
8851                  $this->options['prefix'][0] = '';
8852              }
8853  
8854              if (mysql_select_db(ltrim($mysql_location->get_path(), '/'))
8855                  && mysql_query('SET NAMES utf8')
8856                  && ($query = mysql_unbuffered_query('SHOW TABLES')))
8857              {
8858                  $db = array();
8859                  while ($row = mysql_fetch_row($query))
8860                  {
8861                      $db[] = $row[0];
8862                  }
8863  
8864                  if (!in_array($this->options['prefix'][0] . 'cache_data', $db))
8865                  {
8866                      if (!mysql_query('CREATE TABLE `' . $this->options['prefix'][0] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))'))
8867                      {
8868                          $this->mysql = null;
8869                      }
8870                  }
8871  
8872                  if (!in_array($this->options['prefix'][0] . 'items', $db))
8873                  {
8874                      if (!mysql_query('CREATE TABLE `' . $this->options['prefix'][0] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` TEXT CHARACTER SET utf8 NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))'))
8875                      {
8876                          $this->mysql = null;
8877                      }
8878                  }
8879              }
8880              else
8881              {
8882                  $this->mysql = null;
8883              }
8884          }
8885      }
8886  
8887  	function save($data)
8888      {
8889          if ($this->mysql)
8890          {
8891              $feed_id = "'" . mysql_real_escape_string($this->id) . "'";
8892  
8893              if (is_a($data, 'SimplePie'))
8894              {
8895                  if (SIMPLEPIE_PHP5)
8896                  {
8897                      // This keyword needs to defy coding standards for PHP4 compatibility
8898                      $data = clone($data);
8899                  }
8900  
8901                  $prepared = $this->prepare_simplepie_object_for_cache($data);
8902  
8903                  if ($query = mysql_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = ' . $feed_id, $this->mysql))
8904                  {
8905                      if (mysql_num_rows($query))
8906                      {
8907                          $items = count($prepared[1]);
8908                          if ($items)
8909                          {
8910                              $sql = 'UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `items` = ' . $items . ', `data` = \'' . mysql_real_escape_string($prepared[0]) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id;
8911                          }
8912                          else
8913                          {
8914                              $sql = 'UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `data` = \'' . mysql_real_escape_string($prepared[0]) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id;
8915                          }
8916  
8917                          if (!mysql_query($sql, $this->mysql))
8918                          {
8919                              return false;
8920                          }
8921                      }
8922                      elseif (!mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(' . $feed_id . ', ' . count($prepared[1]) . ', \'' . mysql_real_escape_string($prepared[0]) . '\', ' . time() . ')', $this->mysql))
8923                      {
8924                          return false;
8925                      }
8926  
8927                      $ids = array_keys($prepared[1]);
8928                      if (!empty($ids))
8929                      {
8930                          foreach ($ids as $id)
8931                          {
8932                              $database_ids[] = mysql_real_escape_string($id);
8933                          }
8934  
8935                          if ($query = mysql_unbuffered_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'items` WHERE `id` = \'' . implode('\' OR `id` = \'', $database_ids) . '\' AND `feed_id` = ' . $feed_id, $this->mysql))
8936                          {
8937                              $existing_ids = array();
8938                              while ($row = mysql_fetch_row($query))
8939                              {
8940                                  $existing_ids[] = $row[0];
8941                              }
8942  
8943                              $new_ids = array_diff($ids, $existing_ids);
8944  
8945                              foreach ($new_ids as $new_id)
8946                              {
8947                                  if (!($date = $prepared[1][$new_id]->get_date('U')))
8948                                  {
8949                                      $date = time();
8950                                  }
8951  
8952                                  if (!mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(' . $feed_id . ', \'' . mysql_real_escape_string($new_id) . '\', \'' . mysql_real_escape_string(serialize($prepared[1][$new_id]->data)) . '\', ' . $date . ')', $this->mysql))
8953                                  {
8954                                      return false;
8955                                  }
8956                              }
8957                              return true;
8958                          }
8959                      }
8960                      else
8961                      {
8962                          return true;
8963                      }
8964                  }
8965              }
8966              elseif ($query = mysql_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = ' . $feed_id, $this->mysql))
8967              {
8968                  if (mysql_num_rows($query))
8969                  {
8970                      if (mysql_query('UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `items` = 0, `data` = \'' . mysql_real_escape_string(serialize($data)) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id, $this->mysql))
8971                      {
8972                          return true;
8973                      }
8974                  }
8975                  elseif (mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(\'' . mysql_real_escape_string($this->id) . '\', 0, \'' . mysql_real_escape_string(serialize($data)) . '\', ' . time() . ')', $this->mysql))
8976                  {
8977                      return true;
8978                  }
8979              }
8980          }
8981          return false;
8982      }
8983  
8984  	function load()
8985      {
8986          if ($this->mysql && ($query = mysql_query('SELECT `items`, `data` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($row = mysql_fetch_row($query)))
8987          {
8988              $data = unserialize($row[1]);
8989  
8990              if (isset($this->options['items'][0]))
8991              {
8992                  $items = (int) $this->options['items'][0];
8993              }
8994              else
8995              {
8996                  $items = (int) $row[0];
8997              }
8998  
8999              if ($items !== 0)
9000              {
9001                  if (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))
9002                  {
9003                      $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];
9004                  }
9005                  elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))
9006                  {
9007                      $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];
9008                  }
9009                  elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))
9010                  {
9011                      $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];
9012                  }
9013                  elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]))
9014                  {
9015                      $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0];
9016                  }
9017                  else
9018                  {
9019                      $feed = null;
9020                  }
9021  
9022                  if ($feed !== null)
9023                  {
9024                      $sql = 'SELECT `data` FROM `' . $this->options['prefix'][0] . 'items` WHERE `feed_id` = \'' . mysql_real_escape_string($this->id) . '\' ORDER BY `posted` DESC';
9025                      if ($items > 0)
9026                      {
9027                          $sql .= ' LIMIT ' . $items;
9028                      }
9029  
9030                      if ($query = mysql_unbuffered_query($sql, $this->mysql))
9031                      {
9032                          while ($row = mysql_fetch_row($query))
9033                          {
9034                              $feed['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'][] = unserialize($row[0]);
9035                          }
9036                      }
9037                      else
9038                      {
9039                          return false;
9040                      }
9041                  }
9042              }
9043              return $data;
9044          }
9045          return false;
9046      }
9047  
9048  	function mtime()
9049      {
9050          if ($this->mysql && ($query = mysql_query('SELECT `mtime` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($row = mysql_fetch_row($query)))
9051          {
9052              return $row[0];
9053          }
9054          else
9055          {
9056              return false;
9057          }
9058      }
9059  
9060  	function touch()
9061      {
9062          if ($this->mysql && ($query = mysql_query('UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `mtime` = ' . time() . ' WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && mysql_affected_rows($this->mysql))
9063          {
9064              return true;
9065          }
9066          else
9067          {
9068              return false;
9069          }
9070      }
9071  
9072  	function unlink()
9073      {
9074          if ($this->mysql && ($query = mysql_query('DELETE FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($query2 = mysql_query('DELETE FROM `' . $this->options['prefix'][0] . 'items` WHERE `feed_id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)))
9075          {
9076              return true;
9077          }
9078          else
9079          {
9080              return false;
9081          }
9082      }
9083  }
9084  
9085  class SimplePie_Misc
9086  {
9087  	function time_hms($seconds)
9088      {
9089          $time = '';
9090  
9091          $hours = floor($seconds / 3600);
9092          $remainder = $seconds % 3600;
9093          if ($hours > 0)
9094          {
9095              $time .= $hours.':';
9096          }
9097  
9098          $minutes = floor($remainder / 60);
9099          $seconds = $remainder % 60;
9100          if ($minutes < 10 && $hours > 0)
9101          {
9102              $minutes = '0' . $minutes;
9103          }
9104          if ($seconds < 10)
9105          {
9106              $seconds = '0' . $seconds;
9107          }
9108  
9109          $time .= $minutes.':';
9110          $time .= $seconds;
9111  
9112          return $time;
9113      }
9114  
9115  	function absolutize_url($relative, $base)
9116      {
9117          $iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative);
9118          return $iri->get_iri();
9119      }
9120  
9121  	function remove_dot_segments($input)
9122      {
9123          $output = '';
9124          while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..')
9125          {
9126              // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise,
9127              if (strpos($input, '../') === 0)
9128              {
9129                  $input = substr($input, 3);
9130              }
9131              elseif (strpos($input, './') === 0)
9132              {
9133                  $input = substr($input, 2);
9134              }
9135              // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise,
9136              elseif (strpos($input, '/./') === 0)
9137              {
9138                  $input = substr_replace($input, '/', 0, 3);
9139              }
9140              elseif ($input === '/.')
9141              {
9142                  $input = '/';
9143              }
9144              // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise,
9145              elseif (strpos($input, '/../') === 0)
9146              {
9147                  $input = substr_replace($input, '/', 0, 4);
9148                  $output = substr_replace($output, '', strrpos($output, '/'));
9149              }
9150              elseif ($input === '/..')
9151              {
9152                  $input = '/';
9153                  $output = substr_replace($output, '', strrpos($output, '/'));
9154              }
9155              // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise,
9156              elseif ($input === '.' || $input === '..')
9157              {
9158                  $input = '';
9159              }
9160              // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer
9161              elseif (($pos = strpos($input, '/', 1)) !== false)
9162              {
9163                  $output .= substr($input, 0, $pos);
9164                  $input = substr_replace($input, '', 0, $pos);
9165              }
9166              else
9167              {
9168                  $output .= $input;
9169                  $input = '';
9170              }
9171          }
9172          return $output . $input;
9173      }
9174  
9175  	function get_element($realname, $string)
9176      {
9177          $return = array();
9178          $name = preg_quote($realname, '/');
9179          if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE))
9180          {
9181              for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++)
9182              {
9183                  $return[$i]['tag'] = $realname;
9184                  $return[$i]['full'] = $matches[$i][0][0];
9185                  $return[$i]['offset'] = $matches[$i][0][1];
9186                  if (strlen($matches[$i][3][0]) <= 2)
9187                  {
9188                      $return[$i]['self_closing'] = true;
9189                  }
9190                  else
9191                  {
9192                      $return[$i]['self_closing'] = false;
9193                      $return[$i]['content'] = $matches[$i][4][0];
9194                  }
9195                  $return[$i]['attribs'] = array();
9196                  if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER))
9197                  {
9198                      for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++)
9199                      {
9200                          if (count($attribs[$j]) === 2)
9201                          {
9202                              $attribs[$j][2] = $attribs[$j][1];
9203                          }
9204                          $return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j]), 'UTF-8');
9205                      }
9206                  }
9207              }
9208          }
9209          return $return;
9210      }
9211  
9212  	function element_implode($element)
9213      {
9214          $full = "<$element[tag]";
9215          foreach ($element['attribs'] as $key => $value)
9216          {
9217              $key = strtolower($key);
9218              $full .= " $key=\"" . htmlspecialchars($value['data']) . '"';
9219          }
9220          if ($element['self_closing'])
9221          {
9222              $full .= ' />';
9223          }
9224          else
9225          {
9226              $full .= ">$element[content]</$element[tag]>";
9227          }
9228          return $full;
9229      }
9230  
9231  	function error($message, $level, $file, $line)
9232      {
9233          if ((ini_get('error_reporting') & $level) > 0)
9234          {
9235              switch ($level)
9236              {
9237                  case E_USER_ERROR:
9238                      $note = 'PHP Error';
9239                      break;
9240                  case E_USER_WARNING:
9241                      $note = 'PHP Warning';
9242                      break;
9243                  case E_USER_NOTICE:
9244                      $note = 'PHP Notice';
9245                      break;
9246                  default:
9247                      $note = 'Unknown Error';
9248                      break;
9249              }
9250  
9251              $log_error = true;
9252              if (!function_exists('error_log'))
9253              {
9254                  $log_error = false;
9255              }
9256  
9257              $log_file = @ini_get('error_log');
9258              if (!empty($log_file) && ('syslog' != $log_file) && !@is_writable($log_file))
9259              {
9260                  $log_error = false;
9261              }
9262  
9263              if ($log_error)
9264              {
9265                  @error_log("$note: $message in $file on line $line", 0);
9266              }
9267          }
9268  
9269          return $message;
9270      }
9271  
9272      /**
9273       * If a file has been cached, retrieve and display it.
9274       *
9275       * This is most useful for caching images (get_favicon(), etc.),
9276       * however it works for all cached files.  This WILL NOT display ANY
9277       * file/image/page/whatever, but rather only display what has already
9278       * been cached by SimplePie.
9279       *
9280       * @access public
9281       * @see SimplePie::get_favicon()
9282       * @param str $identifier_url URL that is used to identify the content.
9283       * This may or may not be the actual URL of the live content.
9284       * @param str $cache_location Location of SimplePie's cache.  Defaults
9285       * to './cache'.
9286       * @param str $cache_extension The file extension that the file was
9287       * cached with.  Defaults to 'spc'.
9288       * @param str $cache_class Name of the cache-handling class being used
9289       * in SimplePie.  Defaults to 'SimplePie_Cache', and should be left
9290       * as-is unless you've overloaded the class.
9291       * @param str $cache_name_function Obsolete. Exists for backwards
9292       * compatibility reasons only.
9293       */
9294  	function display_cached_file($identifier_url, $cache_location = './cache', $cache_extension = 'spc', $cache_class = 'SimplePie_Cache', $cache_name_function = 'md5')
9295      {
9296          $cache = call_user_func(array($cache_class, 'create'), $cache_location, $identifier_url, $cache_extension);
9297  
9298          if ($file = $cache->load())
9299          {
9300              if (isset($file['headers']['content-type']))
9301              {
9302                  header('Content-type:' . $file['headers']['content-type']);
9303              }
9304              else
9305              {
9306                  header('Content-type: application/octet-stream');
9307              }
9308              header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
9309              echo $file['body'];
9310              exit;
9311          }
9312  
9313          die('Cached file for ' . $identifier_url . ' cannot be found.');
9314      }
9315  
9316  	function fix_protocol($url, $http = 1)
9317      {
9318          $url = SimplePie_Misc::normalize_url($url);
9319          $parsed = SimplePie_Misc::parse_url($url);
9320          if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https')
9321          {
9322              return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http);
9323          }
9324  
9325          if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url))
9326          {
9327              return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http);
9328          }
9329  
9330          if ($http === 2 && $parsed['scheme'] !== '')
9331          {
9332              return "feed:$url";
9333          }
9334          elseif ($http === 3 && strtolower($parsed['scheme']) === 'http')
9335          {
9336              return substr_replace($url, 'podcast', 0, 4);
9337          }
9338          elseif ($http === 4 && strtolower($parsed['scheme']) === 'http')
9339          {
9340              return substr_replace($url, 'itpc', 0, 4);
9341          }
9342          else
9343          {
9344              return $url;
9345          }
9346      }
9347  
9348  	function parse_url($url)
9349      {
9350          $iri =& new SimplePie_IRI($url);
9351          return array(
9352              'scheme' => (string) $iri->get_scheme(),
9353              'authority' => (string) $iri->get_authority(),
9354              'path' => (string) $iri->get_path(),
9355              'query' => (string) $iri->get_query(),
9356              'fragment' => (string) $iri->get_fragment()
9357          );
9358      }
9359  
9360  	function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '')
9361      {
9362          $iri =& new SimplePie_IRI('');
9363          $iri->set_scheme($scheme);
9364          $iri->set_authority($authority);
9365          $iri->set_path($path);
9366          $iri->set_query($query);
9367          $iri->set_fragment($fragment);
9368          return $iri->get_iri();
9369      }
9370  
9371  	function normalize_url($url)
9372      {
9373          $iri =& new SimplePie_IRI($url);
9374          return $iri->get_iri();
9375      }
9376  
9377  	function percent_encoding_normalization($match)
9378      {
9379          $integer = hexdec($match[1]);
9380          if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E)
9381          {
9382              return chr($integer);
9383          }
9384          else
9385          {
9386              return strtoupper($match[0]);
9387          }
9388      }
9389  
9390      /**
9391       * Remove bad UTF-8 bytes
9392       *
9393       * PCRE Pattern to locate bad bytes in a UTF-8 string comes from W3C
9394       * FAQ: Multilingual Forms (modified to include full ASCII range)
9395       *
9396       * @author Geoffrey Sneddon
9397       * @see http://www.w3.org/International/questions/qa-forms-utf-8
9398       * @param string $str String to remove bad UTF-8 bytes from
9399       * @return string UTF-8 string
9400       */
9401  	function utf8_bad_replace($str)
9402      {
9403          if (function_exists('iconv') && ($return = @iconv('UTF-8', 'UTF-8//IGNORE', $str)))
9404          {
9405              return $return;
9406          }
9407          elseif (function_exists('mb_convert_encoding') && ($return = @mb_convert_encoding($str, 'UTF-8', 'UTF-8')))
9408          {
9409              return $return;
9410          }
9411          elseif (preg_match_all('/(?:[\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})+/', $str, $matches))
9412          {
9413              return implode("\xEF\xBF\xBD", $matches[0]);
9414          }
9415          elseif ($str !== '')
9416          {
9417              return "\xEF\xBF\xBD";
9418          }
9419          else
9420          {
9421              return '';
9422          }
9423      }
9424  
9425      /**
9426       * Converts a Windows-1252 encoded string to a UTF-8 encoded string
9427       *
9428       * @static
9429       * @access public
9430       * @param string $string Windows-1252 encoded string
9431       * @return string UTF-8 encoded string
9432       */
9433  	function windows_1252_to_utf8($string)
9434      {
9435          static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF");
9436  
9437          return strtr($string, $convert_table);
9438      }
9439  
9440  	function change_encoding($data, $input, $output)
9441      {
9442          $input = SimplePie_Misc::encoding($input);
9443          $output = SimplePie_Misc::encoding($output);
9444  
9445          // We fail to fail on non US-ASCII bytes
9446          if ($input === 'US-ASCII')
9447          {
9448              static $non_ascii_octects = '';
9449              if (!$non_ascii_octects)
9450              {
9451                  for ($i = 0x80; $i <= 0xFF; $i++)
9452                  {
9453                      $non_ascii_octects .= chr($i);
9454                  }
9455              }
9456              $data = substr($data, 0, strcspn($data, $non_ascii_octects));
9457          }
9458  
9459          // This is first, as behaviour of this is completely predictable
9460          if ($input === 'windows-1252' && $output === 'UTF-8')
9461          {
9462              return SimplePie_Misc::windows_1252_to_utf8($data);
9463          }
9464          // This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported).
9465          elseif (function_exists('mb_convert_encoding') && @mb_convert_encoding("\x80", 'UTF-16BE', $input) !== "\x00\x80" && in_array($input, mb_list_encodings()) && ($return = @mb_convert_encoding($data, $output, $input)))
9466          {
9467              return $return;
9468          }
9469          // This is last, as behaviour of this varies with OS userland and PHP version
9470          elseif (function_exists('iconv') && ($return = @iconv($input, $output, $data)))
9471          {
9472              return $return;
9473          }
9474          // If we can't do anything, just fail
9475          else
9476          {
9477              return false;
9478          }
9479      }
9480  
9481      /**
9482       * Normalize an encoding name
9483       *
9484       * This is automatically generated by create.php
9485       *
9486       * To generate it, run `php create.php` on the command line, and copy the
9487       * output to replace this function.
9488       *
9489       * @param string $charset Character set to standardise
9490       * @return string Standardised name
9491       */
9492  	function encoding($charset)
9493      {
9494          // Normalization from UTS #22
9495          switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset)))
9496          {
9497              case 'adobestandardencoding':
9498              case 'csadobestandardencoding':
9499                  return 'Adobe-Standard-Encoding';
9500  
9501              case 'adobesymbolencoding':
9502              case 'cshppsmath':
9503                  return 'Adobe-Symbol-Encoding';
9504  
9505              case 'ami1251':
9506              case 'amiga1251':
9507                  return 'Amiga-1251';
9508  
9509              case 'ansix31101983':
9510              case 'csat5001983':
9511              case 'csiso99naplps':
9512              case 'isoir99':
9513              case 'naplps':
9514                  return 'ANSI_X3.110-1983';
9515  
9516              case 'arabic7':
9517              case 'asmo449':
9518              case 'csiso89asmo449':
9519              case 'iso9036':
9520              case 'isoir89':
9521                  return 'ASMO_449';
9522  
9523              case 'big5':
9524              case 'csbig5':
9525                  return 'Big5';
9526  
9527              case 'big5hkscs':
9528                  return 'Big5-HKSCS';
9529  
9530              case 'bocu1':
9531              case 'csbocu1':
9532                  return 'BOCU-1';
9533  
9534              case 'brf':
9535              case 'csbrf':
9536                  return 'BRF';
9537  
9538              case 'bs4730':
9539              case 'csiso4unitedkingdom':
9540              case 'gb':
9541              case 'iso646gb':
9542              case 'isoir4':
9543              case 'uk':
9544                  return 'BS_4730';
9545  
9546              case 'bsviewdata':
9547              case 'csiso47bsviewdata':
9548              case 'isoir47':
9549                  return 'BS_viewdata';
9550  
9551              case 'cesu8':
9552              case 'cscesu8':
9553                  return 'CESU-8';
9554  
9555              case 'ca':
9556              case 'csa71':
9557              case 'csaz243419851':
9558              case 'csiso121canadian1':
9559              case 'iso646ca':
9560              case 'isoir121':
9561                  return 'CSA_Z243.4-1985-1';
9562  
9563              case 'csa72':
9564              case 'csaz243419852':
9565              case 'csiso122canadian2':
9566              case 'iso646ca2':
9567              case 'isoir122':
9568                  return 'CSA_Z243.4-1985-2';
9569  
9570              case 'csaz24341985gr':
9571              case 'csiso123csaz24341985gr':
9572              case 'isoir123':
9573                  return 'CSA_Z243.4-1985-gr';
9574  
9575              case 'csiso139csn369103':
9576              case 'csn369103':
9577              case 'isoir139':
9578                  return 'CSN_369103';
9579  
9580              case 'csdecmcs':
9581              case 'dec':
9582              case 'decmcs':
9583                  return 'DEC-MCS';
9584  
9585              case 'csiso21german':
9586              case 'de':
9587              case 'din66003':
9588              case 'iso646de':
9589              case 'isoir21':
9590                  return 'DIN_66003';
9591  
9592              case 'csdkus':
9593              case 'dkus':
9594                  return 'dk-us';
9595  
9596              case 'csiso646danish':
9597              case 'dk':
9598              case 'ds2089':
9599              case 'iso646dk':
9600                  return 'DS_2089';
9601  
9602              case 'csibmebcdicatde':
9603              case 'ebcdicatde':
9604                  return 'EBCDIC-AT-DE';
9605  
9606              case 'csebcdicatdea':
9607              case 'ebcdicatdea':
9608                  return 'EBCDIC-AT-DE-A';
9609  
9610              case 'csebcdiccafr':
9611              case 'ebcdiccafr':
9612                  return 'EBCDIC-CA-FR';
9613  
9614              case 'csebcdicdkno':
9615              case 'ebcdicdkno':
9616                  return 'EBCDIC-DK-NO';
9617  
9618              case 'csebcdicdknoa':
9619              case 'ebcdicdknoa':
9620                  return 'EBCDIC-DK-NO-A';
9621  
9622              case 'csebcdices':
9623              case 'ebcdices':
9624                  return 'EBCDIC-ES';
9625  
9626              case 'csebcdicesa':
9627              case 'ebcdicesa':
9628                  return 'EBCDIC-ES-A';
9629  
9630              case 'csebcdicess':
9631              case 'ebcdicess':
9632                  return 'EBCDIC-ES-S';
9633  
9634              case 'csebcdicfise':
9635              case 'ebcdicfise':
9636                  return 'EBCDIC-FI-SE';
9637  
9638              case 'csebcdicfisea':
9639              case 'ebcdicfisea':
9640                  return 'EBCDIC-FI-SE-A';
9641  
9642              case 'csebcdicfr':
9643              case 'ebcdicfr':
9644                  return 'EBCDIC-FR';
9645  
9646              case 'csebcdicit':
9647              case 'ebcdicit':
9648                  return 'EBCDIC-IT';
9649  
9650              case 'csebcdicpt':
9651              case 'ebcdicpt':
9652                  return 'EBCDIC-PT';
9653  
9654              case 'csebcdicuk':
9655              case 'ebcdicuk':
9656                  return 'EBCDIC-UK';
9657  
9658              case 'csebcdicus':
9659              case 'ebcdicus':
9660                  return 'EBCDIC-US';
9661  
9662              case 'csiso111ecmacyrillic':
9663              case 'ecmacyrillic':
9664              case 'isoir111':
9665              case 'koi8e':
9666                  return 'ECMA-cyrillic';
9667  
9668              case 'csiso17spanish':
9669              case 'es':
9670              case 'iso646es':
9671              case 'isoir17':
9672                  return 'ES';
9673  
9674              case 'csiso85spanish2':
9675              case 'es2':
9676              case 'iso646es2':
9677              case 'isoir85':
9678                  return 'ES2';
9679  
9680              case 'cseucpkdfmtjapanese':
9681              case 'eucjp':
9682              case 'extendedunixcodepackedformatforjapanese':
9683                  return 'EUC-JP';
9684  
9685              case 'cseucfixwidjapanese':
9686              case 'extendedunixcodefixedwidthforjapanese':
9687                  return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
9688  
9689              case 'gb18030':
9690                  return 'GB18030';
9691  
9692              case 'chinese':
9693              case 'cp936':
9694              case 'csgb2312':
9695              case 'csiso58gb231280':
9696              case 'gb2312':
9697              case 'gb231280':
9698              case 'gbk':
9699              case 'isoir58':
9700              case 'ms936':
9701              case 'windows936':
9702                  return 'GBK';
9703  
9704              case 'cn':
9705              case 'csiso57gb1988':
9706              case 'gb198880':
9707              case 'iso646cn':
9708              case 'isoir57':
9709                  return 'GB_1988-80';
9710  
9711              case 'csiso153gost1976874':
9712              case 'gost1976874':
9713              case 'isoir153':
9714              case 'stsev35888':
9715                  return 'GOST_19768-74';
9716  
9717              case 'csiso150':
9718              case 'csiso150greekccitt':
9719              case 'greekccitt':
9720              case 'isoir150':
9721                  return 'greek-ccitt';
9722  
9723              case 'csiso88greek7':
9724              case 'greek7':
9725              case 'isoir88':
9726                  return 'greek7';
9727  
9728              case 'csiso18greek7old':
9729              case 'greek7old':
9730              case 'isoir18':
9731                  return 'greek7-old';
9732  
9733              case 'cshpdesktop':
9734              case 'hpdesktop':
9735                  return 'HP-DeskTop';
9736  
9737              case 'cshplegal':
9738              case 'hplegal':
9739                  return 'HP-Legal';
9740  
9741              case 'cshpmath8':
9742              case 'hpmath8':
9743                  return 'HP-Math8';
9744  
9745              case 'cshppifont':
9746              case 'hppifont':
9747                  return 'HP-Pi-font';
9748  
9749              case 'cshproman8':
9750              case 'hproman8':
9751              case 'r8':
9752              case 'roman8':
9753                  return 'hp-roman8';
9754  
9755              case 'hzgb2312':
9756                  return 'HZ-GB-2312';
9757  
9758              case 'csibmsymbols':
9759              case 'ibmsymbols':
9760                  return 'IBM-Symbols';
9761  
9762              case 'csibmthai':
9763              case 'ibmthai':
9764                  return 'IBM-Thai';
9765  
9766              case 'cp37':
9767              case 'csibm37':
9768              case 'ebcdiccpca':
9769              case 'ebcdiccpnl':
9770              case 'ebcdiccpus':
9771              case 'ebcdiccpwt':
9772              case 'ibm37':
9773                  return 'IBM037';
9774  
9775              case 'cp38':
9776              case 'csibm38':
9777              case 'ebcdicint':
9778              case 'ibm38':
9779                  return 'IBM038';
9780  
9781              case 'cp273':
9782              case 'csibm273':
9783              case 'ibm273':
9784                  return 'IBM273';
9785  
9786              case 'cp274':
9787              case 'csibm274':
9788              case 'ebcdicbe':
9789              case 'ibm274':
9790                  return 'IBM274';
9791  
9792              case 'cp275':
9793              case 'csibm275':
9794              case 'ebcdicbr':
9795              case 'ibm275':
9796                  return 'IBM275';
9797  
9798              case 'csibm277':
9799              case 'ebcdiccpdk':
9800              case 'ebcdiccpno':
9801              case 'ibm277':
9802                  return 'IBM277';
9803  
9804              case 'cp278':
9805              case 'csibm278':
9806              case 'ebcdiccpfi':
9807              case 'ebcdiccpse':
9808              case 'ibm278':
9809                  return 'IBM278';
9810  
9811              case 'cp280':
9812              case 'csibm280':
9813              case 'ebcdiccpit':
9814              case 'ibm280':
9815                  return 'IBM280';
9816  
9817              case 'cp281':
9818              case 'csibm281':
9819              case 'ebcdicjpe':
9820              case 'ibm281':
9821                  return 'IBM281';
9822  
9823              case 'cp284':
9824              case 'csibm284':
9825              case 'ebcdiccpes':
9826              case 'ibm284':
9827                  return 'IBM284';
9828  
9829              case 'cp285':
9830              case 'csibm285':
9831              case 'ebcdiccpgb':
9832              case 'ibm285':
9833                  return 'IBM285';
9834  
9835              case 'cp290':
9836              case 'csibm290':
9837              case 'ebcdicjpkana':
9838              case 'ibm290':
9839                  return 'IBM290';
9840  
9841              case 'cp297':
9842              case 'csibm297':
9843              case 'ebcdiccpfr':
9844              case 'ibm297':
9845                  return 'IBM297';
9846  
9847              case 'cp420':
9848              case 'csibm420':
9849              case 'ebcdiccpar1':
9850              case 'ibm420':
9851                  return 'IBM420';
9852  
9853              case 'cp423':
9854              case 'csibm423':
9855              case 'ebcdiccpgr':
9856              case 'ibm423':
9857                  return 'IBM423';
9858  
9859              case 'cp424':
9860              case 'csibm424':
9861              case 'ebcdiccphe':
9862              case 'ibm424':
9863                  return 'IBM424';
9864  
9865              case '437':
9866              case 'cp437':
9867              case 'cspc8codepage437':
9868              case 'ibm437':
9869                  return 'IBM437';
9870  
9871              case 'cp500':
9872              case 'csibm500':
9873              case 'ebcdiccpbe':
9874              case 'ebcdiccpch':
9875              case 'ibm500':
9876                  return 'IBM500';
9877  
9878              case 'cp775':
9879              case 'cspc775baltic':
9880              case 'ibm775':
9881                  return 'IBM775';
9882  
9883              case '850':
9884              case 'cp850':
9885              case 'cspc850multilingual':
9886              case 'ibm850':
9887                  return 'IBM850';
9888  
9889              case '851':
9890              case 'cp851':
9891              case 'csibm851':
9892              case 'ibm851':
9893                  return 'IBM851';
9894  
9895              case '852':
9896              case 'cp852':
9897              case 'cspcp852':
9898              case 'ibm852':
9899                  return 'IBM852';
9900  
9901              case '855':
9902              case 'cp855':
9903              case 'csibm855':
9904              case 'ibm855':
9905                  return 'IBM855';
9906  
9907              case '857':
9908              case 'cp857':
9909              case 'csibm857':
9910              case 'ibm857':
9911                  return 'IBM857';
9912  
9913              case 'ccsid858':
9914              case 'cp858':
9915              case 'ibm858':
9916              case 'pcmultilingual850euro':
9917                  return 'IBM00858';
9918  
9919              case '860':
9920              case 'cp860':
9921              case 'csibm860':
9922              case 'ibm860':
9923                  return 'IBM860';
9924  
9925              case '861':
9926              case 'cp861':
9927              case 'cpis':
9928              case 'csibm861':
9929              case 'ibm861':
9930                  return 'IBM861';
9931  
9932              case '862':
9933              case 'cp862':
9934              case 'cspc862latinhebrew':
9935              case 'ibm862':
9936                  return 'IBM862';
9937  
9938              case '863':
9939              case 'cp863':
9940              case 'csibm863':
9941              case 'ibm863':
9942                  return 'IBM863';
9943  
9944              case 'cp864':
9945              case 'csibm864':
9946              case 'ibm864':
9947                  return 'IBM864';
9948  
9949              case '865':
9950              case 'cp865':
9951              case 'csibm865':
9952              case 'ibm865':
9953                  return 'IBM865';
9954  
9955              case '866':
9956              case 'cp866':
9957              case 'csibm866':
9958              case 'ibm866':
9959                  return 'IBM866';
9960  
9961              case 'cp868':
9962              case 'cpar':
9963              case 'csibm868':
9964              case 'ibm868':
9965                  return 'IBM868';
9966  
9967              case '869':
9968              case 'cp869':
9969              case 'cpgr':
9970              case 'csibm869':
9971              case 'ibm869':
9972                  return 'IBM869';
9973  
9974              case 'cp870':
9975              case 'csibm870':
9976              case 'ebcdiccproece':
9977              case 'ebcdiccpyu':
9978              case 'ibm870':
9979                  return 'IBM870';
9980  
9981              case 'cp871':
9982              case 'csibm871':
9983              case 'ebcdiccpis':
9984              case 'ibm871':
9985                  return 'IBM871';
9986  
9987              case 'cp880':
9988              case 'csibm880':
9989              case 'ebcdiccyrillic':
9990              case 'ibm880':
9991                  return 'IBM880';
9992  
9993              case 'cp891':
9994              case 'csibm891':
9995              case 'ibm891':
9996                  return 'IBM891';
9997  
9998              case 'cp903':
9999              case 'csibm903':
10000              case 'ibm903':
10001                  return 'IBM903';
10002  
10003              case '904':
10004              case 'cp904':
10005              case 'csibbm904':
10006              case 'ibm904':
10007                  return 'IBM904';
10008  
10009              case 'cp905':
10010              case 'csibm905':
10011              case 'ebcdiccptr':
10012              case 'ibm905':
10013                  return 'IBM905';
10014  
10015              case 'cp918':
10016              case 'csibm918':
10017              case 'ebcdiccpar2':
10018              case 'ibm918':
10019                  return 'IBM918';
10020  
10021              case 'ccsid924':
10022              case 'cp924':
10023              case 'ebcdiclatin9euro':
10024              case 'ibm924':
10025                  return 'IBM00924';
10026  
10027              case 'cp1026':
10028              case 'csibm1026':
10029              case 'ibm1026':
10030                  return 'IBM1026';
10031  
10032              case 'ibm1047':
10033                  return 'IBM1047';
10034  
10035              case 'ccsid1140':
10036              case 'cp1140':
10037              case 'ebcdicus37euro':
10038              case 'ibm1140':
10039                  return 'IBM01140';
10040  
10041              case 'ccsid1141':
10042              case 'cp1141':
10043              case 'ebcdicde273euro':
10044              case 'ibm1141':
10045                  return 'IBM01141';
10046  
10047              case 'ccsid1142':
10048              case 'cp1142':
10049              case 'ebcdicdk277euro':
10050              case 'ebcdicno277euro':
10051              case 'ibm1142':
10052                  return 'IBM01142';
10053  
10054              case 'ccsid1143':
10055              case 'cp1143':
10056              case 'ebcdicfi278euro':
10057              case 'ebcdicse278euro':
10058              case 'ibm1143':
10059                  return 'IBM01143';
10060  
10061              case 'ccsid1144':
10062              case 'cp1144':
10063              case 'ebcdicit280euro':
10064              case 'ibm1144':
10065                  return 'IBM01144';
10066  
10067              case 'ccsid1145':
10068              case 'cp1145':
10069              case 'ebcdices284euro':
10070              case 'ibm1145':
10071                  return 'IBM01145';
10072  
10073              case 'ccsid1146':
10074              case 'cp1146':
10075              case 'ebcdicgb285euro':
10076              case 'ibm1146':
10077                  return 'IBM01146';
10078  
10079              case 'ccsid1147':
10080              case 'cp1147':
10081              case 'ebcdicfr297euro':
10082              case 'ibm1147':
10083                  return 'IBM01147';
10084  
10085              case 'ccsid1148':
10086              case 'cp1148':
10087              case 'ebcdicinternational500euro':
10088              case 'ibm1148':
10089                  return 'IBM01148';
10090  
10091              case 'ccsid1149':
10092              case 'cp1149':
10093              case 'ebcdicis871euro':
10094              case 'ibm1149':
10095                  return 'IBM01149';
10096  
10097              case 'csiso143iecp271':
10098              case 'iecp271':
10099              case 'isoir143':
10100                  return 'IEC_P27-1';
10101  
10102              case 'csiso49inis':
10103              case 'inis':
10104              case 'isoir49':
10105                  return 'INIS';
10106  
10107              case 'csiso50inis8':
10108              case 'inis8':
10109              case 'isoir50':
10110                  return 'INIS-8';
10111  
10112              case 'csiso51iniscyrillic':
10113              case 'iniscyrillic':
10114              case 'isoir51':
10115                  return 'INIS-cyrillic';
10116  
10117              case 'csinvariant':
10118              case 'invariant':
10119                  return 'INVARIANT';
10120  
10121              case 'iso2022cn':
10122                  return 'ISO-2022-CN';
10123  
10124              case 'iso2022cnext':
10125                  return 'ISO-2022-CN-EXT';
10126  
10127              case 'csiso2022jp':
10128              case 'iso2022jp':
10129                  return 'ISO-2022-JP';
10130  
10131              case 'csiso2022jp2':
10132              case 'iso2022jp2':
10133                  return 'ISO-2022-JP-2';
10134  
10135              case 'csiso2022kr':
10136              case 'iso2022kr':
10137                  return 'ISO-2022-KR';
10138  
10139              case 'cswindows30latin1':
10140              case 'iso88591windows30latin1':
10141                  return 'ISO-8859-1-Windows-3.0-Latin-1';
10142  
10143              case 'cswindows31latin1':
10144              case 'iso88591windows31latin1':
10145                  return 'ISO-8859-1-Windows-3.1-Latin-1';
10146  
10147              case 'csisolatin2':
10148              case 'iso88592':
10149              case 'iso885921987':
10150              case 'isoir101':
10151              case 'l2':
10152              case 'latin2':
10153                  return 'ISO-8859-2';
10154  
10155              case 'cswindows31latin2':
10156              case 'iso88592windowslatin2':
10157                  return 'ISO-8859-2-Windows-Latin-2';
10158  
10159              case 'csisolatin3':
10160              case 'iso88593':
10161              case 'iso885931988':
10162              case 'isoir109':
10163              case 'l3':
10164              case 'latin3':
10165                  return 'ISO-8859-3';
10166  
10167              case 'csisolatin4':
10168              case 'iso88594':
10169              case 'iso885941988':
10170              case 'isoir110':
10171              case 'l4':
10172              case 'latin4':
10173                  return 'ISO-8859-4';
10174  
10175              case 'csisolatincyrillic':
10176              case 'cyrillic':
10177              case 'iso88595':
10178              case 'iso885951988':
10179              case 'isoir144':
10180                  return 'ISO-8859-5';
10181  
10182              case 'arabic':
10183              case 'asmo708':
10184              case 'csisolatinarabic':
10185              case 'ecma114':
10186              case 'iso88596':
10187              case 'iso885961987':
10188              case 'isoir127':
10189                  return 'ISO-8859-6';
10190  
10191              case 'csiso88596e':
10192              case 'iso88596e':
10193                  return 'ISO-8859-6-E';
10194  
10195              case 'csiso88596i':
10196              case 'iso88596i':
10197                  return 'ISO-8859-6-I';
10198  
10199              case 'csisolatingreek':
10200              case 'ecma118':
10201              case 'elot928':
10202              case 'greek':
10203              case 'greek8':
10204              case 'iso88597':
10205              case 'iso885971987':
10206              case 'isoir126':
10207                  return 'ISO-8859-7';
10208  
10209              case 'csisolatinhebrew':
10210              case 'hebrew':
10211              case 'iso88598':
10212              case 'iso885981988':
10213              case 'isoir138':
10214                  return 'ISO-8859-8';
10215  
10216              case 'csiso88598e':
10217              case 'iso88598e':
10218                  return 'ISO-8859-8-E';
10219  
10220              case 'csiso88598i':
10221              case 'iso88598i':
10222                  return 'ISO-8859-8-I';
10223  
10224              case 'cswindows31latin5':
10225              case 'iso88599windowslatin5':
10226                  return 'ISO-8859-9-Windows-Latin-5';
10227  
10228              case 'csisolatin6':
10229              case 'iso885910':
10230              case 'iso8859101992':
10231              case 'isoir157':
10232              case 'l6':
10233              case 'latin6':
10234                  return 'ISO-8859-10';
10235  
10236              case 'iso885913':
10237                  return 'ISO-8859-13';
10238  
10239              case 'iso885914':
10240              case 'iso8859141998':
10241              case 'isoceltic':
10242              case 'isoir199':
10243              case 'l8':
10244              case 'latin8':
10245                  return 'ISO-8859-14';
10246  
10247              case 'iso885915':
10248              case 'latin9':
10249                  return 'ISO-8859-15';
10250  
10251              case 'iso885916':
10252              case 'iso8859162001':
10253              case 'isoir226':
10254              case 'l10':
10255              case 'latin10':
10256                  return 'ISO-8859-16';
10257  
10258              case 'iso10646j1':
10259                  return 'ISO-10646-J-1';
10260  
10261              case 'csunicode':
10262              case 'iso10646ucs2':
10263                  return 'ISO-10646-UCS-2';
10264  
10265              case 'csucs4':
10266              case 'iso10646ucs4':
10267                  return 'ISO-10646-UCS-4';
10268  
10269              case 'csunicodeascii':
10270              case 'iso10646ucsbasic':
10271                  return 'ISO-10646-UCS-Basic';
10272  
10273              case 'csunicodelatin1':
10274              case 'iso10646':
10275              case 'iso10646unicodelatin1':
10276                  return 'ISO-10646-Unicode-Latin1';
10277  
10278              case 'csiso10646utf1':
10279              case 'iso10646utf1':
10280                  return 'ISO-10646-UTF-1';
10281  
10282              case 'csiso115481':
10283              case 'iso115481':
10284              case 'isotr115481':
10285                  return 'ISO-11548-1';
10286  
10287              case 'csiso90':
10288              case 'isoir90':
10289                  return 'iso-ir-90';
10290  
10291              case 'csunicodeibm1261':
10292              case 'isounicodeibm1261':
10293                  return 'ISO-Unicode-IBM-1261';
10294  
10295              case 'csunicodeibm1264':
10296              case 'isounicodeibm1264':
10297                  return 'ISO-Unicode-IBM-1264';
10298  
10299              case 'csunicodeibm1265':
10300              case 'isounicodeibm1265':
10301                  return 'ISO-Unicode-IBM-1265';
10302  
10303              case 'csunicodeibm1268':
10304              case 'isounicodeibm1268':
10305                  return 'ISO-Unicode-IBM-1268';
10306  
10307              case 'csunicodeibm1276':
10308              case 'isounicodeibm1276':
10309                  return 'ISO-Unicode-IBM-1276';
10310  
10311              case 'csiso646basic1983':
10312              case 'iso646basic1983':
10313              case 'ref':
10314                  return 'ISO_646.basic:1983';
10315  
10316              case 'csiso2intlrefversion':
10317              case 'irv':
10318              case 'iso646irv1983':
10319              case 'isoir2':
10320                  return 'ISO_646.irv:1983';
10321  
10322              case 'csiso2033':
10323              case 'e13b':
10324              case 'iso20331983':
10325              case 'isoir98':
10326                  return 'ISO_2033-1983';
10327  
10328              case 'csiso5427cyrillic':
10329              case 'iso5427':
10330              case 'isoir37':
10331                  return 'ISO_5427';
10332  
10333              case 'iso5427cyrillic1981':
10334              case 'iso54271981':
10335              case 'isoir54':
10336                  return 'ISO_5427:1981';
10337  
10338              case 'csiso5428greek':
10339              case 'iso54281980':
10340              case 'isoir55':
10341                  return 'ISO_5428:1980';
10342  
10343              case 'csiso6937add':
10344              case 'iso6937225':
10345              case 'isoir152':
10346                  return 'ISO_6937-2-25';
10347  
10348              case 'csisotextcomm':
10349              case 'iso69372add':
10350              case 'isoir142':
10351                  return 'ISO_6937-2-add';
10352  
10353              case 'csiso8859supp':
10354              case 'iso8859supp':
10355              case 'isoir154':
10356              case 'latin125':
10357                  return 'ISO_8859-supp';
10358  
10359              case 'csiso10367box':
10360              case 'iso10367box':
10361              case 'isoir155':
10362                  return 'ISO_10367-box';
10363  
10364              case 'csiso15italian':
10365              case 'iso646it':
10366              case 'isoir15':
10367              case 'it':
10368                  return 'IT';
10369  
10370              case 'csiso13jisc6220jp':
10371              case 'isoir13':
10372              case 'jisc62201969':
10373              case 'jisc62201969jp':
10374              case 'katakana':
10375              case 'x2017':
10376                  return 'JIS_C6220-1969-jp';
10377  
10378              case 'csiso14jisc6220ro':
10379              case 'iso646jp':
10380              case 'isoir14':
10381              case 'jisc62201969ro':
10382              case 'jp':
10383                  return 'JIS_C6220-1969-ro';
10384  
10385              case 'csiso42jisc62261978':
10386              case 'isoir42':
10387              case 'jisc62261978':
10388                  return 'JIS_C6226-1978';
10389  
10390              case 'csiso87jisx208':
10391              case 'isoir87':
10392              case 'jisc62261983':
10393              case 'jisx2081983':
10394              case 'x208':
10395                  return 'JIS_C6226-1983';
10396  
10397              case 'csiso91jisc62291984a':
10398              case 'isoir91':
10399              case 'jisc62291984a':
10400              case 'jpocra':
10401                  return 'JIS_C6229-1984-a';
10402  
10403              case 'csiso92jisc62991984b':
10404              case 'iso646jpocrb':
10405              case 'isoir92':
10406              case 'jisc62291984b':
10407              case 'jpocrb':
10408                  return 'JIS_C6229-1984-b';
10409  
10410              case 'csiso93jis62291984badd':
10411              case 'isoir93':
10412              case 'jisc62291984badd':
10413              case 'jpocrbadd':
10414                  return 'JIS_C6229-1984-b-add';
10415  
10416              case 'csiso94jis62291984hand':
10417              case 'isoir94':
10418              case 'jisc62291984hand':
10419              case 'jpocrhand':
10420                  return 'JIS_C6229-1984-hand';
10421  
10422              case 'csiso95jis62291984handadd':
10423              case 'isoir95':
10424              case 'jisc62291984handadd':
10425              case 'jpocrhandadd':
10426                  return 'JIS_C6229-1984-hand-add';
10427  
10428              case 'csiso96jisc62291984kana':
10429              case 'isoir96':
10430              case 'jisc62291984kana':
10431                  return 'JIS_C6229-1984-kana';
10432  
10433              case 'csjisencoding':
10434              case 'jisencoding':
10435                  return 'JIS_Encoding';
10436  
10437              case 'cshalfwidthkatakana':
10438              case 'jisx201':
10439              case 'x201':
10440                  return 'JIS_X0201';
10441  
10442              case 'csiso159jisx2121990':
10443              case 'isoir159':
10444              case 'jisx2121990':
10445              case 'x212':
10446                  return 'JIS_X0212-1990';
10447  
10448              case 'csiso141jusib1002':
10449              case 'iso646yu':
10450              case 'isoir141':
10451              case 'js':
10452              case 'jusib1002':
10453              case 'yu':
10454                  return 'JUS_I.B1.002';
10455  
10456              case 'csiso147macedonian':
10457              case 'isoir147':
10458              case 'jusib1003mac':
10459              case 'macedonian':
10460                  return 'JUS_I.B1.003-mac';
10461  
10462              case 'csiso146serbian':
10463              case 'isoir146':
10464              case 'jusib1003serb':
10465              case 'serbian':
10466                  return 'JUS_I.B1.003-serb';
10467  
10468              case 'koi7switched':
10469                  return 'KOI7-switched';
10470  
10471              case 'cskoi8r':
10472              case 'koi8r':
10473                  return 'KOI8-R';
10474  
10475              case 'koi8u':
10476                  return 'KOI8-U';
10477  
10478              case 'csksc5636':
10479              case 'iso646kr':
10480              case 'ksc5636':
10481                  return 'KSC5636';
10482  
10483              case 'cskz1048':
10484              case 'kz1048':
10485              case 'rk1048':
10486              case 'strk10482002':
10487                  return 'KZ-1048';
10488  
10489              case 'csiso19latingreek':
10490              case 'isoir19':
10491              case 'latingreek':
10492                  return 'latin-greek';
10493  
10494              case 'csiso27latingreek1':
10495              case 'isoir27':
10496              case 'latingreek1':
10497                  return 'Latin-greek-1';
10498  
10499              case 'csiso158lap':
10500              case 'isoir158':
10501              case 'lap':
10502              case 'latinlap':
10503                  return 'latin-lap';
10504  
10505              case 'csmacintosh':
10506              case 'mac':
10507              case 'macintosh':
10508                  return 'macintosh';
10509  
10510              case 'csmicrosoftpublishing':
10511              case 'microsoftpublishing':
10512                  return 'Microsoft-Publishing';
10513  
10514              case 'csmnem':
10515              case 'mnem':
10516                  return 'MNEM';
10517  
10518              case 'csmnemonic':
10519              case 'mnemonic':
10520                  return 'MNEMONIC';
10521  
10522              case 'csiso86hungarian':
10523              case 'hu':
10524              case 'iso646hu':
10525              case 'isoir86':
10526              case 'msz77953':
10527                  return 'MSZ_7795.3';
10528  
10529              case 'csnatsdano':
10530              case 'isoir91':
10531              case 'natsdano':
10532                  return 'NATS-DANO';
10533  
10534              case 'csnatsdanoadd':
10535              case 'isoir92':
10536              case 'natsdanoadd':
10537                  return 'NATS-DANO-ADD';
10538  
10539              case 'csnatssefi':
10540              case 'isoir81':
10541              case 'natssefi':
10542                  return 'NATS-SEFI';
10543  
10544              case 'csnatssefiadd':
10545              case 'isoir82':
10546              case 'natssefiadd':
10547                  return 'NATS-SEFI-ADD';
10548  
10549              case 'csiso151cuba':
10550              case 'cuba':
10551              case 'iso646cu':
10552              case 'isoir151':
10553              case 'ncnc1081':
10554                  return 'NC_NC00-10:81';
10555  
10556              case 'csiso69french':
10557              case 'fr':
10558              case 'iso646fr':
10559              case 'isoir69':
10560              case 'nfz62010':
10561                  return 'NF_Z_62-010';
10562  
10563              case 'csiso25french':
10564              case 'iso646fr1':
10565              case 'isoir25':
10566              case 'nfz620101973':
10567                  return 'NF_Z_62-010_(1973)';
10568  
10569              case 'csiso60danishnorwegian':
10570              case 'csiso60norwegian1':
10571              case 'iso646no':
10572              case 'isoir60':
10573              case 'no':
10574              case 'ns45511':
10575                  return 'NS_4551-1';
10576  
10577              case 'csiso61norwegian2':
10578              case 'iso646no2':
10579              case 'isoir61':
10580              case 'no2':
10581              case 'ns45512':
10582                  return 'NS_4551-2';
10583  
10584              case 'osdebcdicdf3irv':
10585                  return 'OSD_EBCDIC_DF03_IRV';
10586  
10587              case 'osdebcdicdf41':
10588                  return 'OSD_EBCDIC_DF04_1';
10589  
10590              case 'osdebcdicdf415':
10591                  return 'OSD_EBCDIC_DF04_15';
10592  
10593              case 'cspc8danishnorwegian':
10594              case 'pc8danishnorwegian':
10595                  return 'PC8-Danish-Norwegian';
10596  
10597              case 'cspc8turkish':
10598              case 'pc8turkish':
10599                  return 'PC8-Turkish';
10600  
10601              case 'csiso16portuguese':
10602              case 'iso646pt':
10603              case 'isoir16':
10604              case 'pt':
10605                  return 'PT';
10606  
10607              case 'csiso84portuguese2':
10608              case 'iso646pt2':
10609              case 'isoir84':
10610              case 'pt2':
10611                  return 'PT2';
10612  
10613              case 'cp154':
10614              case 'csptcp154':
10615              case 'cyrillicasian':
10616              case 'pt154':
10617              case 'ptcp154':
10618                  return 'PTCP154';
10619  
10620              case 'scsu':
10621                  return 'SCSU';
10622  
10623              case 'csiso10swedish':
10624              case 'fi':
10625              case 'iso646fi':
10626              case 'iso646se':
10627              case 'isoir10':
10628              case 'se':
10629              case 'sen850200b':
10630                  return 'SEN_850200_B';
10631  
10632              case 'csiso11swedishfornames':
10633              case 'iso646se2':
10634              case 'isoir11':
10635              case 'se2':
10636              case 'sen850200c':
10637                  return 'SEN_850200_C';
10638  
10639              case 'csiso102t617bit':
10640              case 'isoir102':
10641              case 't617bit':
10642                  return 'T.61-7bit';
10643  
10644              case 'csiso103t618bit':
10645              case 'isoir103':
10646              case 't61':
10647              case 't618bit':
10648                  return 'T.61-8bit';
10649  
10650              case 'csiso128t101g2':
10651              case 'isoir128':
10652              case 't101g2':
10653                  return 'T.101-G2';
10654  
10655              case 'cstscii':
10656              case 'tscii':
10657                  return 'TSCII';
10658  
10659              case 'csunicode11':
10660              case 'unicode11':
10661                  return 'UNICODE-1-1';
10662  
10663              case 'csunicode11utf7':
10664              case 'unicode11utf7':
10665                  return 'UNICODE-1-1-UTF-7';
10666  
10667              case 'csunknown8bit':
10668              case 'unknown8bit':
10669                  return 'UNKNOWN-8BIT';
10670  
10671              case 'ansix341968':
10672              case 'ansix341986':
10673              case 'ascii':
10674              case 'cp367':
10675              case 'csascii':
10676              case 'ibm367':
10677              case 'iso646irv1991':
10678              case 'iso646us':
10679              case 'isoir6':
10680              case 'us':
10681              case 'usascii':
10682                  return 'US-ASCII';
10683  
10684              case 'csusdk':
10685              case 'usdk':
10686                  return 'us-dk';
10687  
10688              case 'utf7':
10689                  return 'UTF-7';
10690  
10691              case 'utf8':
10692                  return 'UTF-8';
10693  
10694              case 'utf16':
10695                  return 'UTF-16';
10696  
10697              case 'utf16be':
10698                  return 'UTF-16BE';
10699  
10700              case 'utf16le':
10701                  return 'UTF-16LE';
10702  
10703              case 'utf32':
10704                  return 'UTF-32';
10705  
10706              case 'utf32be':
10707                  return 'UTF-32BE';
10708  
10709              case 'utf32le':
10710                  return 'UTF-32LE';
10711  
10712              case 'csventurainternational':
10713              case 'venturainternational':
10714                  return 'Ventura-International';
10715  
10716              case 'csventuramath':
10717              case 'venturamath':
10718                  return 'Ventura-Math';
10719  
10720              case 'csventuraus':
10721              case 'venturaus':
10722                  return 'Ventura-US';
10723  
10724              case 'csiso70videotexsupp1':
10725              case 'isoir70':
10726              case 'videotexsuppl':
10727                  return 'videotex-suppl';
10728  
10729              case 'csviqr':
10730              case 'viqr':
10731                  return 'VIQR';
10732  
10733              case 'csviscii':
10734              case 'viscii':
10735                  return 'VISCII';
10736  
10737              case 'csshiftjis':
10738              case 'cswindows31j':
10739              case 'mskanji':
10740              case 'shiftjis':
10741              case 'windows31j':
10742                  return 'Windows-31J';
10743  
10744              case 'iso885911':
10745              case 'tis620':
10746                  return 'windows-874';
10747  
10748              case 'cseuckr':
10749              case 'csksc56011987':
10750              case 'euckr':
10751              case 'isoir149':
10752              case 'korean':
10753              case 'ksc5601':
10754              case 'ksc56011987':
10755              case 'ksc56011989':
10756              case 'windows949':
10757                  return 'windows-949';
10758  
10759              case 'windows1250':
10760                  return 'windows-1250';
10761  
10762              case 'windows1251':
10763                  return 'windows-1251';
10764  
10765              case 'cp819':
10766              case 'csisolatin1':
10767              case 'ibm819':
10768              case 'iso88591':
10769              case 'iso885911987':
10770              case 'isoir100':
10771              case 'l1':
10772              case 'latin1':
10773              case 'windows1252':
10774                  return 'windows-1252';
10775  
10776              case 'windows1253':
10777                  return 'windows-1253';
10778  
10779              case 'csisolatin5':
10780              case 'iso88599':
10781              case 'iso885991989':
10782              case 'isoir148':
10783              case 'l5':
10784              case 'latin5':
10785              case 'windows1254':
10786                  return 'windows-1254';
10787  
10788              case 'windows1255':
10789                  return 'windows-1255';
10790  
10791              case 'windows1256':
10792                  return 'windows-1256';
10793  
10794              case 'windows1257':
10795                  return 'windows-1257';
10796  
10797              case 'windows1258':
10798                  return 'windows-1258';
10799  
10800              default:
10801                  return $charset;
10802          }
10803      }
10804  
10805  	function get_curl_version()
10806      {
10807          if (is_array($curl = curl_version()))
10808          {
10809              $curl = $curl['version'];
10810          }
10811          elseif (substr($curl, 0, 5) === 'curl/')
10812          {
10813              $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5));
10814          }
10815          elseif (substr($curl, 0, 8) === 'libcurl/')
10816          {
10817              $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8));
10818          }
10819          else
10820          {
10821              $curl = 0;
10822          }
10823          return $curl;
10824      }
10825  
10826  	function is_subclass_of($class1, $class2)
10827      {
10828          if (func_num_args() !== 2)
10829          {
10830              trigger_error('Wrong parameter count for SimplePie_Misc::is_subclass_of()', E_USER_WARNING);
10831          }
10832          elseif (version_compare(PHP_VERSION, '5.0.3', '>=') || is_object($class1))
10833          {
10834              return is_subclass_of($class1, $class2);
10835          }
10836          elseif (is_string($class1) && is_string($class2))
10837          {
10838              if (class_exists($class1))
10839              {
10840                  if (class_exists($class2))
10841                  {
10842                      $class2 = strtolower($class2);
10843                      while ($class1 = strtolower(get_parent_class($class1)))
10844                      {
10845                          if ($class1 === $class2)
10846                          {
10847                              return true;
10848                          }
10849                      }
10850                  }
10851              }
10852              else
10853              {
10854                  trigger_error('Unknown class passed as parameter', E_USER_WARNNG);
10855              }
10856          }
10857          return false;
10858      }
10859  
10860      /**
10861       * Strip HTML comments
10862       *
10863       * @access public
10864       * @param string $data Data to strip comments from
10865       * @return string Comment stripped string
10866       */
10867  	function strip_comments($data)
10868      {
10869          $output = '';
10870          while (($start = strpos($data, '<!--')) !== false)
10871          {
10872              $output .= substr($data, 0, $start);
10873              if (($end = strpos($data, '-->', $start)) !== false)
10874              {
10875                  $data = substr_replace($data, '', 0, $end + 3);
10876              }
10877              else
10878              {
10879                  $data = '';
10880              }
10881          }
10882          return $output . $data;
10883      }
10884  
10885  	function parse_date($dt)
10886      {
10887          $parser = SimplePie_Parse_Date::get();
10888          return $parser->parse($dt);
10889      }
10890  
10891      /**
10892       * Decode HTML entities
10893       *
10894       * @static
10895       * @access public
10896       * @param string $data Input data
10897       * @return string Output data
10898       */
10899  	function entities_decode($data)
10900      {
10901          $decoder =& new SimplePie_Decode_HTML_Entities($data);
10902          return $decoder->parse();
10903      }
10904  
10905      /**
10906       * Remove RFC822 comments
10907       *
10908       * @access public
10909       * @param string $data Data to strip comments from
10910       * @return string Comment stripped string
10911       */
10912  	function uncomment_rfc822($string)
10913      {
10914          $string = (string) $string;
10915          $position = 0;
10916          $length = strlen($string);
10917          $depth = 0;
10918  
10919          $output = '';
10920  
10921          while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
10922          {
10923              $output .= substr($string, $position, $pos - $position);
10924              $position = $pos + 1;
10925              if ($string[$pos - 1] !== '\\')
10926              {
10927                  $depth++;
10928                  while ($depth && $position < $length)
10929                  {
10930                      $position += strcspn($string, '()', $position);
10931                      if ($string[$position - 1] === '\\')
10932                      {
10933                          $position++;
10934                          continue;
10935                      }
10936                      elseif (isset($string[$position]))
10937                      {
10938                          switch ($string[$position])
10939                          {
10940                              case '(':
10941                                  $depth++;
10942                                  break;
10943  
10944                              case ')':
10945                                  $depth--;
10946                                  break;
10947                          }
10948                          $position++;
10949                      }
10950                      else
10951                      {
10952                          break;
10953                      }
10954                  }
10955              }
10956              else
10957              {
10958                  $output .= '(';
10959              }
10960          }
10961          $output .= substr($string, $position);
10962  
10963          return $output;
10964      }
10965  
10966  	function parse_mime($mime)
10967      {
10968          if (($pos = strpos($mime, ';')) === false)
10969          {
10970              return trim($mime);
10971          }
10972          else
10973          {
10974              return trim(substr($mime, 0, $pos));
10975          }
10976      }
10977  
10978  	function htmlspecialchars_decode($string, $quote_style)
10979      {
10980          if (function_exists('htmlspecialchars_decode'))
10981          {
10982              return htmlspecialchars_decode($string, $quote_style);
10983          }
10984          else
10985          {
10986              return strtr($string, array_flip(get_html_translation_table(HTML_SPECIALCHARS, $quote_style)));
10987          }
10988      }
10989  
10990  	function atom_03_construct_type($attribs)
10991      {
10992          if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64'))
10993          {
10994              $mode = SIMPLEPIE_CONSTRUCT_BASE64;
10995          }
10996          else
10997          {
10998              $mode = SIMPLEPIE_CONSTRUCT_NONE;
10999          }
11000          if (isset($attribs['']['type']))
11001          {
11002              switch (strtolower(trim($attribs['']['type'])))
11003              {
11004                  case 'text':
11005                  case 'text/plain':
11006                      return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
11007  
11008                  case 'html':
11009                  case 'text/html':
11010                      return SIMPLEPIE_CONSTRUCT_HTML | $mode;
11011  
11012                  case 'xhtml':
11013                  case 'application/xhtml+xml':
11014                      return SIMPLEPIE_CONSTRUCT_XHTML | $mode;
11015  
11016                  default:
11017                      return SIMPLEPIE_CONSTRUCT_NONE | $mode;
11018              }
11019          }
11020          else
11021          {
11022              return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
11023          }
11024      }
11025  
11026  	function atom_10_construct_type($attribs)
11027      {
11028          if (isset($attribs['']['type']))
11029          {
11030              switch (strtolower(trim($attribs['']['type'])))
11031              {
11032                  case 'text':
11033                      return SIMPLEPIE_CONSTRUCT_TEXT;
11034  
11035                  case 'html':
11036                      return SIMPLEPIE_CONSTRUCT_HTML;
11037  
11038                  case 'xhtml':
11039                      return SIMPLEPIE_CONSTRUCT_XHTML;
11040  
11041                  default:
11042                      return SIMPLEPIE_CONSTRUCT_NONE;
11043              }
11044          }
11045          return SIMPLEPIE_CONSTRUCT_TEXT;
11046      }
11047  
11048  	function atom_10_content_construct_type($attribs)
11049      {
11050          if (isset($attribs['']['type']))
11051          {
11052              $type = strtolower(trim($attribs['']['type']));
11053              switch ($type)
11054              {
11055                  case 'text':
11056                      return SIMPLEPIE_CONSTRUCT_TEXT;
11057  
11058                  case 'html':
11059                      return SIMPLEPIE_CONSTRUCT_HTML;
11060  
11061                  case 'xhtml':
11062                      return SIMPLEPIE_CONSTRUCT_XHTML;
11063              }
11064              if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/')
11065              {
11066                  return SIMPLEPIE_CONSTRUCT_NONE;
11067              }
11068              else
11069              {
11070                  return SIMPLEPIE_CONSTRUCT_BASE64;
11071              }
11072          }
11073          else
11074          {
11075              return SIMPLEPIE_CONSTRUCT_TEXT;
11076          }
11077      }
11078  
11079  	function is_isegment_nz_nc($string)
11080      {
11081          return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string);
11082      }
11083  
11084  	function space_seperated_tokens($string)
11085      {
11086          $space_characters = "\x20\x09\x0A\x0B\x0C\x0D";
11087          $string_length = strlen($string);
11088  
11089          $position = strspn($string, $space_characters);
11090          $tokens = array();
11091  
11092          while ($position < $string_length)
11093          {
11094              $len = strcspn($string, $space_characters, $position);
11095              $tokens[] = substr($string, $position, $len);
11096              $position += $len;
11097              $position += strspn($string, $space_characters, $position);
11098          }
11099  
11100          return $tokens;
11101      }
11102  
11103  	function array_unique($array)
11104      {
11105          if (version_compare(PHP_VERSION, '5.2', '>='))
11106          {
11107              return array_unique($array);
11108          }
11109          else
11110          {
11111              $array = (array) $array;
11112              $new_array = array();
11113              $new_array_strings = array();
11114              foreach ($array as $key => $value)
11115              {
11116                  if (is_object($value))
11117                  {
11118                      if (method_exists($value, '__toString'))
11119                      {
11120                          $cmp = $value->__toString();
11121                      }
11122                      else
11123                      {
11124                          trigger_error('Object of class ' . get_class($value) . ' could not be converted to string', E_USER_ERROR);
11125                      }
11126                  }
11127                  elseif (is_array($value))
11128                  {
11129                      $cmp = (string) reset($value);
11130                  }
11131                  else
11132                  {
11133                      $cmp = (string) $value;
11134                  }
11135                  if (!in_array($cmp, $new_array_strings))
11136                  {
11137                      $new_array[$key] = $value;
11138                      $new_array_strings[] = $cmp;
11139                  }
11140              }
11141              return $new_array;
11142          }
11143      }
11144  
11145      /**
11146       * Converts a unicode codepoint to a UTF-8 character
11147       *
11148       * @static
11149       * @access public
11150       * @param int $codepoint Unicode codepoint
11151       * @return string UTF-8 character
11152       */
11153  	function codepoint_to_utf8($codepoint)
11154      {
11155          $codepoint = (int) $codepoint;
11156          if ($codepoint < 0)
11157          {
11158              return false;
11159          }
11160          else if ($codepoint <= 0x7f)
11161          {
11162              return chr($codepoint);
11163          }
11164          else if ($codepoint <= 0x7ff)
11165          {
11166              return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f));
11167          }
11168          else if ($codepoint <= 0xffff)
11169          {
11170              return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
11171          }
11172          else if ($codepoint <= 0x10ffff)
11173          {
11174              return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
11175          }
11176          else
11177          {
11178              // U+FFFD REPLACEMENT CHARACTER
11179              return "\xEF\xBF\xBD";
11180          }
11181      }
11182  
11183      /**
11184       * Re-implementation of PHP 5's stripos()
11185       *
11186       * Returns the numeric position of the first occurrence of needle in the
11187       * haystack string.
11188       *
11189       * @static
11190       * @access string
11191       * @param object $haystack
11192       * @param string $needle Note that the needle may be a string of one or more
11193       *     characters. If needle is not a string, it is converted to an integer
11194       *     and applied as the ordinal value of a character.
11195       * @param int $offset The optional offset parameter allows you to specify which
11196       *     character in haystack to start searching. The position returned is still
11197       *     relative to the beginning of haystack.
11198       * @return bool If needle is not found, stripos() will return boolean false.
11199       */
11200  	function stripos($haystack, $needle, $offset = 0)
11201      {
11202          if (function_exists('stripos'))
11203          {
11204              return stripos($haystack, $needle, $offset);
11205          }
11206          else
11207          {
11208              if (is_string($needle))
11209              {
11210                  $needle = strtolower($needle);
11211              }
11212              elseif (is_int($needle) || is_bool($needle) || is_double($needle))
11213              {
11214                  $needle = strtolower(chr($needle));
11215              }
11216              else
11217              {
11218                  trigger_error('needle is not a string or an integer', E_USER_WARNING);
11219                  return false;
11220              }
11221  
11222              return strpos(strtolower($haystack), $needle, $offset);
11223          }
11224      }
11225  
11226      /**
11227       * Similar to parse_str()
11228       *
11229       * Returns an associative array of name/value pairs, where the value is an
11230       * array of values that have used the same name
11231       *
11232       * @static
11233       * @access string
11234       * @param string $str The input string.
11235       * @return array
11236       */
11237  	function parse_str($str)
11238      {
11239          $return = array();
11240          $str = explode('&', $str);
11241  
11242          foreach ($str as $section)
11243          {
11244              if (strpos($section, '=') !== false)
11245              {
11246                  list($name, $value) = explode('=', $section, 2);
11247                  $return[urldecode($name)][] = urldecode($value);
11248              }
11249              else
11250              {
11251                  $return[urldecode($section)][] = null;
11252              }
11253          }
11254  
11255          return $return;
11256      }
11257  
11258      /**
11259       * Detect XML encoding, as per XML 1.0 Appendix F.1
11260       *
11261       * @todo Add support for EBCDIC
11262       * @param string $data XML data
11263       * @return array Possible encodings
11264       */
11265  	function xml_encoding($data)
11266      {
11267          // UTF-32 Big Endian BOM
11268          if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
11269          {
11270              $encoding[] = 'UTF-32BE';
11271          }
11272          // UTF-32 Little Endian BOM
11273          elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
11274          {
11275              $encoding[] = 'UTF-32LE';
11276          }
11277          // UTF-16 Big Endian BOM
11278          elseif (substr($data, 0, 2) === "\xFE\xFF")
11279          {
11280              $encoding[] = 'UTF-16BE';
11281          }
11282          // UTF-16 Little Endian BOM
11283          elseif (substr($data, 0, 2) === "\xFF\xFE")
11284          {
11285              $encoding[] = 'UTF-16LE';
11286          }
11287          // UTF-8 BOM
11288          elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
11289          {
11290              $encoding[] = 'UTF-8';
11291          }
11292          // UTF-32 Big Endian Without BOM
11293          elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C")
11294          {
11295              if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E"))
11296              {
11297                  $parser =& new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8'));
11298                  if ($parser->parse())
11299                  {
11300                      $encoding[] = $parser->encoding;
11301                  }
11302              }
11303              $encoding[] = 'UTF-32BE';
11304          }
11305          // UTF-32 Little Endian Without BOM
11306          elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00")
11307          {
11308              if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00"))
11309              {
11310                  $parser =& new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8'));
11311                  if ($parser->parse())
11312                  {
11313                      $encoding[] = $parser->encoding;
11314                  }
11315              }
11316              $encoding[] = 'UTF-32LE';
11317          }
11318          // UTF-16 Big Endian Without BOM
11319          elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C")
11320          {
11321              if ($pos = strpos($data, "\x00\x3F\x00\x3E"))
11322              {
11323                  $parser =& new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8'));
11324                  if ($parser->parse())
11325                  {
11326                      $encoding[] = $parser->encoding;
11327                  }
11328              }
11329              $encoding[] = 'UTF-16BE';
11330          }
11331          // UTF-16 Little Endian Without BOM
11332          elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00")
11333          {
11334              if ($pos = strpos($data, "\x3F\x00\x3E\x00"))
11335              {
11336                  $parser =& new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8'));
11337                  if ($parser->parse())
11338                  {
11339                      $encoding[] = $parser->encoding;
11340                  }
11341              }
11342              $encoding[] = 'UTF-16LE';
11343          }
11344          // US-ASCII (or superset)
11345          elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C")
11346          {
11347              if ($pos = strpos($data, "\x3F\x3E"))
11348              {
11349                  $parser =& new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5));
11350                  if ($parser->parse())
11351                  {
11352                      $encoding[] = $parser->encoding;
11353                  }
11354              }
11355              $encoding[] = 'UTF-8';
11356          }
11357          // Fallback to UTF-8
11358          else
11359          {
11360              $encoding[] = 'UTF-8';
11361          }
11362          return $encoding;
11363      }
11364  
11365  	function output_javascript()
11366      {
11367          if (function_exists('ob_gzhandler'))
11368          {
11369              ob_start('ob_gzhandler');
11370          }
11371          header('Content-type: text/javascript; charset: UTF-8');
11372          header('Cache-Control: must-revalidate');
11373          header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
11374          ?>
11375  function embed_odeo(link) {
11376      document.writeln('<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="440" height="80" wmode="transparent" allowScriptAccess="any" flashvars="valid_sample_rate=true&external_url='+link+'"></embed>');
11377  }
11378  
11379  function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) {
11380      if (placeholder != '') {
11381          document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
11382      }
11383      else {
11384          document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
11385      }
11386  }
11387  
11388  function embed_flash(bgcolor, width, height, link, loop, type) {
11389      document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>');
11390  }
11391  
11392  function embed_flv(width, height, link, placeholder, loop, player) {
11393      document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>');
11394  }
11395  
11396  function embed_wmedia(width, height, link) {
11397      document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>');
11398  }
11399          <?php
11400      }
11401  
11402  
11403  
11404      /**
11405       * Format debugging information
11406       */
11407  	function debug($sp)
11408      {
11409          $info = 'SimplePie ' . SIMPLEPIE_VERSION . ' Build ' . SIMPLEPIE_BUILD . "\n";
11410          $info .= 'PHP ' . PHP_VERSION . "\n";
11411          if ($sp->error() !== null)
11412          {
11413              $info .= 'Error occurred: ' . $sp->error() . "\n";
11414          }
11415          else
11416          {
11417              $info .= "No error found.\n";
11418          }
11419          $info .= "Extensions:\n";
11420          $extensions = array('pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml');
11421          foreach ($extensions as $ext)
11422          {
11423              if (extension_loaded($ext))
11424              {
11425                  $info .= "    $ext loaded\n";
11426                  switch ($ext)
11427                  {
11428                      case 'pcre':
11429                          $info .= '      Version ' . PCRE_VERSION . "\n";
11430                          break;
11431                      case 'curl':
11432                          $version = curl_version();
11433                          $info .= '      Version ' . $version['version'] . "\n";
11434                          break;
11435                      case 'mbstring':
11436                          $info .= '      Overloading: ' . mb_get_info('func_overload') . "\n";
11437                          break;
11438                      case 'iconv':
11439                          $info .= '      Version ' . ICONV_VERSION . "\n";
11440                          break;
11441                      case 'xml':
11442                          $info .= '      Version ' . LIBXML_DOTTED_VERSION . "\n";
11443                          break;
11444                  }
11445              }
11446              else
11447              {
11448                  $info .= "    $ext not loaded\n";
11449              }
11450          }
11451          return $info;
11452      }
11453  }
11454  
11455  /**
11456   * Decode HTML Entities
11457   *
11458   * This implements HTML5 as of revision 967 (2007-06-28)
11459   *
11460   * @package SimplePie
11461   */
11462  class SimplePie_Decode_HTML_Entities
11463  {
11464      /**
11465       * Data to be parsed
11466       *
11467       * @access private
11468       * @var string
11469       */
11470      var $data = '';
11471  
11472      /**
11473       * Currently consumed bytes
11474       *
11475       * @access private
11476       * @var string
11477       */
11478      var $consumed = '';
11479  
11480      /**
11481       * Position of the current byte being parsed
11482       *
11483       * @access private
11484       * @var int
11485       */
11486      var $position = 0;
11487  
11488      /**
11489       * Create an instance of the class with the input data
11490       *
11491       * @access public
11492       * @param string $data Input data
11493       */
11494  	function SimplePie_Decode_HTML_Entities($data)
11495      {
11496          $this->data = $data;
11497      }
11498  
11499      /**
11500       * Parse the input data
11501       *
11502       * @access public
11503       * @return string Output data
11504       */
11505  	function parse()
11506      {
11507          while (($this->position = strpos($this->data, '&', $this->position)) !== false)
11508          {
11509              $this->consume();
11510              $this->entity();
11511              $this->consumed = '';
11512          }
11513          return $this->data;
11514      }
11515  
11516      /**
11517       * Consume the next byte
11518       *
11519       * @access private
11520       * @return mixed The next byte, or false, if there is no more data
11521       */
11522  	function consume()
11523      {
11524          if (isset($this->data[$this->position]))
11525          {
11526              $this->consumed .= $this->data[$this->position];
11527              return $this->data[$this->position++];
11528          }
11529          else
11530          {
11531              return false;
11532          }
11533      }
11534  
11535      /**
11536       * Consume a range of characters
11537       *
11538       * @access private
11539       * @param string $chars Characters to consume
11540       * @return mixed A series of characters that match the range, or false
11541       */
11542  	function consume_range($chars)
11543      {
11544          if ($len = strspn($this->data, $chars, $this->position))
11545          {
11546              $data = substr($this->data, $this->position, $len);
11547              $this->consumed .= $data;
11548              $this->position += $len;
11549              return $data;
11550          }
11551          else
11552          {
11553              return false;
11554          }
11555      }
11556  
11557      /**
11558       * Unconsume one byte
11559       *
11560       * @access private
11561       */
11562  	function unconsume()
11563      {
11564          $this->consumed = substr($this->consumed, 0, -1);
11565          $this->position--;
11566      }
11567  
11568      /**
11569       * Decode an entity
11570       *
11571       * @access private
11572       */
11573  	function entity()
11574      {
11575          switch ($this->consume())
11576          {
11577              case "\x09":
11578              case "\x0A":
11579              case "\x0B":
11580              case "\x0B":
11581              case "\x0C":
11582              case "\x20":
11583              case "\x3C":
11584              case "\x26":
11585              case false:
11586                  break;
11587  
11588              case "\x23":
11589                  switch ($this->consume())
11590                  {
11591                      case "\x78":
11592                      case "\x58":
11593                          $range = '0123456789ABCDEFabcdef';
11594                          $hex = true;
11595                          break;
11596  
11597                      default:
11598                          $range = '0123456789';
11599                          $hex = false;
11600                          $this->unconsume();
11601                          break;
11602                  }
11603  
11604                  if ($codepoint = $this->consume_range($range))
11605                  {
11606                      static $windows_1252_specials = array(0x0D => "\x0A", 0x80 => "\xE2\x82\xAC", 0x81 => "\xEF\xBF\xBD", 0x82 => "\xE2\x80\x9A", 0x83 => "\xC6\x92", 0x84 => "\xE2\x80\x9E", 0x85 => "\xE2\x80\xA6", 0x86 => "\xE2\x80\xA0", 0x87 => "\xE2\x80\xA1", 0x88 => "\xCB\x86", 0x89 => "\xE2\x80\xB0", 0x8A => "\xC5\xA0", 0x8B => "\xE2\x80\xB9", 0x8C => "\xC5\x92", 0x8D => "\xEF\xBF\xBD", 0x8E => "\xC5\xBD", 0x8F => "\xEF\xBF\xBD", 0x90 => "\xEF\xBF\xBD", 0x91 => "\xE2\x80\x98", 0x92 => "\xE2\x80\x99", 0x93 => "\xE2\x80\x9C", 0x94 => "\xE2\x80\x9D", 0x95 => "\xE2\x80\xA2", 0x96 => "\xE2\x80\x93", 0x97 => "\xE2\x80\x94", 0x98 => "\xCB\x9C", 0x99 => "\xE2\x84\xA2", 0x9A => "\xC5\xA1", 0x9B => "\xE2\x80\xBA", 0x9C => "\xC5\x93", 0x9D => "\xEF\xBF\xBD", 0x9E => "\xC5\xBE", 0x9F => "\xC5\xB8");
11607  
11608                      if ($hex)
11609                      {
11610                          $codepoint = hexdec($codepoint);
11611                      }
11612                      else
11613                      {
11614                          $codepoint = intval($codepoint);
11615                      }
11616  
11617                      if (isset($windows_1252_specials[$codepoint]))
11618                      {
11619                          $replacement = $windows_1252_specials[$codepoint];
11620                      }
11621                      else
11622                      {
11623                          $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint);
11624                      }
11625  
11626                      if (!in_array($this->consume(), array(';', false), true))
11627                      {
11628                          $this->unconsume();
11629                      }
11630  
11631                      $consumed_length = strlen($this->consumed);
11632                      $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length);
11633                      $this->position += strlen($replacement) - $consumed_length;
11634                  }
11635                  break;
11636  
11637              default:
11638                  static $entities = array('Aacute' => "\xC3\x81", 'aacute' => "\xC3\xA1", 'Aacute;' => "\xC3\x81", 'aacute;' => "\xC3\xA1", 'Acirc' => "\xC3\x82", 'acirc' => "\xC3\xA2", 'Acirc;' => "\xC3\x82", 'acirc;' => "\xC3\xA2", 'acute' => "\xC2\xB4", 'acute;' => "\xC2\xB4", 'AElig' => "\xC3\x86", 'aelig' => "\xC3\xA6", 'AElig;' => "\xC3\x86", 'aelig;' => "\xC3\xA6", 'Agrave' => "\xC3\x80", 'agrave' => "\xC3\xA0", 'Agrave;' => "\xC3\x80", 'agrave;' => "\xC3\xA0", 'alefsym;' => "\xE2\x84\xB5", 'Alpha;' => "\xCE\x91", 'alpha;' => "\xCE\xB1", 'AMP' => "\x26", 'amp' => "\x26", 'AMP;' => "\x26", 'amp;' => "\x26", 'and;' => "\xE2\x88\xA7", 'ang;' => "\xE2\x88\xA0", 'apos;' => "\x27", 'Aring' => "\xC3\x85", 'aring' => "\xC3\xA5", 'Aring;' => "\xC3\x85", 'aring;' => "\xC3\xA5", 'asymp;' => "\xE2\x89\x88", 'Atilde' => "\xC3\x83", 'atilde' => "\xC3\xA3", 'Atilde;' => "\xC3\x83", 'atilde;' => "\xC3\xA3", 'Auml' => "\xC3\x84", 'auml' => "\xC3\xA4", 'Auml;' => "\xC3\x84", 'auml;' => "\xC3\xA4", 'bdquo;' => "\xE2\x80\x9E", 'Beta;' => "\xCE\x92", 'beta;' => "\xCE\xB2", 'brvbar' => "\xC2\xA6", 'brvbar;' => "\xC2\xA6", 'bull;' => "\xE2\x80\xA2", 'cap;' => "\xE2\x88\xA9", 'Ccedil' => "\xC3\x87", 'ccedil' => "\xC3\xA7", 'Ccedil;' => "\xC3\x87", 'ccedil;' => "\xC3\xA7", 'cedil' => "\xC2\xB8", 'cedil;' => "\xC2\xB8", 'cent' => "\xC2\xA2", 'cent;' => "\xC2\xA2", 'Chi;' => "\xCE\xA7", 'chi;' => "\xCF\x87", 'circ;' => "\xCB\x86", 'clubs;' => "\xE2\x99\xA3", 'cong;' => "\xE2\x89\x85", 'COPY' => "\xC2\xA9", 'copy' => "\xC2\xA9", 'COPY;' => "\xC2\xA9", 'copy;' => "\xC2\xA9", 'crarr;' => "\xE2\x86\xB5", 'cup;' => "\xE2\x88\xAA", 'curren' => "\xC2\xA4", 'curren;' => "\xC2\xA4", 'Dagger;' => "\xE2\x80\xA1", 'dagger;' => "\xE2\x80\xA0", 'dArr;' => "\xE2\x87\x93", 'darr;' => "\xE2\x86\x93", 'deg' => "\xC2\xB0", 'deg;' => "\xC2\xB0", 'Delta;' => "\xCE\x94", 'delta;' => "\xCE\xB4", 'diams;' => "\xE2\x99\xA6", 'divide' => "\xC3\xB7", 'divide;' => "\xC3\xB7", 'Eacute' => "\xC3\x89", 'eacute' => "\xC3\xA9", 'Eacute;' => "\xC3\x89", 'eacute;' => "\xC3\xA9", 'Ecirc' => "\xC3\x8A", 'ecirc' => "\xC3\xAA", 'Ecirc;' => "\xC3\x8A", 'ecirc;' => "\xC3\xAA", 'Egrave' => "\xC3\x88", 'egrave' => "\xC3\xA8", 'Egrave;' => "\xC3\x88", 'egrave;' => "\xC3\xA8", 'empty;' => "\xE2\x88\x85", 'emsp;' => "\xE2\x80\x83", 'ensp;' => "\xE2\x80\x82", 'Epsilon;' => "\xCE\x95", 'epsilon;' => "\xCE\xB5", 'equiv;' => "\xE2\x89\xA1", 'Eta;' => "\xCE\x97", 'eta;' => "\xCE\xB7", 'ETH' => "\xC3\x90", 'eth' => "\xC3\xB0", 'ETH;' => "\xC3\x90", 'eth;' => "\xC3\xB0", 'Euml' => "\xC3\x8B", 'euml' => "\xC3\xAB", 'Euml;' => "\xC3\x8B", 'euml;' => "\xC3\xAB", 'euro;' => "\xE2\x82\xAC", 'exist;' => "\xE2\x88\x83", 'fnof;' => "\xC6\x92", 'forall;' => "\xE2\x88\x80", 'frac12' => "\xC2\xBD", 'frac12;' => "\xC2\xBD", 'frac14' => "\xC2\xBC", 'frac14;' => "\xC2\xBC", 'frac34' => "\xC2\xBE", 'frac34;' => "\xC2\xBE", 'frasl;' => "\xE2\x81\x84", 'Gamma;' => "\xCE\x93", 'gamma;' => "\xCE\xB3", 'ge;' => "\xE2\x89\xA5", 'GT' => "\x3E", 'gt' => "\x3E", 'GT;' => "\x3E", 'gt;' => "\x3E", 'hArr;' => "\xE2\x87\x94", 'harr;' => "\xE2\x86\x94", 'hearts;' => "\xE2\x99\xA5", 'hellip;' => "\xE2\x80\xA6", 'Iacute' => "\xC3\x8D", 'iacute' => "\xC3\xAD", 'Iacute;' => "\xC3\x8D", 'iacute;' => "\xC3\xAD", 'Icirc' => "\xC3\x8E", 'icirc' => "\xC3\xAE", 'Icirc;' => "\xC3\x8E", 'icirc;' => "\xC3\xAE", 'iexcl' => "\xC2\xA1", 'iexcl;' => "\xC2\xA1", 'Igrave' => "\xC3\x8C", 'igrave' => "\xC3\xAC", 'Igrave;' => "\xC3\x8C", 'igrave;' => "\xC3\xAC", 'image;' => "\xE2\x84\x91", 'infin;' => "\xE2\x88\x9E", 'int;' => "\xE2\x88\xAB", 'Iota;' => "\xCE\x99", 'iota;' => "\xCE\xB9", 'iquest' => "\xC2\xBF", 'iquest;' => "\xC2\xBF", 'isin;' => "\xE2\x88\x88", 'Iuml' => "\xC3\x8F", 'iuml' => "\xC3\xAF", 'Iuml;' => "\xC3\x8F", 'iuml;' => "\xC3\xAF", 'Kappa;' => "\xCE\x9A", 'kappa;' => "\xCE\xBA", 'Lambda;' => "\xCE\x9B", 'lambda;' => "\xCE\xBB", 'lang;' => "\xE3\x80\x88", 'laquo' => "\xC2\xAB", 'laquo;' => "\xC2\xAB", 'lArr;' => "\xE2\x87\x90", 'larr;' => "\xE2\x86\x90", 'lceil;' => "\xE2\x8C\x88", 'ldquo;' => "\xE2\x80\x9C", 'le;' => "\xE2\x89\xA4", 'lfloor;' => "\xE2\x8C\x8A", 'lowast;' => "\xE2\x88\x97", 'loz;' => "\xE2\x97\x8A", 'lrm;' => "\xE2\x80\x8E", 'lsaquo;' => "\xE2\x80\xB9", 'lsquo;' => "\xE2\x80\x98", 'LT' => "\x3C", 'lt' => "\x3C", 'LT;' => "\x3C", 'lt;' => "\x3C", 'macr' => "\xC2\xAF", 'macr;' => "\xC2\xAF", 'mdash;' => "\xE2\x80\x94", 'micro' => "\xC2\xB5", 'micro;' => "\xC2\xB5", 'middot' => "\xC2\xB7", 'middot;' => "\xC2\xB7", 'minus;' => "\xE2\x88\x92", 'Mu;' => "\xCE\x9C", 'mu;' => "\xCE\xBC", 'nabla;' => "\xE2\x88\x87", 'nbsp' => "\xC2\xA0", 'nbsp;' => "\xC2\xA0", 'ndash;' => "\xE2\x80\x93", 'ne;' => "\xE2\x89\xA0", 'ni;' => "\xE2\x88\x8B", 'not' => "\xC2\xAC", 'not;' => "\xC2\xAC", 'notin;' => "\xE2\x88\x89", 'nsub;' => "\xE2\x8A\x84", 'Ntilde' => "\xC3\x91", 'ntilde' => "\xC3\xB1", 'Ntilde;' => "\xC3\x91", 'ntilde;' => "\xC3\xB1", 'Nu;' => "\xCE\x9D", 'nu;' => "\xCE\xBD", 'Oacute' => "\xC3\x93", 'oacute' => "\xC3\xB3", 'Oacute;' => "\xC3\x93", 'oacute;' => "\xC3\xB3", 'Ocirc' => "\xC3\x94", 'ocirc' => "\xC3\xB4", 'Ocirc;' => "\xC3\x94", 'ocirc;' => "\xC3\xB4", 'OElig;' => "\xC5\x92", 'oelig;' => "\xC5\x93", 'Ograve' => "\xC3\x92", 'ograve' => "\xC3\xB2", 'Ograve;' => "\xC3\x92", 'ograve;' => "\xC3\xB2", 'oline;' => "\xE2\x80\xBE", 'Omega;' => "\xCE\xA9", 'omega;' => "\xCF\x89", 'Omicron;' => "\xCE\x9F", 'omicron;' => "\xCE\xBF", 'oplus;' => "\xE2\x8A\x95", 'or;' => "\xE2\x88\xA8", 'ordf' => "\xC2\xAA", 'ordf;' => "\xC2\xAA", 'ordm' => "\xC2\xBA", 'ordm;' => "\xC2\xBA", 'Oslash' => "\xC3\x98", 'oslash' => "\xC3\xB8", 'Oslash;' => "\xC3\x98", 'oslash;' => "\xC3\xB8", 'Otilde' => "\xC3\x95", 'otilde' => "\xC3\xB5", 'Otilde;' => "\xC3\x95", 'otilde;' => "\xC3\xB5", 'otimes;' => "\xE2\x8A\x97", 'Ouml' => "\xC3\x96", 'ouml' => "\xC3\xB6", 'Ouml;' => "\xC3\x96", 'ouml;' => "\xC3\xB6", 'para' => "\xC2\xB6", 'para;' => "\xC2\xB6", 'part;' => "\xE2\x88\x82", 'permil;' => "\xE2\x80\xB0", 'perp;' => "\xE2\x8A\xA5", 'Phi;' => "\xCE\xA6", 'phi;' => "\xCF\x86", 'Pi;' => "\xCE\xA0", 'pi;' => "\xCF\x80", 'piv;' => "\xCF\x96", 'plusmn' => "\xC2\xB1", 'plusmn;' => "\xC2\xB1", 'pound' => "\xC2\xA3", 'pound;' => "\xC2\xA3", 'Prime;' => "\xE2\x80\xB3", 'prime;' => "\xE2\x80\xB2", 'prod;' => "\xE2\x88\x8F", 'prop;' => "\xE2\x88\x9D", 'Psi;' => "\xCE\xA8", 'psi;' => "\xCF\x88", 'QUOT' => "\x22", 'quot' => "\x22", 'QUOT;' => "\x22", 'quot;' => "\x22", 'radic;' => "\xE2\x88\x9A", 'rang;' => "\xE3\x80\x89", 'raquo' => "\xC2\xBB", 'raquo;' => "\xC2\xBB", 'rArr;' => "\xE2\x87\x92", 'rarr;' => "\xE2\x86\x92", 'rceil;' => "\xE2\x8C\x89", 'rdquo;' => "\xE2\x80\x9D", 'real;' => "\xE2\x84\x9C", 'REG' => "\xC2\xAE", 'reg' => "\xC2\xAE", 'REG;' => "\xC2\xAE", 'reg;' => "\xC2\xAE", 'rfloor;' => "\xE2\x8C\x8B", 'Rho;' => "\xCE\xA1", 'rho;' => "\xCF\x81", 'rlm;' => "\xE2\x80\x8F", 'rsaquo;' => "\xE2\x80\xBA", 'rsquo;' => "\xE2\x80\x99", 'sbquo;' => "\xE2\x80\x9A", 'Scaron;' => "\xC5\xA0", 'scaron;' => "\xC5\xA1", 'sdot;' => "\xE2\x8B\x85", 'sect' => "\xC2\xA7", 'sect;' => "\xC2\xA7", 'shy' => "\xC2\xAD", 'shy;' => "\xC2\xAD", 'Sigma;' => "\xCE\xA3", 'sigma;' => "\xCF\x83", 'sigmaf;' => "\xCF\x82", 'sim;' => "\xE2\x88\xBC", 'spades;' => "\xE2\x99\xA0", 'sub;' => "\xE2\x8A\x82", 'sube;' => "\xE2\x8A\x86", 'sum;' => "\xE2\x88\x91", 'sup;' => "\xE2\x8A\x83", 'sup1' => "\xC2\xB9", 'sup1;' => "\xC2\xB9", 'sup2' => "\xC2\xB2", 'sup2;' => "\xC2\xB2", 'sup3' => "\xC2\xB3", 'sup3;' => "\xC2\xB3", 'supe;' => "\xE2\x8A\x87", 'szlig' => "\xC3\x9F", 'szlig;' => "\xC3\x9F", 'Tau;' => "\xCE\xA4", 'tau;' => "\xCF\x84", 'there4;' => "\xE2\x88\xB4", 'Theta;' => "\xCE\x98", 'theta;' => "\xCE\xB8", 'thetasym;' => "\xCF\x91", 'thinsp;' => "\xE2\x80\x89", 'THORN' => "\xC3\x9E", 'thorn' => "\xC3\xBE", 'THORN;' => "\xC3\x9E", 'thorn;' => "\xC3\xBE", 'tilde;' => "\xCB\x9C", 'times' => "\xC3\x97", 'times;' => "\xC3\x97", 'TRADE;' => "\xE2\x84\xA2", 'trade;' => "\xE2\x84\xA2", 'Uacute' => "\xC3\x9A", 'uacute' => "\xC3\xBA", 'Uacute;' => "\xC3\x9A", 'uacute;' => "\xC3\xBA", 'uArr;' => "\xE2\x87\x91", 'uarr;' => "\xE2\x86\x91", 'Ucirc' => "\xC3\x9B", 'ucirc' => "\xC3\xBB", 'Ucirc;' => "\xC3\x9B", 'ucirc;' => "\xC3\xBB", 'Ugrave' => "\xC3\x99", 'ugrave' => "\xC3\xB9", 'Ugrave;' => "\xC3\x99", 'ugrave;' => "\xC3\xB9", 'uml' => "\xC2\xA8", 'uml;' => "\xC2\xA8", 'upsih;' => "\xCF\x92", 'Upsilon;' => "\xCE\xA5", 'upsilon;' => "\xCF\x85", 'Uuml' => "\xC3\x9C", 'uuml' => "\xC3\xBC", 'Uuml;' => "\xC3\x9C", 'uuml;' => "\xC3\xBC", 'weierp;' => "\xE2\x84\x98", 'Xi;' => "\xCE\x9E", 'xi;' => "\xCE\xBE", 'Yacute' => "\xC3\x9D", 'yacute' => "\xC3\xBD", 'Yacute;' => "\xC3\x9D", 'yacute;' => "\xC3\xBD", 'yen' => "\xC2\xA5", 'yen;' => "\xC2\xA5", 'yuml' => "\xC3\xBF", 'Yuml;' => "\xC5\xB8", 'yuml;' => "\xC3\xBF", 'Zeta;' => "\xCE\x96", 'zeta;' => "\xCE\xB6", 'zwj;' => "\xE2\x80\x8D", 'zwnj;' => "\xE2\x80\x8C");
11639  
11640                  for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++)
11641                  {
11642                      $consumed = substr($this->consumed, 1);
11643                      if (isset($entities[$consumed]))
11644                      {
11645                          $match = $consumed;
11646                      }
11647                  }
11648  
11649                  if ($match !== null)
11650                  {
11651                       $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1);
11652                      $this->position += strlen($entities[$match]) - strlen($consumed) - 1;
11653                  }
11654                  break;
11655          }
11656      }
11657  }
11658  
11659  /**
11660   * IRI parser/serialiser
11661   *
11662   * @package SimplePie
11663   */
11664  class SimplePie_IRI
11665  {
11666      /**
11667       * Scheme
11668       *
11669       * @access private
11670       * @var string
11671       */
11672      var $scheme;
11673  
11674      /**
11675       * User Information
11676       *
11677       * @access private
11678       * @var string
11679       */
11680      var $userinfo;
11681  
11682      /**
11683       * Host
11684       *
11685       * @access private
11686       * @var string
11687       */
11688      var $host;
11689  
11690      /**
11691       * Port
11692       *
11693       * @access private
11694       * @var string
11695       */
11696      var $port;
11697  
11698      /**
11699       * Path
11700       *
11701       * @access private
11702       * @var string
11703       */
11704      var $path;
11705  
11706      /**
11707       * Query
11708       *
11709       * @access private
11710       * @var string
11711       */
11712      var $query;
11713  
11714      /**
11715       * Fragment
11716       *
11717       * @access private
11718       * @var string
11719       */
11720      var $fragment;
11721  
11722      /**
11723       * Whether the object represents a valid IRI
11724       *
11725       * @access private
11726       * @var array
11727       */
11728      var $valid = array();
11729  
11730      /**
11731       * Return the entire IRI when you try and read the object as a string
11732       *
11733       * @access public
11734       * @return string
11735       */
11736  	function __toString()
11737      {
11738          return $this->get_iri();
11739      }
11740  
11741      /**
11742       * Create a new IRI object, from a specified string
11743       *
11744       * @access public
11745       * @param string $iri
11746       * @return SimplePie_IRI
11747       */
11748  	function SimplePie_IRI($iri)
11749      {
11750          $iri = (string) $iri;
11751          if ($iri !== '')
11752          {
11753              $parsed = $this->parse_iri($iri);
11754              $this->set_scheme($parsed['scheme']);
11755              $this->set_authority($parsed['authority']);
11756              $this->set_path($parsed['path']);
11757              $this->set_query($parsed['query']);
11758              $this->set_fragment($parsed['fragment']);
11759          }
11760      }
11761  
11762      /**
11763       * Create a new IRI object by resolving a relative IRI
11764       *
11765       * @static
11766       * @access public
11767       * @param SimplePie_IRI $base Base IRI
11768       * @param string $relative Relative IRI
11769       * @return SimplePie_IRI
11770       */
11771  	function absolutize($base, $relative)
11772      {
11773          $relative = (string) $relative;
11774          if ($relative !== '')
11775          {
11776              $relative =& new SimplePie_IRI($relative);
11777              if ($relative->get_scheme() !== null)
11778              {
11779                  $target = $relative;
11780              }
11781              elseif ($base->get_iri() !== null)
11782              {
11783                  if ($relative->get_authority() !== null)
11784                  {
11785                      $target = $relative;
11786                      $target->set_scheme($base->get_scheme());
11787                  }
11788                  else
11789                  {
11790                      $target =& new SimplePie_IRI('');
11791                      $target->set_scheme($base->get_scheme());
11792                      $target->set_userinfo($base->get_userinfo());
11793                      $target->set_host($base->get_host());
11794                      $target->set_port($base->get_port());
11795                      if ($relative->get_path() !== null)
11796                      {
11797                          if (strpos($relative->get_path(), '/') === 0)
11798                          {
11799                              $target->set_path($relative->get_path());
11800                          }
11801                          elseif (($base->get_userinfo() !== null || $base->get_host() !== null || $base->get_port() !== null) && $base->get_path() === null)
11802                          {
11803                              $target->set_path('/' . $relative->get_path());
11804                          }
11805                          elseif (($last_segment = strrpos($base->get_path(), '/')) !== false)
11806                          {
11807                              $target->set_path(substr($base->get_path(), 0, $last_segment + 1) . $relative->get_path());
11808                          }
11809                          else
11810                          {
11811                              $target->set_path($relative->get_path());
11812                          }
11813                          $target->set_query($relative->get_query());
11814                      }
11815                      else
11816                      {
11817                          $target->set_path($base->get_path());
11818                          if ($relative->get_query() !== null)
11819                          {
11820                              $target->set_query($relative->get_query());
11821                          }
11822                          elseif ($base->get_query() !== null)
11823                          {
11824                              $target->set_query($base->get_query());
11825                          }
11826                      }
11827                  }
11828                  $target->set_fragment($relative->get_fragment());
11829              }
11830              else
11831              {
11832                  // No base URL, just return the relative URL
11833                  $target = $relative;
11834              }
11835          }
11836          else
11837          {
11838              $target = $base;
11839          }
11840          return $target;
11841      }
11842  
11843      /**
11844       * Parse an IRI into scheme/authority/path/query/fragment segments
11845       *
11846       * @access private
11847       * @param string $iri
11848       * @return array
11849       */
11850  	function parse_iri($iri)
11851      {
11852          preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/', $iri, $match);
11853          for ($i = count($match); $i <= 9; $i++)
11854          {
11855              $match[$i] = '';
11856          }
11857          return array('scheme' => $match[2], 'authority' => $match[4], 'path' => $match[5], 'query' => $match[7], 'fragment' => $match[9]);
11858      }
11859  
11860      /**
11861       * Remove dot segments from a path
11862       *
11863       * @access private
11864       * @param string $input
11865       * @return string
11866       */
11867  	function remove_dot_segments($input)
11868      {
11869          $output = '';
11870          while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..')
11871          {
11872              // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise,
11873              if (strpos($input, '../') === 0)
11874              {
11875                  $input = substr($input, 3);
11876              }
11877              elseif (strpos($input, './') === 0)
11878              {
11879                  $input = substr($input, 2);
11880              }
11881              // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise,
11882              elseif (strpos($input, '/./') === 0)
11883              {
11884                  $input = substr_replace($input, '/', 0, 3);
11885              }
11886              elseif ($input === '/.')
11887              {
11888                  $input = '/';
11889              }
11890              // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise,
11891              elseif (strpos($input, '/../') === 0)
11892              {
11893                  $input = substr_replace($input, '/', 0, 4);
11894                  $output = substr_replace($output, '', strrpos($output, '/'));
11895              }
11896              elseif ($input === '/..')
11897              {
11898                  $input = '/';
11899                  $output = substr_replace($output, '', strrpos($output, '/'));
11900              }
11901              // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise,
11902              elseif ($input === '.' || $input === '..')
11903              {
11904                  $input = '';
11905              }
11906              // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer
11907              elseif (($pos = strpos($input, '/', 1)) !== false)
11908              {
11909                  $output .= substr($input, 0, $pos);
11910                  $input = substr_replace($input, '', 0, $pos);
11911              }
11912              else
11913              {
11914                  $output .= $input;
11915                  $input = '';
11916              }
11917          }
11918          return $output . $input;
11919      }
11920  
11921      /**
11922       * Replace invalid character with percent encoding
11923       *
11924       * @param string $string Input string
11925       * @param string $valid_chars Valid characters
11926       * @param int $case Normalise case
11927       * @return string
11928       */
11929  	function replace_invalid_with_pct_encoding($string, $valid_chars, $case = SIMPLEPIE_SAME_CASE, $iprivate = false)
11930      {
11931          // Normalize as many pct-encoded sections as possible
11932          $string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array(&$this, 'remove_iunreserved_percent_encoded'), $string);
11933  
11934          // Replace invalid percent characters
11935          $string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string);
11936  
11937          // Add unreserved and % to $valid_chars (the latter is safe because all
11938          // pct-encoded sections are now valid).
11939          $valid_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%';
11940  
11941          // Now replace any bytes that aren't allowed with their pct-encoded versions
11942          $position = 0;
11943          $strlen = strlen($string);
11944          while (($position += strspn($string, $valid_chars, $position)) < $strlen)
11945          {
11946              $value = ord($string[$position]);
11947  
11948              // Start position
11949              $start = $position;
11950  
11951              // By default we are valid
11952              $valid = true;
11953  
11954              // No one byte sequences are valid due to the while.
11955              // Two byte sequence:
11956              if (($value & 0xE0) === 0xC0)
11957              {
11958                  $character = ($value & 0x1F) << 6;
11959                  $length = 2;
11960                  $remaining = 1;
11961              }
11962              // Three byte sequence:
11963              elseif (($value & 0xF0) === 0xE0)
11964              {
11965                  $character = ($value & 0x0F) << 12;
11966                  $length = 3;
11967                  $remaining = 2;
11968              }
11969              // Four byte sequence:
11970              elseif (($value & 0xF8) === 0xF0)
11971              {
11972                  $character = ($value & 0x07) << 18;
11973                  $length = 4;
11974                  $remaining = 3;
11975              }
11976              // Invalid byte:
11977              else
11978              {
11979                  $valid = false;
11980                  $length = 1;
11981                  $remaining = 0;
11982              }
11983  
11984              if ($remaining)
11985              {
11986                  if ($position + $length <= $strlen)
11987                  {
11988                      for ($position++; $remaining; $position++)
11989                      {
11990                          $value = ord($string[$position]);
11991  
11992                          // Check that the byte is valid, then add it to the character:
11993                          if (($value & 0xC0) === 0x80)
11994                          {
11995                              $character |= ($value & 0x3F) << (--$remaining * 6);
11996                          }
11997                          // If it is invalid, count the sequence as invalid and reprocess the current byte:
11998                          else
11999                          {
12000                              $valid = false;
12001                              $position--;
12002                              break;
12003                          }
12004                      }
12005                  }
12006                  else
12007                  {
12008                      $position = $strlen - 1;
12009                      $valid = false;
12010                  }
12011              }
12012  
12013              // Percent encode anything invalid or not in ucschar
12014              if (
12015                  // Invalid sequences
12016                  !$valid
12017                  // Non-shortest form sequences are invalid
12018                  || $length > 1 && $character <= 0x7F
12019                  || $length > 2 && $character <= 0x7FF
12020                  || $length > 3 && $character <= 0xFFFF
12021                  // Outside of range of ucschar codepoints
12022                  // Noncharacters
12023                  || ($character & 0xFFFE) === 0xFFFE
12024                  || $character >= 0xFDD0 && $character <= 0xFDEF
12025                  || (
12026                      // Everything else not in ucschar
12027                         $character > 0xD7FF && $character < 0xF900
12028                      || $character < 0xA0
12029                      || $character > 0xEFFFD
12030                  )
12031                  && (
12032                      // Everything not in iprivate, if it applies
12033                         !$iprivate
12034                      || $character < 0xE000
12035                      || $character > 0x10FFFD
12036                  )
12037              )
12038              {
12039                  // If we were a character, pretend we weren't, but rather an error.
12040                  if ($valid)
12041                      $position--;
12042  
12043                  for ($j = $start; $j <= $position; $j++)
12044                  {
12045                      $string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1);
12046                      $j += 2;
12047                      $position += 2;
12048                      $strlen += 2;
12049                  }
12050              }
12051          }
12052  
12053          // Normalise case
12054          if ($case & SIMPLEPIE_LOWERCASE)
12055          {
12056              $string = strtolower($string);
12057          }
12058          elseif ($case & SIMPLEPIE_UPPERCASE)
12059          {
12060              $string = strtoupper($string);
12061          }
12062  
12063          return $string;
12064      }
12065  
12066      /**
12067       * Callback function for preg_replace_callback.
12068       *
12069       * Removes sequences of percent encoded bytes that represent UTF-8
12070       * encoded characters in iunreserved
12071       *
12072       * @access private
12073       * @param array $match PCRE match
12074       * @return string Replacement
12075       */
12076  	function remove_iunreserved_percent_encoded($match)
12077      {
12078          // As we just have valid percent encoded sequences we can just explode
12079          // and ignore the first member of the returned array (an empty string).
12080          $bytes = explode('%', $match[0]);
12081  
12082          // Initialize the new string (this is what will be returned) and that
12083          // there are no bytes remaining in the current sequence (unsurprising
12084          // at the first byte!).
12085          $string = '';
12086          $remaining = 0;
12087  
12088          // Loop over each and every byte, and set $value to its value
12089          for ($i = 1, $len = count($bytes); $i < $len; $i++)
12090          {
12091              $value = hexdec($bytes[$i]);
12092  
12093              // If we're the first byte of sequence:
12094              if (!$remaining)
12095              {
12096                  // Start position
12097                  $start = $i;
12098  
12099                  // By default we are valid
12100                  $valid = true;
12101  
12102                  // One byte sequence:
12103                  if ($value <= 0x7F)
12104                  {
12105                      $character = $value;
12106                      $length = 1;
12107                  }
12108                  // Two byte sequence:
12109                  elseif (($value & 0xE0) === 0xC0)
12110                  {
12111                      $character = ($value & 0x1F) << 6;
12112                      $length = 2;
12113                      $remaining = 1;
12114                  }
12115                  // Three byte sequence:
12116                  elseif (($value & 0xF0) === 0xE0)
12117                  {
12118                      $character = ($value & 0x0F) << 12;
12119                      $length = 3;
12120                      $remaining = 2;
12121                  }
12122                  // Four byte sequence:
12123                  elseif (($value & 0xF8) === 0xF0)
12124                  {
12125                      $character = ($value & 0x07) << 18;
12126                      $length = 4;
12127                      $remaining = 3;
12128                  }
12129                  // Invalid byte:
12130                  else
12131                  {
12132                      $valid = false;
12133                      $remaining = 0;
12134                  }
12135              }
12136              // Continuation byte:
12137              else
12138              {
12139                  // Check that the byte is valid, then add it to the character:
12140                  if (($value & 0xC0) === 0x80)
12141                  {
12142                      $remaining--;
12143                      $character |= ($value & 0x3F) << ($remaining * 6);
12144                  }
12145                  // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence:
12146                  else
12147                  {
12148                      $valid = false;
12149                      $remaining = 0;
12150                      $i--;
12151                  }
12152              }
12153  
12154              // If we've reached the end of the current byte sequence, append it to Unicode::$data
12155              if (!$remaining)
12156              {
12157                  // Percent encode anything invalid or not in iunreserved
12158                  if (
12159                      // Invalid sequences
12160                      !$valid
12161                      // Non-shortest form sequences are invalid
12162                      || $length > 1 && $character <= 0x7F
12163                      || $length > 2 && $character <= 0x7FF
12164                      || $length > 3 && $character <= 0xFFFF
12165                      // Outside of range of iunreserved codepoints
12166                      || $character < 0x2D
12167                      || $character > 0xEFFFD
12168                      // Noncharacters
12169                      || ($character & 0xFFFE) === 0xFFFE
12170                      || $character >= 0xFDD0 && $character <= 0xFDEF
12171                      // Everything else not in iunreserved (this is all BMP)
12172                      || $character === 0x2F
12173                      || $character > 0x39 && $character < 0x41
12174                      || $character > 0x5A && $character < 0x61
12175                      || $character > 0x7A && $character < 0x7E
12176                      || $character > 0x7E && $character < 0xA0
12177                      || $character > 0xD7FF && $character < 0xF900
12178                  )
12179                  {
12180                      for ($j = $start; $j <= $i; $j++)
12181                      {
12182                          $string .= '%' . strtoupper($bytes[$j]);
12183                      }
12184                  }
12185                  else
12186                  {
12187                      for ($j = $start; $j <= $i; $j++)
12188                      {
12189                          $string .= chr(hexdec($bytes[$j]));
12190                      }
12191                  }
12192              }
12193          }
12194  
12195          // If we have any bytes left over they are invalid (i.e., we are
12196          // mid-way through a multi-byte sequence)
12197          if ($remaining)
12198          {
12199              for ($j = $start; $j < $len; $j++)
12200              {
12201                  $string .= '%' . strtoupper($bytes[$j]);
12202              }
12203          }
12204  
12205          return $string;
12206      }
12207  
12208      /**
12209       * Check if the object represents a valid IRI
12210       *
12211       * @access public
12212       * @return bool
12213       */
12214  	function is_valid()
12215      {
12216          return array_sum($this->valid) === count($this->valid);
12217      }
12218  
12219      /**
12220       * Set the scheme. Returns true on success, false on failure (if there are
12221       * any invalid characters).
12222       *
12223       * @access public
12224       * @param string $scheme
12225       * @return bool
12226       */
12227  	function set_scheme($scheme)
12228      {
12229          if ($scheme === null || $scheme === '')
12230          {
12231              $this->scheme = null;
12232          }
12233          else
12234          {
12235              $len = strlen($scheme);
12236              switch (true)
12237              {
12238                  case $len > 1:
12239                      if (!strspn($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-.', 1))
12240                      {
12241                          $this->scheme = null;
12242                          $this->valid[__FUNCTION__] = false;
12243                          return false;
12244                      }
12245  
12246                  case $len > 0:
12247                      if (!strspn($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 0, 1))
12248                      {
12249                          $this->scheme = null;
12250                          $this->valid[__FUNCTION__] = false;
12251                          return false;
12252                      }
12253              }
12254              $this->scheme = strtolower($scheme);
12255          }
12256          $this->valid[__FUNCTION__] = true;
12257          return true;
12258      }
12259  
12260      /**
12261       * Set the authority. Returns true on success, false on failure (if there are
12262       * any invalid characters).
12263       *
12264       * @access public
12265       * @param string $authority
12266       * @return bool
12267       */
12268  	function set_authority($authority)
12269      {
12270          if (($userinfo_end = strrpos($authority, '@')) !== false)
12271          {
12272              $userinfo = substr($authority, 0, $userinfo_end);
12273              $authority = substr($authority, $userinfo_end + 1);
12274          }
12275          else
12276          {
12277              $userinfo = null;
12278          }
12279  
12280          if (($port_start = strpos($authority, ':')) !== false)
12281          {
12282              $port = substr($authority, $port_start + 1);
12283              $authority = substr($authority, 0, $port_start);
12284          }
12285          else
12286          {
12287              $port = null;
12288          }
12289  
12290          return $this->set_userinfo($userinfo) && $this->set_host($authority) && $this->set_port($port);
12291      }
12292  
12293      /**
12294       * Set the userinfo.
12295       *
12296       * @access public
12297       * @param string $userinfo
12298       * @return bool
12299       */
12300  	function set_userinfo($userinfo)
12301      {
12302          if ($userinfo === null || $userinfo === '')
12303          {
12304              $this->userinfo = null;
12305          }
12306          else
12307          {
12308              $this->userinfo = $this->replace_invalid_with_pct_encoding($userinfo, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:');
12309          }
12310          $this->valid[__FUNCTION__] = true;
12311          return true;
12312      }
12313  
12314      /**
12315       * Set the host. Returns true on success, false on failure (if there are
12316       * any invalid characters).
12317       *
12318       * @access public
12319       * @param string $host
12320       * @return bool
12321       */
12322  	function set_host($host)
12323      {
12324          if ($host === null || $host === '')
12325          {
12326              $this->host = null;
12327              $this->valid[__FUNCTION__] = true;
12328              return true;
12329          }
12330          elseif ($host[0] === '[' && substr($host, -1) === ']')
12331          {
12332              if (SimplePie_Net_IPv6::checkIPv6(substr($host, 1, -1)))
12333              {
12334                  $this->host = $host;
12335                  $this->valid[__FUNCTION__] = true;
12336                  return true;
12337              }
12338              else
12339              {
12340                  $this->host = null;
12341                  $this->valid[__FUNCTION__] = false;
12342                  return false;
12343              }
12344          }
12345          else
12346          {
12347              $this->host = $this->replace_invalid_with_pct_encoding($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=', SIMPLEPIE_LOWERCASE);
12348              $this->valid[__FUNCTION__] = true;
12349              return true;
12350          }
12351      }
12352  
12353      /**
12354       * Set the port. Returns true on success, false on failure (if there are
12355       * any invalid characters).
12356       *
12357       * @access public
12358       * @param string $port
12359       * @return bool
12360       */
12361  	function set_port($port)
12362      {
12363          if ($port === null || $port === '')
12364          {
12365              $this->port = null;
12366              $this->valid[__FUNCTION__] = true;
12367              return true;
12368          }
12369          elseif (strspn($port, '0123456789') === strlen($port))
12370          {
12371              $this->port = (int) $port;
12372              $this->valid[__FUNCTION__] = true;
12373              return true;
12374          }
12375          else
12376          {
12377              $this->port = null;
12378              $this->valid[__FUNCTION__] = false;
12379              return false;
12380          }
12381      }
12382  
12383      /**
12384       * Set the path.
12385       *
12386       * @access public
12387       * @param string $path
12388       * @return bool
12389       */
12390  	function set_path($path)
12391      {
12392          if ($path === null || $path === '')
12393          {
12394              $this->path = null;
12395              $this->valid[__FUNCTION__] = true;
12396              return true;
12397          }
12398          elseif (substr($path, 0, 2) === '//' && $this->userinfo === null && $this->host === null && $this->port === null)
12399          {
12400              $this->path = null;
12401              $this->valid[__FUNCTION__] = false;
12402              return false;
12403          }
12404          else
12405          {
12406              $this->path = $this->replace_invalid_with_pct_encoding($path, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=@/');
12407              if ($this->scheme !== null)
12408              {
12409                  $this->path = $this->remove_dot_segments($this->path);
12410              }
12411              $this->valid[__FUNCTION__] = true;
12412              return true;
12413          }
12414      }
12415  
12416      /**
12417       * Set the query.
12418       *
12419       * @access public
12420       * @param string $query
12421       * @return bool
12422       */
12423  	function set_query($query)
12424      {
12425          if ($query === null || $query === '')
12426          {
12427              $this->query = null;
12428          }
12429          else
12430          {
12431              $this->query = $this->replace_invalid_with_pct_encoding($query, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$\'()*+,;:@/?&=');
12432          }
12433          $this->valid[__FUNCTION__] = true;
12434          return true;
12435      }
12436  
12437      /**
12438       * Set the fragment.
12439       *
12440       * @access public
12441       * @param string $fragment
12442       * @return bool
12443       */
12444  	function set_fragment($fragment)
12445      {
12446          if ($fragment === null || $fragment === '')
12447          {
12448              $this->fragment = null;
12449          }
12450          else
12451          {
12452              $this->fragment = $this->replace_invalid_with_pct_encoding($fragment, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:@/?');
12453          }
12454          $this->valid[__FUNCTION__] = true;
12455          return true;
12456      }
12457  
12458      /**
12459       * Get the complete IRI
12460       *
12461       * @access public
12462       * @return string
12463       */
12464  	function get_iri()
12465      {
12466          $iri = '';
12467          if ($this->scheme !== null)
12468          {
12469              $iri .= $this->scheme . ':';
12470          }
12471          if (($authority = $this->get_authority()) !== null)
12472          {
12473              $iri .= '//' . $authority;
12474          }
12475          if ($this->path !== null)
12476          {
12477              $iri .= $this->path;
12478          }
12479          if ($this->query !== null)
12480          {
12481              $iri .= '?' . $this->query;
12482          }
12483          if ($this->fragment !== null)
12484          {
12485              $iri .= '#' . $this->fragment;
12486          }
12487  
12488          if ($iri !== '')
12489          {
12490              return $iri;
12491          }
12492          else
12493          {
12494              return null;
12495          }
12496      }
12497  
12498      /**
12499       * Get the scheme
12500       *
12501       * @access public
12502       * @return string
12503       */
12504  	function get_scheme()
12505      {
12506          return $this->scheme;
12507      }
12508  
12509      /**
12510       * Get the complete authority
12511       *
12512       * @access public
12513       * @return string
12514       */
12515  	function get_authority()
12516      {
12517          $authority = '';
12518          if ($this->userinfo !== null)
12519          {
12520              $authority .= $this->userinfo . '@';
12521          }
12522          if ($this->host !== null)
12523          {
12524              $authority .= $this->host;
12525          }
12526          if ($this->port !== null)
12527          {
12528              $authority .= ':' . $this->port;
12529          }
12530  
12531          if ($authority !== '')
12532          {
12533              return $authority;
12534          }
12535          else
12536          {
12537              return null;
12538          }
12539      }
12540  
12541      /**
12542       * Get the user information
12543       *
12544       * @access public
12545       * @return string
12546       */
12547  	function get_userinfo()
12548      {
12549          return $this->userinfo;
12550      }
12551  
12552      /**
12553       * Get the host
12554       *
12555       * @access public
12556       * @return string
12557       */
12558  	function get_host()
12559      {
12560          return $this->host;
12561      }
12562  
12563      /**
12564       * Get the port
12565       *
12566       * @access public
12567       * @return string
12568       */
12569  	function get_port()
12570      {
12571          return $this->port;
12572      }
12573  
12574      /**
12575       * Get the path
12576       *
12577       * @access public
12578       * @return string
12579       */
12580  	function get_path()
12581      {
12582          return $this->path;
12583      }
12584  
12585      /**
12586       * Get the query
12587       *
12588       * @access public
12589       * @return string
12590       */
12591  	function get_query()
12592      {
12593          return $this->query;
12594      }
12595  
12596      /**
12597       * Get the fragment
12598       *
12599       * @access public
12600       * @return string
12601       */
12602  	function get_fragment()
12603      {
12604          return $this->fragment;
12605      }
12606  }
12607  
12608  /**
12609   * Class to validate and to work with IPv6 addresses.
12610   *
12611   * @package SimplePie
12612   * @copyright 2003-2005 The PHP Group
12613   * @license http://www.opensource.org/licenses/bsd-license.php
12614   * @link http://pear.php.net/package/Net_IPv6
12615   * @author Alexander Merz <alexander.merz@web.de>
12616   * @author elfrink at introweb dot nl
12617   * @author Josh Peck <jmp at joshpeck dot org>
12618   * @author Geoffrey Sneddon <geoffers@gmail.com>
12619   */
12620  class SimplePie_Net_IPv6
12621  {
12622      /**
12623       * Removes a possible existing netmask specification of an IP address.
12624       *
12625       * @param string $ip the (compressed) IP as Hex representation
12626       * @return string the IP the without netmask
12627       * @since 1.1.0
12628       * @access public
12629       * @static
12630       */
12631  	function removeNetmaskSpec($ip)
12632      {
12633          if (strpos($ip, '/') !== false)
12634          {
12635              list($addr, $nm) = explode('/', $ip);
12636          }
12637          else
12638          {
12639              $addr = $ip;
12640          }
12641          return $addr;
12642      }
12643  
12644      /**
12645       * Uncompresses an IPv6 address
12646       *
12647       * RFC 2373 allows you to compress zeros in an address to '::'. This
12648       * function expects an valid IPv6 address and expands the '::' to
12649       * the required zeros.
12650       *
12651       * Example:     FF01::101    ->    FF01:0:0:0:0:0:0:101
12652       *             ::1        ->    0:0:0:0:0:0:0:1
12653       *
12654       * @access public
12655       * @static
12656       * @param string $ip a valid IPv6-address (hex format)
12657       * @return string the uncompressed IPv6-address (hex format)
12658       */
12659  	function Uncompress($ip)
12660      {
12661          $uip = SimplePie_Net_IPv6::removeNetmaskSpec($ip);
12662          $c1 = -1;
12663          $c2 = -1;
12664          if (strpos($ip, '::') !== false)
12665          {
12666              list($ip1, $ip2) = explode('::', $ip);
12667              if ($ip1 === '')
12668              {
12669                  $c1 = -1;
12670              }
12671              else
12672              {
12673                  $pos = 0;
12674                  if (($pos = substr_count($ip1, ':')) > 0)
12675                  {
12676                      $c1 = $pos;
12677                  }
12678                  else
12679                  {
12680                      $c1 = 0;
12681                  }
12682              }
12683              if ($ip2 === '')
12684              {
12685                  $c2 = -1;
12686              }
12687              else
12688              {
12689                  $pos = 0;
12690                  if (($pos = substr_count($ip2, ':')) > 0)
12691                  {
12692                      $c2 = $pos;
12693                  }
12694                  else
12695                  {
12696                      $c2 = 0;
12697                  }
12698              }
12699              if (strstr($ip2, '.'))
12700              {
12701                  $c2++;
12702              }
12703              // ::
12704              if ($c1 === -1 && $c2 === -1)
12705              {
12706                  $uip = '0:0:0:0:0:0:0:0';
12707              }
12708              // ::xxx
12709              else if ($c1 === -1)
12710              {
12711                  $fill = str_repeat('0:', 7 - $c2);
12712                  $uip =    str_replace('::', $fill, $uip);
12713              }
12714              // xxx::
12715              else if ($c2 === -1)
12716              {
12717                  $fill = str_repeat(':0', 7 - $c1);
12718                  $uip =    str_replace('::', $fill, $uip);
12719              }
12720              // xxx::xxx
12721              else
12722              {
12723                  $fill = str_repeat(':0:', 6 - $c2 - $c1);
12724                  $uip =    str_replace('::', $fill, $uip);
12725                  $uip =    str_replace('::', ':', $uip);
12726              }
12727          }
12728          return $uip;
12729      }
12730  
12731      /**
12732       * Splits an IPv6 address into the IPv6 and a possible IPv4 part
12733       *
12734       * RFC 2373 allows you to note the last two parts of an IPv6 address as
12735       * an IPv4 compatible address
12736       *
12737       * Example:     0:0:0:0:0:0:13.1.68.3
12738       *             0:0:0:0:0:FFFF:129.144.52.38
12739       *
12740       * @access public
12741       * @static
12742       * @param string $ip a valid IPv6-address (hex format)
12743       * @return array [0] contains the IPv6 part, [1] the IPv4 part (hex format)
12744       */
12745  	function SplitV64($ip)
12746      {
12747          $ip = SimplePie_Net_IPv6::Uncompress($ip);
12748          if (strstr($ip, '.'))
12749          {
12750              $pos = strrpos($ip, ':');
12751              $ip[$pos] = '_';
12752              $ipPart = explode('_', $ip);
12753              return $ipPart;
12754          }
12755          else
12756          {
12757              return array($ip, '');
12758          }
12759      }
12760  
12761      /**
12762       * Checks an IPv6 address
12763       *
12764       * Checks if the given IP is IPv6-compatible
12765       *
12766       * @access public
12767       * @static
12768       * @param string $ip a valid IPv6-address
12769       * @return bool true if $ip is an IPv6 address
12770       */
12771  	function checkIPv6($ip)
12772      {
12773          $ipPart = SimplePie_Net_IPv6::SplitV64($ip);
12774          $count = 0;
12775          if (!empty($ipPart[0]))
12776          {
12777              $ipv6 = explode(':', $ipPart[0]);
12778              for ($i = 0; $i < count($ipv6); $i++)
12779              {
12780                  $dec = hexdec($ipv6[$i]);
12781                  $hex = strtoupper(preg_replace('/^[0]{1,3}(.*[0-9a-fA-F])$/', '\\1', $ipv6[$i]));
12782                  if ($ipv6[$i] >= 0 && $dec <= 65535 && $hex === strtoupper(dechex($dec)))
12783                  {
12784                      $count++;
12785                  }
12786              }
12787              if ($count === 8)
12788              {
12789                  return true;
12790              }
12791              elseif ($count === 6 && !empty($ipPart[1]))
12792              {
12793                  $ipv4 = explode('.', $ipPart[1]);
12794                  $count = 0;
12795                  foreach ($ipv4 as $ipv4_part)
12796                  {
12797                      if ($ipv4_part >= 0 && $ipv4_part <= 255 && preg_match('/^\d{1,3}$/', $ipv4_part))
12798                      {
12799                          $count++;
12800                      }
12801                  }
12802                  if ($count === 4)
12803                  {
12804                      return true;
12805                  }
12806              }
12807              else
12808              {
12809                  return false;
12810              }
12811  
12812          }
12813          else
12814          {
12815              return false;
12816          }
12817      }
12818  }
12819  
12820  /**
12821   * Date Parser
12822   *
12823   * @package SimplePie
12824   */
12825  class SimplePie_Parse_Date
12826  {
12827      /**
12828       * Input data
12829       *
12830       * @access protected
12831       * @var string
12832       */
12833      var $date;
12834  
12835      /**
12836       * List of days, calendar day name => ordinal day number in the week
12837       *
12838       * @access protected
12839       * @var array
12840       */
12841      var $day = array(
12842          // English
12843          'mon' => 1,
12844          'monday' => 1,
12845          'tue' => 2,
12846          'tuesday' => 2,
12847          'wed' => 3,
12848          'wednesday' => 3,
12849          'thu' => 4,
12850          'thursday' => 4,
12851          'fri' => 5,
12852          'friday' => 5,
12853          'sat' => 6,
12854          'saturday' => 6,
12855          'sun' => 7,
12856          'sunday' => 7,
12857          // Dutch
12858          'maandag' => 1,
12859          'dinsdag' => 2,
12860          'woensdag' => 3,
12861          'donderdag' => 4,
12862          'vrijdag' => 5,
12863          'zaterdag' => 6,
12864          'zondag' => 7,
12865          // French
12866          'lundi' => 1,
12867          'mardi' => 2,
12868          'mercredi' => 3,
12869          'jeudi' => 4,
12870          'vendredi' => 5,
12871          'samedi' => 6,
12872          'dimanche' => 7,
12873          // German
12874          'montag' => 1,
12875          'dienstag' => 2,
12876          'mittwoch' => 3,
12877          'donnerstag' => 4,
12878          'freitag' => 5,
12879          'samstag' => 6,
12880          'sonnabend' => 6,
12881          'sonntag' => 7,
12882          // Italian
12883          'lunedì' => 1,
12884          'martedì' => 2,
12885          'mercoledì' => 3,
12886          'giovedì' => 4,
12887          'venerdì' => 5,
12888          'sabato' => 6,
12889          'domenica' => 7,
12890          // Spanish
12891          'lunes' => 1,
12892          'martes' => 2,
12893          'miércoles' => 3,
12894          'jueves' => 4,
12895          'viernes' => 5,
12896          'sábado' => 6,
12897          'domingo' => 7,
12898          // Finnish
12899          'maanantai' => 1,
12900          'tiistai' => 2,
12901          'keskiviikko' => 3,
12902          'torstai' => 4,
12903          'perjantai' => 5,
12904          'lauantai' => 6,
12905          'sunnuntai' => 7,
12906          // Hungarian
12907          'hétfő' => 1,
12908          'kedd' => 2,
12909          'szerda' => 3,
12910          'csütörtok' => 4,
12911          'péntek' => 5,
12912          'szombat' => 6,
12913          'vasárnap' => 7,
12914          // Greek
12915          'Δευ' => 1,
12916          'Τρι' => 2,
12917          'Τετ' => 3,
12918          'Πεμ' => 4,
12919          'Παρ' => 5,
12920          'Σαβ' => 6,
12921          'Κυρ' => 7,
12922      );
12923  
12924      /**
12925       * List of months, calendar month name => calendar month number
12926       *
12927       * @access protected
12928       * @var array
12929       */
12930      var $month = array(
12931          // English
12932          'jan' => 1,
12933          'january' => 1,
12934          'feb' => 2,
12935          'february' => 2,
12936          'mar' => 3,
12937          'march' => 3,
12938          'apr' => 4,
12939          'april' => 4,
12940          'may' => 5,
12941          // No long form of May
12942          'jun' => 6,
12943          'june' => 6,
12944          'jul' => 7,
12945          'july' => 7,
12946          'aug' => 8,
12947          'august' => 8,
12948          'sep' => 9,
12949          'september' => 8,
12950          'oct' => 10,
12951          'october' => 10,
12952          'nov' => 11,
12953          'november' => 11,
12954          'dec' => 12,
12955          'december' => 12,
12956          // Dutch
12957          'januari' => 1,
12958          'februari' => 2,
12959          'maart' => 3,
12960          'april' => 4,
12961          'mei' => 5,
12962          'juni' => 6,
12963          'juli' => 7,
12964          'augustus' => 8,
12965          'september' => 9,
12966          'oktober' => 10,
12967          'november' => 11,
12968          'december' => 12,
12969          // French
12970          'janvier' => 1,
12971          'février' => 2,
12972          'mars' => 3,
12973          'avril' => 4,
12974          'mai' => 5,
12975          'juin' => 6,
12976          'juillet' => 7,
12977          'août' => 8,
12978          'septembre' => 9,
12979          'octobre' => 10,
12980          'novembre' => 11,
12981          'décembre' => 12,
12982          // German
12983          'januar' => 1,
12984          'februar' => 2,
12985          'märz' => 3,
12986          'april' => 4,
12987          'mai' => 5,
12988          'juni' => 6,
12989          'juli' => 7,
12990          'august' => 8,
12991          'september' => 9,
12992          'oktober' => 10,
12993          'november' => 11,
12994          'dezember' => 12,
12995          // Italian
12996          'gennaio' => 1,
12997          'febbraio' => 2,
12998          'marzo' => 3,
12999          'aprile' => 4,
13000          'maggio' => 5,
13001          'giugno' => 6,
13002          'luglio' => 7,
13003          'agosto' => 8,
13004          'settembre' => 9,
13005          'ottobre' => 10,
13006          'novembre' => 11,
13007          'dicembre' => 12,
13008          // Spanish
13009          'enero' => 1,
13010          'febrero' => 2,
13011          'marzo' => 3,
13012          'abril' => 4,
13013          'mayo' => 5,
13014          'junio' => 6,
13015          'julio' => 7,
13016          'agosto' => 8,
13017          'septiembre' => 9,
13018          'setiembre' => 9,
13019          'octubre' => 10,
13020          'noviembre' => 11,
13021          'diciembre' => 12,
13022          // Finnish
13023          'tammikuu' => 1,
13024          'helmikuu' => 2,
13025          'maaliskuu' => 3,
13026          'huhtikuu' => 4,
13027          'toukokuu' => 5,
13028          'kesäkuu' => 6,
13029          'heinäkuu' => 7,
13030          'elokuu' => 8,
13031          'suuskuu' => 9,
13032          'lokakuu' => 10,
13033          'marras' => 11,
13034          'joulukuu' => 12,
13035          // Hungarian
13036          'január' => 1,
13037          'február' => 2,
13038          'március' => 3,
13039          'április' => 4,
13040          'május' => 5,
13041          'június' => 6,
13042          'július' => 7,
13043          'augusztus' => 8,
13044          'szeptember' => 9,
13045          'október' => 10,
13046          'november' => 11,
13047          'december' => 12,
13048          // Greek
13049          'Ιαν' => 1,
13050          'Φεβ' => 2,
13051          'Μάώ' => 3,
13052          'Μαώ' => 3,
13053          'Απρ' => 4,
13054          'Μάι' => 5,
13055          'Μαϊ' => 5,
13056          'Μαι' => 5,
13057          'Ιούν' => 6,
13058          'Ιον' => 6,
13059          'Ιούλ' => 7,
13060          'Ιολ' => 7,
13061          'Αύγ' => 8,
13062          'Αυγ' => 8,
13063          'Σεπ' => 9,
13064          'Οκτ' => 10,
13065          'Νοέ' => 11,
13066          'Δεκ' => 12,
13067      );
13068  
13069      /**
13070       * List of timezones, abbreviation => offset from UTC
13071       *
13072       * @access protected
13073       * @var array
13074       */
13075      var $timezone = array(
13076          'ACDT' => 37800,
13077          'ACIT' => 28800,
13078          'ACST' => 34200,
13079          'ACT' => -18000,
13080          'ACWDT' => 35100,
13081          'ACWST' => 31500,
13082          'AEDT' => 39600,
13083          'AEST' => 36000,
13084          'AFT' => 16200,
13085          'AKDT' => -28800,
13086          'AKST' => -32400,
13087          'AMDT' => 18000,
13088          'AMT' => -14400,
13089          'ANAST' => 46800,
13090          'ANAT' => 43200,
13091          'ART' => -10800,
13092          'AZOST' => -3600,
13093          'AZST' => 18000,
13094          'AZT' => 14400,
13095          'BIOT' => 21600,
13096          'BIT' => -43200,
13097          'BOT' => -14400,
13098          'BRST' => -7200,
13099          'BRT' => -10800,
13100          'BST' => 3600,
13101          'BTT' => 21600,
13102          'CAST' => 18000,
13103          'CAT' => 7200,
13104          'CCT' => 23400,
13105          'CDT' => -18000,
13106          'CEDT' => 7200,
13107          'CET' => 3600,
13108          'CGST' => -7200,
13109          'CGT' => -10800,
13110          'CHADT' => 49500,
13111          'CHAST' => 45900,
13112          'CIST' => -28800,
13113          'CKT' => -36000,
13114          'CLDT' => -10800,
13115          'CLST' => -14400,
13116          'COT' => -18000,
13117          'CST' => -21600,
13118          'CVT' => -3600,
13119          'CXT' => 25200,
13120          'DAVT' => 25200,
13121          'DTAT' => 36000,
13122          'EADT' => -18000,
13123          'EAST' => -21600,
13124          'EAT' => 10800,
13125          'ECT' => -18000,
13126          'EDT' => -14400,
13127          'EEST' => 10800,
13128          'EET' => 7200,
13129          'EGT' => -3600,
13130          'EKST' => 21600,
13131          'EST' => -18000,
13132          'FJT' => 43200,
13133          'FKDT' => -10800,
13134          'FKST' => -14400,
13135          'FNT' => -7200,
13136          'GALT' => -21600,
13137          'GEDT' => 14400,
13138          'GEST' => 10800,
13139          'GFT' => -10800,
13140          'GILT' => 43200,
13141          'GIT' => -32400,
13142          'GST' => 14400,
13143          'GST' => -7200,
13144          'GYT' => -14400,
13145          'HAA' => -10800,
13146          'HAC' => -18000,
13147          'HADT' => -32400,
13148          'HAE' => -14400,
13149          'HAP' => -25200,
13150          'HAR' => -21600,
13151          'HAST' => -36000,
13152          'HAT' => -9000,
13153          'HAY' => -28800,
13154          'HKST' => 28800,
13155          'HMT' => 18000,
13156          'HNA' => -14400,
13157          'HNC' => -21600,
13158          'HNE' => -18000,
13159          'HNP' => -28800,
13160          'HNR' => -25200,
13161          'HNT' => -12600,
13162          'HNY' => -32400,
13163          'IRDT' => 16200,
13164          'IRKST' => 32400,
13165          'IRKT' => 28800,
13166          'IRST' => 12600,
13167          'JFDT' => -10800,
13168          'JFST' => -14400,
13169          'JST' => 32400,
13170          'KGST' => 21600,
13171          'KGT' => 18000,
13172          'KOST' => 39600,
13173          'KOVST' => 28800,
13174          'KOVT' => 25200,
13175          'KRAST' => 28800,
13176          'KRAT' => 25200,
13177          'KST' => 32400,
13178          'LHDT' => 39600,
13179          'LHST' => 37800,
13180          'LINT' => 50400,
13181          'LKT' => 21600,
13182          'MAGST' => 43200,
13183          'MAGT' => 39600,
13184          'MAWT' => 21600,
13185          'MDT' => -21600,
13186          'MESZ' => 7200,
13187          'MEZ' => 3600,
13188          'MHT' => 43200,
13189          'MIT' => -34200,
13190          'MNST' => 32400,
13191          'MSDT' => 14400,
13192          'MSST' => 10800,
13193          'MST' => -25200,
13194          'MUT' => 14400,
13195          'MVT' => 18000,
13196          'MYT' => 28800,
13197          'NCT' => 39600,
13198          'NDT' => -9000,
13199          'NFT' => 41400,
13200          'NMIT' => 36000,
13201          'NOVST' => 25200,
13202          'NOVT' => 21600,
13203          'NPT' => 20700,
13204          'NRT' => 43200,
13205          'NST' => -12600,
13206          'NUT' => -39600,
13207          'NZDT' => 46800,
13208          'NZST' => 43200,
13209          'OMSST' => 25200,
13210          'OMST' => 21600,
13211          'PDT' => -25200,
13212          'PET' => -18000,
13213          'PETST' => 46800,
13214          'PETT' => 43200,
13215          'PGT' => 36000,
13216          'PHOT' => 46800,
13217          'PHT' => 28800,
13218          'PKT' => 18000,
13219          'PMDT' => -7200,
13220          'PMST' => -10800,
13221          'PONT' => 39600,
13222          'PST' => -28800,
13223          'PWT' => 32400,
13224          'PYST' => -10800,
13225          'PYT' => -14400,
13226          'RET' => 14400,
13227          'ROTT' => -10800,
13228          'SAMST' => 18000,
13229          'SAMT' => 14400,
13230          'SAST' => 7200,
13231          'SBT' => 39600,
13232          'SCDT' => 46800,
13233          'SCST' => 43200,
13234          'SCT' => 14400,
13235          'SEST' => 3600,
13236          'SGT' => 28800,
13237          'SIT' => 28800,
13238          'SRT' => -10800,
13239          'SST' => -39600,
13240          'SYST' => 10800,
13241          'SYT' => 7200,
13242          'TFT' => 18000,
13243          'THAT' => -36000,
13244          'TJT' => 18000,
13245          'TKT' => -36000,
13246          'TMT' => 18000,
13247          'TOT' => 46800,
13248          'TPT' => 32400,
13249          'TRUT' => 36000,
13250          'TVT' => 43200,
13251          'TWT' => 28800,
13252          'UYST' => -7200,
13253          'UYT' => -10800,
13254          'UZT' => 18000,
13255          'VET' => -14400,
13256          'VLAST' => 39600,
13257          'VLAT' => 36000,
13258          'VOST' => 21600,
13259          'VUT' => 39600,
13260          'WAST' => 7200,
13261          'WAT' => 3600,
13262          'WDT' => 32400,
13263          'WEST' => 3600,
13264          'WFT' => 43200,
13265          'WIB' => 25200,
13266          'WIT' => 32400,
13267          'WITA' => 28800,
13268          'WKST' => 18000,
13269          'WST' => 28800,
13270          'YAKST' => 36000,
13271          'YAKT' => 32400,
13272          'YAPT' => 36000,
13273          'YEKST' => 21600,
13274          'YEKT' => 18000,
13275      );
13276  
13277      /**
13278       * Cached PCRE for SimplePie_Parse_Date::$day
13279       *
13280       * @access protected
13281       * @var string
13282       */
13283      var $day_pcre;
13284  
13285      /**
13286       * Cached PCRE for SimplePie_Parse_Date::$month
13287       *
13288       * @access protected
13289       * @var string
13290       */
13291      var $month_pcre;
13292  
13293      /**
13294       * Array of user-added callback methods
13295       *
13296       * @access private
13297       * @var array
13298       */
13299      var $built_in = array();
13300  
13301      /**
13302       * Array of user-added callback methods
13303       *
13304       * @access private
13305       * @var array
13306       */
13307      var $user = array();
13308  
13309      /**
13310       * Create new SimplePie_Parse_Date object, and set self::day_pcre,
13311       * self::month_pcre, and self::built_in
13312       *
13313       * @access private
13314       */
13315  	function SimplePie_Parse_Date()
13316      {
13317          $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')';
13318          $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')';
13319  
13320          static $cache;
13321          if (!isset($cache[get_class($this)]))
13322          {
13323              $all_methods = get_class_methods($this);
13324  
13325              foreach ($all_methods as $method)
13326              {
13327                  if (strtolower(substr($method, 0, 5)) === 'date_')
13328                  {
13329                      $cache[get_class($this)][] = $method;
13330                  }
13331              }
13332          }
13333  
13334          foreach ($cache[get_class($this)] as $method)
13335          {
13336              $this->built_in[] = $method;
13337          }
13338      }
13339  
13340      /**
13341       * Get the object
13342       *
13343       * @access public
13344       */
13345  	function get()
13346      {
13347          static $object;
13348          if (!$object)
13349          {
13350              $object =& new SimplePie_Parse_Date;
13351          }
13352          return $object;
13353      }
13354  
13355      /**
13356       * Parse a date
13357       *
13358       * @final
13359       * @access public
13360       * @param string $date Date to parse
13361       * @return int Timestamp corresponding to date string, or false on failure
13362       */
13363  	function parse($date)
13364      {
13365          foreach ($this->user as $method)
13366          {
13367              if (($returned = call_user_func($method, $date)) !== false)
13368              {
13369                  return $returned;
13370              }
13371          }
13372  
13373          foreach ($this->built_in as $method)
13374          {
13375              if (($returned = call_user_func(array(&$this, $method), $date)) !== false)
13376              {
13377                  return $returned;
13378              }
13379          }
13380  
13381          return false;
13382      }
13383  
13384      /**
13385       * Add a callback method to parse a date
13386       *
13387       * @final
13388       * @access public
13389       * @param callback $callback
13390       */
13391  	function add_callback($callback)
13392      {
13393          if (is_callable($callback))
13394          {
13395              $this->user[] = $callback;
13396          }
13397          else
13398          {
13399              trigger_error('User-supplied function must be a valid callback', E_USER_WARNING);
13400          }
13401      }
13402  
13403      /**
13404       * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as
13405       * well as allowing any of upper or lower case "T", horizontal tabs, or
13406       * spaces to be used as the time seperator (including more than one))
13407       *
13408       * @access protected
13409       * @return int Timestamp
13410       */
13411  	function date_w3cdtf($date)
13412      {
13413          static $pcre;
13414          if (!$pcre)
13415          {
13416              $year = '([0-9]{4})';
13417              $month = $day = $hour = $minute = $second = '([0-9]{2})';
13418              $decimal = '([0-9]*)';
13419              $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))';
13420              $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/';
13421          }
13422          if (preg_match($pcre, $date, $match))
13423          {
13424              /*
13425              Capturing subpatterns:
13426              1: Year
13427              2: Month
13428              3: Day
13429              4: Hour
13430              5: Minute
13431              6: Second
13432              7: Decimal fraction of a second
13433              8: Zulu
13434              9: Timezone ±
13435              10: Timezone hours
13436              11: Timezone minutes
13437              */
13438  
13439              // Fill in empty matches
13440              for ($i = count($match); $i <= 3; $i++)
13441              {
13442                  $match[$i] = '1';
13443              }
13444  
13445              for ($i = count($match); $i <= 7; $i++)
13446              {
13447                  $match[$i] = '0';
13448              }
13449  
13450              // Numeric timezone
13451              if (isset($match[9]) && $match[9] !== '')
13452              {
13453                  $timezone = $match[10] * 3600;
13454                  $timezone += $match[11] * 60;
13455                  if ($match[9] === '-')
13456                  {
13457                      $timezone = 0 - $timezone;
13458                  }
13459              }
13460              else
13461              {
13462                  $timezone = 0;
13463              }
13464  
13465              // Convert the number of seconds to an integer, taking decimals into account
13466              $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
13467  
13468              return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
13469          }
13470          else
13471          {
13472              return false;
13473          }
13474      }
13475  
13476      /**
13477       * Remove RFC822 comments
13478       *
13479       * @access protected
13480       * @param string $data Data to strip comments from
13481       * @return string Comment stripped string
13482       */
13483  	function remove_rfc2822_comments($string)
13484      {
13485          $string = (string) $string;
13486          $position = 0;
13487          $length = strlen($string);
13488          $depth = 0;
13489  
13490          $output = '';
13491  
13492          while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
13493          {
13494              $output .= substr($string, $position, $pos - $position);
13495              $position = $pos + 1;
13496              if ($string[$pos - 1] !== '\\')
13497              {
13498                  $depth++;
13499                  while ($depth && $position < $length)
13500                  {
13501                      $position += strcspn($string, '()', $position);
13502                      if ($string[$position - 1] === '\\')
13503                      {
13504                          $position++;
13505                          continue;
13506                      }
13507                      elseif (isset($string[$position]))
13508                      {
13509                          switch ($string[$position])
13510                          {
13511                              case '(':
13512                                  $depth++;
13513                                  break;
13514  
13515                              case ')':
13516                                  $depth--;
13517                                  break;
13518                          }
13519                          $position++;
13520                      }
13521                      else
13522                      {
13523                          break;
13524                      }
13525                  }
13526              }
13527              else
13528              {
13529                  $output .= '(';
13530              }
13531          }
13532          $output .= substr($string, $position);
13533  
13534          return $output;
13535      }
13536  
13537      /**
13538       * Parse RFC2822's date format
13539       *
13540       * @access protected
13541       * @return int Timestamp
13542       */
13543  	function date_rfc2822($date)
13544      {
13545          static $pcre;
13546          if (!$pcre)
13547          {
13548              $wsp = '[\x09\x20]';
13549              $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)';
13550              $optional_fws = $fws . '?';
13551              $day_name = $this->day_pcre;
13552              $month = $this->month_pcre;
13553              $day = '([0-9]{1,2})';
13554              $hour = $minute = $second = '([0-9]{2})';
13555              $year = '([0-9]{2,4})';
13556              $num_zone = '([+\-])([0-9]{2})([0-9]{2})';
13557              $character_zone = '([A-Z]{1,5})';
13558              $zone = '(?:' . $num_zone . '|' . $character_zone . ')';
13559              $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i';
13560          }
13561          if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))
13562          {
13563              /*
13564              Capturing subpatterns:
13565              1: Day name
13566              2: Day
13567              3: Month
13568              4: Year
13569              5: Hour
13570              6: Minute
13571              7: Second
13572              8: Timezone ±
13573              9: Timezone hours
13574              10: Timezone minutes
13575              11: Alphabetic timezone
13576              */
13577  
13578              // Find the month number
13579              $month = $this->month[strtolower($match[3])];
13580  
13581              // Numeric timezone
13582              if ($match[8] !== '')
13583              {
13584                  $timezone = $match[9] * 3600;
13585                  $timezone += $match[10] * 60;
13586                  if ($match[8] === '-')
13587                  {
13588                      $timezone = 0 - $timezone;
13589                  }
13590              }
13591              // Character timezone
13592              elseif (isset($this->timezone[strtoupper($match[11])]))
13593              {
13594                  $timezone = $this->timezone[strtoupper($match[11])];
13595              }
13596              // Assume everything else to be -0000
13597              else
13598              {
13599                  $timezone = 0;
13600              }
13601  
13602              // Deal with 2/3 digit years
13603              if ($match[4] < 50)
13604              {
13605                  $match[4] += 2000;
13606              }
13607              elseif ($match[4] < 1000)
13608              {
13609                  $match[4] += 1900;
13610              }
13611  
13612              // Second is optional, if it is empty set it to zero
13613              if ($match[7] !== '')
13614              {
13615                  $second = $match[7];
13616              }
13617              else
13618              {
13619                  $second = 0;
13620              }
13621  
13622              return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;
13623          }
13624          else
13625          {
13626              return false;
13627          }
13628      }
13629  
13630      /**
13631       * Parse RFC850's date format
13632       *
13633       * @access protected
13634       * @return int Timestamp
13635       */
13636  	function date_rfc850($date)
13637      {
13638          static $pcre;
13639          if (!$pcre)
13640          {
13641              $space = '[\x09\x20]+';
13642              $day_name = $this->day_pcre;
13643              $month = $this->month_pcre;
13644              $day = '([0-9]{1,2})';
13645              $year = $hour = $minute = $second = '([0-9]{2})';
13646              $zone = '([A-Z]{1,5})';
13647              $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i';
13648          }
13649          if (preg_match($pcre, $date, $match))
13650          {
13651              /*
13652              Capturing subpatterns:
13653              1: Day name
13654              2: Day
13655              3: Month
13656              4: Year
13657              5: Hour
13658              6: Minute
13659              7: Second
13660              8: Timezone
13661              */
13662  
13663              // Month
13664              $month = $this->month[strtolower($match[3])];
13665  
13666              // Character timezone
13667              if (isset($this->timezone[strtoupper($match[8])]))
13668              {
13669                  $timezone = $this->timezone[strtoupper($match[8])];
13670              }
13671              // Assume everything else to be -0000
13672              else
13673              {
13674                  $timezone = 0;
13675              }
13676  
13677              // Deal with 2 digit year
13678              if ($match[4] < 50)
13679              {
13680                  $match[4] += 2000;
13681              }
13682              else
13683              {
13684                  $match[4] += 1900;
13685              }
13686  
13687              return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;
13688          }
13689          else
13690          {
13691              return false;
13692          }
13693      }
13694  
13695      /**
13696       * Parse C99's asctime()'s date format
13697       *
13698       * @access protected
13699       * @return int Timestamp
13700       */
13701  	function date_asctime($date)
13702      {
13703          static $pcre;
13704          if (!$pcre)
13705          {
13706              $space = '[\x09\x20]+';
13707              $wday_name = $this->day_pcre;
13708              $mon_name = $this->month_pcre;
13709              $day = '([0-9]{1,2})';
13710              $hour = $sec = $min = '([0-9]{2})';
13711              $year = '([0-9]{4})';
13712              $terminator = '\x0A?\x00?';
13713              $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';
13714          }
13715          if (preg_match($pcre, $date, $match))
13716          {
13717              /*
13718              Capturing subpatterns:
13719              1: Day name
13720              2: Month
13721              3: Day
13722              4: Hour
13723              5: Minute
13724              6: Second
13725              7: Year
13726              */
13727  
13728              $month = $this->month[strtolower($match[2])];
13729              return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);
13730          }
13731          else
13732          {
13733              return false;
13734          }
13735      }
13736  
13737      /**
13738       * Parse dates using strtotime()
13739       *
13740       * @access protected
13741       * @return int Timestamp
13742       */
13743  	function date_strtotime($date)
13744      {
13745          $strtotime = strtotime($date);
13746          if ($strtotime === -1 || $strtotime === false)
13747          {
13748              return false;
13749          }
13750          else
13751          {
13752              return $strtotime;
13753          }
13754      }
13755  }
13756  
13757  /**
13758   * Content-type sniffing
13759   *
13760   * @package SimplePie
13761   */
13762  class SimplePie_Content_Type_Sniffer
13763  {
13764      /**
13765       * File object
13766       *
13767       * @var SimplePie_File
13768       * @access private
13769       */
13770      var $file;
13771  
13772      /**
13773       * Create an instance of the class with the input file
13774       *
13775       * @access public
13776       * @param SimplePie_Content_Type_Sniffer $file Input file
13777       */
13778  	function SimplePie_Content_Type_Sniffer($file)
13779      {
13780          $this->file = $file;
13781      }
13782  
13783      /**
13784       * Get the Content-Type of the specified file
13785       *
13786       * @access public
13787       * @return string Actual Content-Type
13788       */
13789  	function get_type()
13790      {
13791          if (isset($this->file->headers['content-type']))
13792          {
13793              if (!isset($this->file->headers['content-encoding'])
13794                  && ($this->file->headers['content-type'] === 'text/plain'
13795                      || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1'
13796                      || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1'))
13797              {
13798                  return $this->text_or_binary();
13799              }
13800  
13801              if (($pos = strpos($this->file->headers['content-type'], ';')) !== false)
13802              {
13803                  $official = substr($this->file->headers['content-type'], 0, $pos);
13804              }
13805              else
13806              {
13807                  $official = $this->file->headers['content-type'];
13808              }
13809              $official = strtolower($official);
13810  
13811              if ($official === 'unknown/unknown'
13812                  || $official === 'application/unknown')
13813              {
13814                  return $this->unknown();
13815              }
13816              elseif (substr($official, -4) === '+xml'
13817                  || $official === 'text/xml'
13818                  || $official === 'application/xml')
13819              {
13820                  return $official;
13821              }
13822              elseif (substr($official, 0, 6) === 'image/')
13823              {
13824                  if ($return = $this->image())
13825                  {
13826                      return $return;
13827                  }
13828                  else
13829                  {
13830                      return $official;
13831                  }
13832              }
13833              elseif ($official === 'text/html')
13834              {
13835                  return $this->feed_or_html();
13836              }
13837              else
13838              {
13839                  return $official;
13840              }
13841          }
13842          else
13843          {
13844              return $this->unknown();
13845          }
13846      }
13847  
13848      /**
13849       * Sniff text or binary
13850       *
13851       * @access private
13852       * @return string Actual Content-Type
13853       */
13854  	function text_or_binary()
13855      {
13856          if (substr($this->file->body, 0, 2) === "\xFE\xFF"
13857              || substr($this->file->body, 0, 2) === "\xFF\xFE"
13858              || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF"
13859              || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF")
13860          {
13861              return 'text/plain';
13862          }
13863          elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body))
13864          {
13865              return 'application/octect-stream';
13866          }
13867          else
13868          {
13869              return 'text/plain';
13870          }
13871      }
13872  
13873      /**
13874       * Sniff unknown
13875       *
13876       * @access private
13877       * @return string Actual Content-Type
13878       */
13879  	function unknown()
13880      {
13881          $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20");
13882          if (strtolower(substr($this->file->body, $ws, 14)) === '<!doctype html'
13883              || strtolower(substr($this->file->body, $ws, 5)) === '<html'
13884              || strtolower(substr($this->file->body, $ws, 7)) === '<script')
13885          {
13886              return 'text/html';
13887          }
13888          elseif (substr($this->file->body, 0, 5) === '%PDF-')
13889          {
13890              return 'application/pdf';
13891          }
13892          elseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-')
13893          {
13894              return 'application/postscript';
13895          }
13896          elseif (substr($this->file->body, 0, 6) === 'GIF87a'
13897              || substr($this->file->body, 0, 6) === 'GIF89a')
13898          {
13899              return 'image/gif';
13900          }
13901          elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
13902          {
13903              return 'image/png';
13904          }
13905          elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF")
13906          {
13907              return 'image/jpeg';
13908          }
13909          elseif (substr($this->file->body, 0, 2) === "\x42\x4D")
13910          {
13911              return 'image/bmp';
13912          }
13913          else
13914          {
13915              return $this->text_or_binary();
13916          }
13917      }
13918  
13919      /**
13920       * Sniff images
13921       *
13922       * @access private
13923       * @return string Actual Content-Type
13924       */
13925  	function image()
13926      {
13927          if (substr($this->file->body, 0, 6) === 'GIF87a'
13928              || substr($this->file->body, 0, 6) === 'GIF89a')
13929          {
13930              return 'image/gif';
13931          }
13932          elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
13933          {
13934              return 'image/png';
13935          }
13936          elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF")
13937          {
13938              return 'image/jpeg';
13939          }
13940          elseif (substr($this->file->body, 0, 2) === "\x42\x4D")
13941          {
13942              return 'image/bmp';
13943          }
13944          else
13945          {
13946              return false;
13947          }
13948      }
13949  
13950      /**
13951       * Sniff HTML
13952       *
13953       * @access private
13954       * @return string Actual Content-Type
13955       */
13956  	function feed_or_html()
13957      {
13958          $len = strlen($this->file->body);
13959          $pos = strspn($this->file->body, "\x09\x0A\x0D\x20");
13960  
13961          while ($pos < $len)
13962          {
13963              switch ($this->file->body[$pos])
13964              {
13965                  case "\x09":
13966                  case "\x0A":
13967                  case "\x0D":
13968                  case "\x20":
13969                      $pos += strspn($this->file->body, "\x09\x0A\x0D\x20", $pos);
13970                      continue 2;
13971  
13972                  case '<':
13973                      $pos++;
13974                      break;
13975  
13976                  default:
13977                      return 'text/html';
13978              }
13979  
13980              if (substr($this->file->body, $pos, 3) === '!--')
13981              {
13982                  $pos += 3;
13983                  if ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false)
13984                  {
13985                      $pos += 3;
13986                  }
13987                  else
13988                  {
13989                      return 'text/html';
13990                  }
13991              }
13992              elseif (substr($this->file->body, $pos, 1) === '!')
13993              {
13994                  if ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false)
13995                  {
13996                      $pos++;
13997                  }
13998                  else
13999                  {
14000                      return 'text/html';
14001                  }
14002              }
14003              elseif (substr($this->file->body, $pos, 1) === '?')
14004              {
14005                  if ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false)
14006                  {
14007                      $pos += 2;
14008                  }
14009                  else
14010                  {
14011                      return 'text/html';
14012                  }
14013              }
14014              elseif (substr($this->file->body, $pos, 3) === 'rss'
14015                  || substr($this->file->body, $pos, 7) === 'rdf:RDF')
14016              {
14017                  return 'application/rss+xml';
14018              }
14019              elseif (substr($this->file->body, $pos, 4) === 'feed')
14020              {
14021                  return 'application/atom+xml';
14022              }
14023              else
14024              {
14025                  return 'text/html';
14026              }
14027          }
14028  
14029          return 'text/html';
14030      }
14031  }
14032  
14033  /**
14034   * Parses the XML Declaration
14035   *
14036   * @package SimplePie
14037   */
14038  class SimplePie_XML_Declaration_Parser
14039  {
14040      /**
14041       * XML Version
14042       *
14043       * @access public
14044       * @var string
14045       */
14046      var $version = '1.0';
14047  
14048      /**
14049       * Encoding
14050       *
14051       * @access public
14052       * @var string
14053       */
14054      var $encoding = 'UTF-8';
14055  
14056      /**
14057       * Standalone
14058       *
14059       * @access public
14060       * @var bool
14061       */
14062      var $standalone = false;
14063  
14064      /**
14065       * Current state of the state machine
14066       *
14067       * @access private
14068       * @var string
14069       */
14070      var $state = 'before_version_name';
14071  
14072      /**
14073       * Input data
14074       *
14075       * @access private
14076       * @var string
14077       */
14078      var $data = '';
14079  
14080      /**
14081       * Input data length (to avoid calling strlen() everytime this is needed)
14082       *
14083       * @access private
14084       * @var int
14085       */
14086      var $data_length = 0;
14087  
14088      /**
14089       * Current position of the pointer
14090       *
14091       * @var int
14092       * @access private
14093       */
14094      var $position = 0;
14095  
14096      /**
14097       * Create an instance of the class with the input data
14098       *
14099       * @access public
14100       * @param string $data Input data
14101       */
14102  	function SimplePie_XML_Declaration_Parser($data)
14103      {
14104          $this->data = $data;
14105          $this->data_length = strlen($this->data);
14106      }
14107  
14108      /**
14109       * Parse the input data
14110       *
14111       * @access public
14112       * @return bool true on success, false on failure
14113       */
14114  	function parse()
14115      {
14116          while ($this->state && $this->state !== 'emit' && $this->has_data())
14117          {
14118              $state = $this->state;
14119              $this->$state();
14120          }
14121          $this->data = '';
14122          if ($this->state === 'emit')
14123          {
14124              return true;
14125          }
14126          else
14127          {
14128              $this->version = '';
14129              $this->encoding = '';
14130              $this->standalone = '';
14131              return false;
14132          }
14133      }
14134  
14135      /**
14136       * Check whether there is data beyond the pointer
14137       *
14138       * @access private
14139       * @return bool true if there is further data, false if not
14140       */
14141  	function has_data()
14142      {
14143          return (bool) ($this->position < $this->data_length);
14144      }
14145  
14146      /**
14147       * Advance past any whitespace
14148       *
14149       * @return int Number of whitespace characters passed
14150       */
14151  	function skip_whitespace()
14152      {
14153          $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position);
14154          $this->position += $whitespace;
14155          return $whitespace;
14156      }
14157  
14158      /**
14159       * Read value
14160       */
14161  	function get_value()
14162      {
14163          $quote = substr($this->data, $this->position, 1);
14164          if ($quote === '"' || $quote === "'")
14165          {
14166              $this->position++;
14167              $len = strcspn($this->data, $quote, $this->position);
14168              if ($this->has_data())
14169              {
14170                  $value = substr($this->data, $this->position, $len);
14171                  $this->position += $len + 1;
14172                  return $value;
14173              }
14174          }
14175          return false;
14176      }
14177  
14178  	function before_version_name()
14179      {
14180          if ($this->skip_whitespace())
14181          {
14182              $this->state = 'version_name';
14183          }
14184          else
14185          {
14186              $this->state = false;
14187          }
14188      }
14189  
14190  	function version_name()
14191      {
14192          if (substr($this->data, $this->position, 7) === 'version')
14193          {
14194              $this->position += 7;
14195              $this->skip_whitespace();
14196              $this->state = 'version_equals';
14197          }
14198          else
14199          {
14200              $this->state = false;
14201          }
14202      }
14203  
14204  	function version_equals()
14205      {
14206          if (substr($this->data, $this->position, 1) === '=')
14207          {
14208              $this->position++;
14209              $this->skip_whitespace();
14210              $this->state = 'version_value';
14211          }
14212          else
14213          {
14214              $this->state = false;
14215          }
14216      }
14217  
14218  	function version_value()
14219      {
14220          if ($this->version = $this->get_value())
14221          {
14222              $this->skip_whitespace();
14223              if ($this->has_data())
14224              {
14225                  $this->state = 'encoding_name';
14226              }
14227              else
14228              {
14229                  $this->state = 'emit';
14230              }
14231          }
14232          else
14233          {
14234              $this->state = false;
14235          }
14236      }
14237  
14238  	function encoding_name()
14239      {
14240          if (substr($this->data, $this->position, 8) === 'encoding')
14241          {
14242              $this->position += 8;
14243              $this->skip_whitespace();
14244              $this->state = 'encoding_equals';
14245          }
14246          else
14247          {
14248              $this->state = 'standalone_name';
14249          }
14250      }
14251  
14252  	function encoding_equals()
14253      {
14254          if (substr($this->data, $this->position, 1) === '=')
14255          {
14256              $this->position++;
14257              $this->skip_whitespace();
14258              $this->state = 'encoding_value';
14259          }
14260          else
14261          {
14262              $this->state = false;
14263          }
14264      }
14265  
14266  	function encoding_value()
14267      {
14268          if ($this->encoding = $this->get_value())
14269          {
14270              $this->skip_whitespace();
14271              if ($this->has_data())
14272              {
14273                  $this->state = 'standalone_name';
14274              }
14275              else
14276              {
14277                  $this->state = 'emit';
14278              }
14279          }
14280          else
14281          {
14282              $this->state = false;
14283          }
14284      }
14285  
14286  	function standalone_name()
14287      {
14288          if (substr($this->data, $this->position, 10) === 'standalone')
14289          {
14290              $this->position += 10;
14291              $this->skip_whitespace();
14292              $this->state = 'standalone_equals';
14293          }
14294          else
14295          {
14296              $this->state = false;
14297          }
14298      }
14299  
14300  	function standalone_equals()
14301      {
14302          if (substr($this->data, $this->position, 1) === '=')
14303          {
14304              $this->position++;
14305              $this->skip_whitespace();
14306              $this->state = 'standalone_value';
14307          }
14308          else
14309          {
14310              $this->state = false;
14311          }
14312      }
14313  
14314  	function standalone_value()
14315      {
14316          if ($standalone = $this->get_value())
14317          {
14318              switch ($standalone)
14319              {
14320                  case 'yes':
14321                      $this->standalone = true;
14322                      break;
14323  
14324                  case 'no':
14325                      $this->standalone = false;
14326                      break;
14327  
14328                  default:
14329                      $this->state = false;
14330                      return;
14331              }
14332  
14333              $this->skip_whitespace();
14334              if ($this->has_data())
14335              {
14336                  $this->state = false;
14337              }
14338              else
14339              {
14340                  $this->state = 'emit';
14341              }
14342          }
14343          else
14344          {
14345              $this->state = false;
14346          }
14347      }
14348  }
14349  
14350  class SimplePie_Locator
14351  {
14352      var $useragent;
14353      var $timeout;
14354      var $file;
14355      var $local = array();
14356      var $elsewhere = array();
14357      var $file_class = 'SimplePie_File';
14358      var $cached_entities = array();
14359      var $http_base;
14360      var $base;
14361      var $base_location = 0;
14362      var $checked_feeds = 0;
14363      var $max_checked_feeds = 10;
14364      var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer';
14365  
14366  	function SimplePie_Locator(&$file, $timeout = 10, $useragent = null, $file_class = 'SimplePie_File', $max_checked_feeds = 10, $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer')
14367      {
14368          $this->file =& $file;
14369          $this->file_class = $file_class;
14370          $this->useragent = $useragent;
14371          $this->timeout = $timeout;
14372          $this->max_checked_feeds = $max_checked_feeds;
14373          $this->content_type_sniffer_class = $content_type_sniffer_class;
14374      }
14375  
14376  	function find($type = SIMPLEPIE_LOCATOR_ALL, &$working)
14377      {
14378          if ($this->is_feed($this->file))
14379          {
14380              return $this->file;
14381          }
14382  
14383          if ($this->file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
14384          {
14385              $sniffer =& new $this->content_type_sniffer_class($this->file);
14386              if ($sniffer->get_type() !== 'text/html')
14387              {
14388                  return null;
14389              }
14390          }
14391  
14392          if ($type & ~SIMPLEPIE_LOCATOR_NONE)
14393          {
14394              $this->get_base();
14395          }
14396  
14397          if ($type & SIMPLEPIE_LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery())
14398          {
14399              return $working[0];
14400          }
14401  
14402          if ($type & (SIMPLEPIE_LOCATOR_LOCAL_EXTENSION | SIMPLEPIE_LOCATOR_LOCAL_BODY | SIMPLEPIE_LOCATOR_REMOTE_EXTENSION | SIMPLEPIE_LOCATOR_REMOTE_BODY) && $this->get_links())
14403          {
14404              if ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local))
14405              {
14406                  return $working;
14407              }
14408  
14409              if ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local))
14410              {
14411                  return $working;
14412              }
14413  
14414              if ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere))
14415              {
14416                  return $working;
14417              }
14418  
14419              if ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere))
14420              {
14421                  return $working;
14422              }
14423          }
14424          return null;
14425      }
14426  
14427  	function is_feed(&$file)
14428      {
14429          if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
14430          {
14431              $sniffer =& new $this->content_type_sniffer_class($file);
14432              $sniffed = $sniffer->get_type();
14433              if (in_array($sniffed, array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml')))
14434              {
14435                  return true;
14436              }
14437              else
14438              {
14439                  return false;
14440              }
14441          }
14442          elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL)
14443          {
14444              return true;
14445          }
14446          else
14447          {
14448              return false;
14449          }
14450      }
14451  
14452  	function get_base()
14453      {
14454          $this->http_base = $this->file->url;
14455          $this->base = $this->http_base;
14456          $elements = SimplePie_Misc::get_element('base', $this->file->body);
14457          foreach ($elements as $element)
14458          {
14459              if ($element['attribs']['href']['data'] !== '')
14460              {
14461                  $this->base = SimplePie_Misc::absolutize_url(trim($element['attribs']['href']['data']), $this->http_base);
14462                  $this->base_location = $element['offset'];
14463                  break;
14464              }
14465          }
14466      }
14467  
14468  	function autodiscovery()
14469      {
14470          $links = array_merge(SimplePie_Misc::get_element('link', $this->file->body), SimplePie_Misc::get_element('a', $this->file->body), SimplePie_Misc::get_element('area', $this->file->body));
14471          $done = array();
14472          $feeds = array();
14473          foreach ($links as $link)
14474          {
14475              if ($this->checked_feeds === $this->max_checked_feeds)
14476              {
14477                  break;
14478              }
14479              if (isset($link['attribs']['href']['data']) && isset($link['attribs']['rel']['data']))
14480              {
14481                  $rel = array_unique(SimplePie_Misc::space_seperated_tokens(strtolower($link['attribs']['rel']['data'])));
14482  
14483                  if ($this->base_location < $link['offset'])
14484                  {
14485                      $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->base);
14486                  }
14487                  else
14488                  {
14489                      $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->http_base);
14490                  }
14491  
14492                  if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !empty($link['attribs']['type']['data']) && in_array(strtolower(SimplePie_Misc::parse_mime($link['attribs']['type']['data'])), array('application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href]))
14493                  {
14494                      $this->checked_feeds++;
14495                      $feed =& new $this->file_class($href, $this->timeout, 5, null, $this->useragent);
14496                      if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
14497                      {
14498                          $feeds[$href] = $feed;
14499                      }
14500                  }
14501                  $done[] = $href;
14502              }
14503          }
14504  
14505          if (!empty($feeds))
14506          {
14507              return array_values($feeds);
14508          }
14509          else {
14510              return null;
14511          }
14512      }
14513  
14514  	function get_links()
14515      {
14516          $links = SimplePie_Misc::get_element('a', $this->file->body);
14517          foreach ($links as $link)
14518          {
14519              if (isset($link['attribs']['href']['data']))
14520              {
14521                  $href = trim($link['attribs']['href']['data']);
14522                  $parsed = SimplePie_Misc::parse_url($href);
14523                  if ($parsed['scheme'] === '' || preg_match('/^(http(s)|feed)?$/i', $parsed['scheme']))
14524                  {
14525                      if ($this->base_location < $link['offset'])
14526                      {
14527                          $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->base);
14528                      }
14529                      else
14530                      {
14531                          $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->http_base);
14532                      }
14533  
14534                      $current = SimplePie_Misc::parse_url($this->file->url);
14535  
14536                      if ($parsed['authority'] === '' || $parsed['authority'] === $current['authority'])
14537                      {
14538                          $this->local[] = $href;
14539                      }
14540                      else
14541                      {
14542                          $this->elsewhere[] = $href;
14543                      }
14544                  }
14545              }
14546          }
14547          $this->local = array_unique($this->local);
14548          $this->elsewhere = array_unique($this->elsewhere);
14549          if (!empty($this->local) || !empty($this->elsewhere))
14550          {
14551              return true;
14552          }
14553          return null;
14554      }
14555  
14556  	function extension(&$array)
14557      {
14558          foreach ($array as $key => $value)
14559          {
14560              if ($this->checked_feeds === $this->max_checked_feeds)
14561              {
14562                  break;
14563              }
14564              if (in_array(strtolower(strrchr($value, '.')), array('.rss', '.rdf', '.atom', '.xml')))
14565              {
14566                  $this->checked_feeds++;
14567                  $feed =& new $this->file_class($value, $this->timeout, 5, null, $this->useragent);
14568                  if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
14569                  {
14570                      return $feed;
14571                  }
14572                  else
14573                  {
14574                      unset($array[$key]);
14575                  }
14576              }
14577          }
14578          return null;
14579      }
14580  
14581  	function body(&$array)
14582      {
14583          foreach ($array as $key => $value)
14584          {
14585              if ($this->checked_feeds === $this->max_checked_feeds)
14586              {
14587                  break;
14588              }
14589              if (preg_match('/(rss|rdf|atom|xml)/i', $value))
14590              {
14591                  $this->checked_feeds++;
14592                  $feed =& new $this->file_class($value, $this->timeout, 5, null, $this->useragent);
14593                  if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
14594                  {
14595                      return $feed;
14596                  }
14597                  else
14598                  {
14599                      unset($array[$key]);
14600                  }
14601              }
14602          }
14603          return null;
14604      }
14605  }
14606  
14607  class SimplePie_Parser
14608  {
14609      var $error_code;
14610      var $error_string;
14611      var $current_line;
14612      var $current_column;
14613      var $current_byte;
14614      var $separator = ' ';
14615      var $namespace = array('');
14616      var $element = array('');
14617      var $xml_base = array('');
14618      var $xml_base_explicit = array(false);
14619      var $xml_lang = array('');
14620      var $data = array();
14621      var $datas = array(array());
14622      var $current_xhtml_construct = -1;
14623      var $encoding;
14624  
14625  	function parse(&$data, $encoding)
14626      {
14627          // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character
14628          if (strtoupper($encoding) === 'US-ASCII')
14629          {
14630              $this->encoding = 'UTF-8';
14631          }
14632          else
14633          {
14634              $this->encoding = $encoding;
14635          }
14636  
14637          // Strip BOM:
14638          // UTF-32 Big Endian BOM
14639          if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
14640          {
14641              $data = substr($data, 4);
14642          }
14643          // UTF-32 Little Endian BOM
14644          elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
14645          {
14646              $data = substr($data, 4);
14647          }
14648          // UTF-16 Big Endian BOM
14649          elseif (substr($data, 0, 2) === "\xFE\xFF")
14650          {
14651              $data = substr($data, 2);
14652          }
14653          // UTF-16 Little Endian BOM
14654          elseif (substr($data, 0, 2) === "\xFF\xFE")
14655          {
14656              $data = substr($data, 2);
14657          }
14658          // UTF-8 BOM
14659          elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
14660          {
14661              $data = substr($data, 3);
14662          }
14663  
14664          if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false)
14665          {
14666              $declaration =& new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5));
14667              if ($declaration->parse())
14668              {
14669                  $data = substr($data, $pos + 2);
14670                  $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' . $data;
14671              }
14672              else
14673              {
14674                  $this->error_string = 'SimplePie bug! Please report this!';
14675                  return false;
14676              }
14677          }
14678  
14679          $return = true;
14680  
14681          static $xml_is_sane = null;
14682          if ($xml_is_sane === null)
14683          {
14684              $parser_check = xml_parser_create();
14685              xml_parse_into_struct($parser_check, '<foo>&amp;</foo>', $values);
14686              xml_parser_free($parser_check);
14687              $xml_is_sane = isset($values[0]['value']);
14688          }
14689  
14690          // Create the parser
14691          if ($xml_is_sane)
14692          {
14693              $xml = xml_parser_create_ns($this->encoding, $this->separator);
14694              xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1);
14695              xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0);
14696              xml_set_object($xml, $this);
14697              xml_set_character_data_handler($xml, 'cdata');
14698              xml_set_element_handler($xml, 'tag_open', 'tag_close');
14699  
14700              // Parse!
14701              if (!xml_parse($xml, $data, true))
14702              {
14703                  $this->error_code = xml_get_error_code($xml);
14704                  $this->error_string = xml_error_string($this->error_code);
14705                  $return = false;
14706              }
14707              $this->current_line = xml_get_current_line_number($xml);
14708              $this->current_column = xml_get_current_column_number($xml);
14709              $this->current_byte = xml_get_current_byte_index($xml);
14710              xml_parser_free($xml);
14711              return $return;
14712          }
14713          else
14714          {
14715              libxml_clear_errors();
14716              $xml =& new XMLReader();
14717              $xml->xml($data);
14718              while (@$xml->read())
14719              {
14720                  switch ($xml->nodeType)
14721                  {
14722  
14723                      case constant('XMLReader::END_ELEMENT'):
14724                          if ($xml->namespaceURI !== '')
14725                          {
14726                              $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
14727                          }
14728                          else
14729                          {
14730                              $tagName = $xml->localName;
14731                          }
14732                          $this->tag_close(null, $tagName);
14733                          break;
14734                      case constant('XMLReader::ELEMENT'):
14735                          $empty = $xml->isEmptyElement;
14736                          if ($xml->namespaceURI !== '')
14737                          {
14738                              $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
14739                          }
14740                          else
14741                          {
14742                              $tagName = $xml->localName;
14743                          }
14744                          $attributes = array();
14745                          while ($xml->moveToNextAttribute())
14746                          {
14747                              if ($xml->namespaceURI !== '')
14748                              {
14749                                  $attrName = $xml->namespaceURI . $this->separator . $xml->localName;
14750                              }
14751                              else
14752                              {
14753                                  $attrName = $xml->localName;
14754                              }
14755                              $attributes[$attrName] = $xml->value;
14756                          }
14757                          $this->tag_open(null, $tagName, $attributes);
14758                          if ($empty)
14759                          {
14760                              $this->tag_close(null, $tagName);
14761                          }
14762                          break;
14763                      case constant('XMLReader::TEXT'):
14764  
14765                      case constant('XMLReader::CDATA'):
14766                          $this->cdata(null, $xml->value);
14767                          break;
14768                  }
14769              }
14770              if ($error = libxml_get_last_error())
14771              {
14772                  $this->error_code = $error->code;
14773                  $this->error_string = $error->message;
14774                  $this->current_line = $error->line;
14775                  $this->current_column = $error->column;
14776                  return false;
14777              }
14778              else
14779              {
14780                  return true;
14781              }
14782          }
14783      }
14784  
14785  	function get_error_code()
14786      {
14787          return $this->error_code;
14788      }
14789  
14790  	function get_error_string()
14791      {
14792          return $this->error_string;
14793      }
14794  
14795  	function get_current_line()
14796      {
14797          return $this->current_line;
14798      }
14799  
14800  	function get_current_column()
14801      {
14802          return $this->current_column;
14803      }
14804  
14805  	function get_current_byte()
14806      {
14807          return $this->current_byte;
14808      }
14809  
14810  	function get_data()
14811      {
14812          return $this->data;
14813      }
14814  
14815  	function tag_open($parser, $tag, $attributes)
14816      {
14817          list($this->namespace[], $this->element[]) = $this->split_ns($tag);
14818  
14819          $attribs = array();
14820          foreach ($attributes as $name => $value)
14821          {
14822              list($attrib_namespace, $attribute) = $this->split_ns($name);
14823              $attribs[$attrib_namespace][$attribute] = $value;
14824          }
14825  
14826          if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['base']))
14827          {
14828              $this->xml_base[] = SimplePie_Misc::absolutize_url($attribs[SIMPLEPIE_NAMESPACE_XML]['base'], end($this->xml_base));
14829              $this->xml_base_explicit[] = true;
14830          }
14831          else
14832          {
14833              $this->xml_base[] = end($this->xml_base);
14834              $this->xml_base_explicit[] = end($this->xml_base_explicit);
14835          }
14836  
14837          if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['lang']))
14838          {
14839              $this->xml_lang[] = $attribs[SIMPLEPIE_NAMESPACE_XML]['lang'];
14840          }
14841          else
14842          {
14843              $this->xml_lang[] = end($this->xml_lang);
14844          }
14845  
14846          if ($this->current_xhtml_construct >= 0)
14847          {
14848              $this->current_xhtml_construct++;
14849              if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML)
14850              {
14851                  $this->data['data'] .= '<' . end($this->element);
14852                  if (isset($attribs['']))
14853                  {
14854                      foreach ($attribs[''] as $name => $value)
14855                      {
14856                          $this->data['data'] .= ' ' . $name . '="' . htmlspecialchars($value, ENT_COMPAT, $this->encoding) . '"';
14857                      }
14858                  }
14859                  $this->data['data'] .= '>';
14860              }
14861          }
14862          else
14863          {
14864              $this->datas[] =& $this->data;
14865              $this->data =& $this->data['child'][end($this->namespace)][end($this->element)][];
14866              $this->data = array('data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang));
14867              if ((end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] === 'xml')
14868              || (end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] === 'xhtml'))
14869              {
14870                  $this->current_xhtml_construct = 0;
14871              }
14872          }
14873      }
14874  
14875  	function cdata($parser, $cdata)
14876      {
14877          if ($this->current_xhtml_construct >= 0)
14878          {
14879              $this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding);
14880          }
14881          else
14882          {
14883              $this->data['data'] .= $cdata;
14884          }
14885      }
14886  
14887  	function tag_close($parser, $tag)
14888      {
14889          if ($this->current_xhtml_construct >= 0)
14890          {
14891              $this->current_xhtml_construct--;
14892              if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param')))
14893              {
14894                  $this->data['data'] .= '</' . end($this->element) . '>';
14895              }
14896          }
14897          if ($this->current_xhtml_construct === -1)
14898          {
14899              $this->data =& $this->datas[count($this->datas) - 1];
14900              array_pop($this->datas);
14901          }
14902  
14903          array_pop($this->element);
14904          array_pop($this->namespace);
14905          array_pop($this->xml_base);
14906          array_pop($this->xml_base_explicit);
14907          array_pop($this->xml_lang);
14908      }
14909  
14910  	function split_ns($string)
14911      {
14912          static $cache = array();
14913          if (!isset($cache[$string]))
14914          {
14915              if ($pos = strpos($string, $this->separator))
14916              {
14917                  static $separator_length;
14918                  if (!$separator_length)
14919                  {
14920                      $separator_length = strlen($this->separator);
14921                  }
14922                  $namespace = substr($string, 0, $pos);
14923                  $local_name = substr($string, $pos + $separator_length);
14924                  if (strtolower($namespace) === SIMPLEPIE_NAMESPACE_ITUNES)
14925                  {
14926                      $namespace = SIMPLEPIE_NAMESPACE_ITUNES;
14927                  }
14928  
14929                  // Normalize the Media RSS namespaces
14930                  if ($namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG)
14931                  {
14932                      $namespace = SIMPLEPIE_NAMESPACE_MEDIARSS;
14933                  }
14934                  $cache[$string] = array($namespace, $local_name);
14935              }
14936              else
14937              {
14938                  $cache[$string] = array('', $string);
14939              }
14940          }
14941          return $cache[$string];
14942      }
14943  }
14944  
14945  /**
14946   * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shorten a string while preserving HTML tags
14947   */
14948  class SimplePie_Sanitize
14949  {
14950      // Private vars
14951      var $base;
14952  
14953      // Options
14954      var $remove_div = true;
14955      var $image_handler = '';
14956      var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
14957      var $encode_instead_of_strip = false;
14958      var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
14959      var $strip_comments = false;
14960      var $output_encoding = 'UTF-8';
14961      var $enable_cache = true;
14962      var $cache_location = './cache';
14963      var $cache_name_function = 'md5';
14964      var $cache_class = 'SimplePie_Cache';
14965      var $file_class = 'SimplePie_File';
14966      var $timeout = 10;
14967      var $useragent = '';
14968      var $force_fsockopen = false;
14969  
14970      var $replace_url_attributes = array(
14971          'a' => 'href',
14972          'area' => 'href',
14973          'blockquote' => 'cite',
14974          'del' => 'cite',
14975          'form' => 'action',
14976          'img' => array('longdesc', 'src'),
14977          'input' => 'src',
14978          'ins' => 'cite',
14979          'q' => 'cite'
14980      );
14981  
14982  	function remove_div($enable = true)
14983      {
14984          $this->remove_div = (bool) $enable;
14985      }
14986  
14987  	function set_image_handler($page = false)
14988      {
14989          if ($page)
14990          {
14991              $this->image_handler = (string) $page;
14992          }
14993          else
14994          {
14995              $this->image_handler = false;
14996          }
14997      }
14998  
14999  	function pass_cache_data($enable_cache = true, $cache_location = './cache', $cache_name_function = 'md5', $cache_class = 'SimplePie_Cache')
15000      {
15001          if (isset($enable_cache))
15002          {
15003              $this->enable_cache = (bool) $enable_cache;
15004          }
15005  
15006          if ($cache_location)
15007          {
15008              $this->cache_location = (string) $cache_location;
15009          }
15010  
15011          if ($cache_name_function)
15012          {
15013              $this->cache_name_function = (string) $cache_name_function;
15014          }
15015  
15016          if ($cache_class)
15017          {
15018              $this->cache_class = (string) $cache_class;
15019          }
15020      }
15021  
15022  	function pass_file_data($file_class = 'SimplePie_File', $timeout = 10, $useragent = '', $force_fsockopen = false)
15023      {
15024          if ($file_class)
15025          {
15026              $this->file_class = (string) $file_class;
15027          }
15028  
15029          if ($timeout)
15030          {
15031              $this->timeout = (string) $timeout;
15032          }
15033  
15034          if ($useragent)
15035          {
15036              $this->useragent = (string) $useragent;
15037          }
15038  
15039          if ($force_fsockopen)
15040          {
15041              $this->force_fsockopen = (string) $force_fsockopen;
15042          }
15043      }
15044  
15045  	function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'))
15046      {
15047          if ($tags)
15048          {
15049              if (is_array($tags))
15050              {
15051                  $this->strip_htmltags = $tags;
15052              }
15053              else
15054              {
15055                  $this->strip_htmltags = explode(',', $tags);
15056              }
15057          }
15058          else
15059          {
15060              $this->strip_htmltags = false;
15061          }
15062      }
15063  
15064  	function encode_instead_of_strip($encode = false)
15065      {
15066          $this->encode_instead_of_strip = (bool) $encode;
15067      }
15068  
15069  	function strip_attributes($attribs = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'))
15070      {
15071          if ($attribs)
15072          {
15073              if (is_array($attribs))
15074              {
15075                  $this->strip_attributes = $attribs;
15076              }
15077              else
15078              {
15079                  $this->strip_attributes = explode(',', $attribs);
15080              }
15081          }
15082          else
15083          {
15084              $this->strip_attributes = false;
15085          }
15086      }
15087  
15088  	function strip_comments($strip = false)
15089      {
15090          $this->strip_comments = (bool) $strip;
15091      }
15092  
15093  	function set_output_encoding($encoding = 'UTF-8')
15094      {
15095          $this->output_encoding = (string) $encoding;
15096      }
15097  
15098      /**
15099       * Set element/attribute key/value pairs of HTML attributes
15100       * containing URLs that need to be resolved relative to the feed
15101       *
15102       * @access public
15103       * @since 1.0
15104       * @param array $element_attribute Element/attribute key/value pairs
15105       */
15106  	function set_url_replacements($element_attribute = array('a' => 'href', 'area' => 'href', 'blockquote' => 'cite', 'del' => 'cite', 'form' => 'action', 'img' => array('longdesc', 'src'), 'input' => 'src', 'ins' => 'cite', 'q' => 'cite'))
15107      {
15108          $this->replace_url_attributes = (array) $element_attribute;
15109      }
15110  
15111  	function sanitize($data, $type, $base = '')
15112      {
15113          $data = trim($data);
15114          if ($data !== '' || $type & SIMPLEPIE_CONSTRUCT_IRI)
15115          {
15116              if ($type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML)
15117              {
15118                  if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data))
15119                  {
15120                      $type |= SIMPLEPIE_CONSTRUCT_HTML;
15121                  }
15122                  else
15123                  {
15124                      $type |= SIMPLEPIE_CONSTRUCT_TEXT;
15125                  }
15126              }
15127  
15128              if ($type & SIMPLEPIE_CONSTRUCT_BASE64)
15129              {
15130                  $data = base64_decode($data);
15131              }
15132  
15133              if ($type & SIMPLEPIE_CONSTRUCT_XHTML)
15134              {
15135                  if ($this->remove_div)
15136                  {
15137                      $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '', $data);
15138                      $data = preg_replace('/<\/div>$/', '', $data);
15139                  }
15140                  else
15141                  {
15142                      $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '<div>', $data);
15143                  }
15144              }
15145  
15146              if ($type & (SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML))
15147              {
15148                  // Strip comments
15149                  if ($this->strip_comments)
15150                  {
15151                      $data = SimplePie_Misc::strip_comments($data);
15152                  }
15153  
15154                  // Strip out HTML tags and attributes that might cause various security problems.
15155                  // Based on recommendations by Mark Pilgrim at:
15156                  // http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely
15157                  if ($this->strip_htmltags)
15158                  {
15159                      foreach ($this->strip_htmltags as $tag)
15160                      {
15161                          $pcre = "/<($tag)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$tag" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>|(\/)?>)/siU';
15162                          while (preg_match($pcre, $data))
15163                          {
15164                              $data = preg_replace_callback($pcre, array(&$this, 'do_strip_htmltags'), $data);
15165                          }
15166                      }
15167                  }
15168  
15169                  if ($this->strip_attributes)
15170                  {
15171                      foreach ($this->strip_attributes as $attrib)
15172                      {
15173                          $data = preg_replace('/(<[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*)' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . trim($attrib) . '(?:\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>/', '\1\2\3>', $data);
15174                      }
15175                  }
15176  
15177                  // Replace relative URLs
15178                  $this->base = $base;
15179                  foreach ($this->replace_url_attributes as $element => $attributes)
15180                  {
15181                      $data = $this->replace_urls($data, $element, $attributes);
15182                  }
15183  
15184                  // If image handling (caching, etc.) is enabled, cache and rewrite all the image tags.
15185                  if (isset($this->image_handler) && ((string) $this->image_handler) !== '' && $this->enable_cache)
15186                  {
15187                      $images = SimplePie_Misc::get_element('img', $data);
15188                      foreach ($images as $img)
15189                      {
15190                          if (isset($img['attribs']['src']['data']))
15191                          {
15192                              $image_url = call_user_func($this->cache_name_function, $img['attribs']['src']['data']);
15193                              $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $image_url, 'spi');
15194  
15195                              if ($cache->load())
15196                              {
15197                                  $img['attribs']['src']['data'] = $this->image_handler . $image_url;
15198                                  $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data);
15199                              }
15200                              else
15201                              {
15202                                  $file =& new $this->file_class($img['attribs']['src']['data'], $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen);
15203                                  $headers = $file->headers;
15204  
15205                                  if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
15206                                  {
15207                                      if ($cache->save(array('headers' => $file->headers, 'body' => $file->body)))
15208                                      {
15209                                          $img['attribs']['src']['data'] = $this->image_handler . $image_url;
15210                                          $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data);
15211                                      }
15212                                      else
15213                                      {
15214                                          trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
15215                                      }
15216                                  }
15217                              }
15218                          }
15219                      }
15220                  }
15221  
15222                  // Having (possibly) taken stuff out, there may now be whitespace at the beginning/end of the data
15223                  $data = trim($data);
15224              }
15225  
15226              if ($type & SIMPLEPIE_CONSTRUCT_IRI)
15227              {
15228                  $data = SimplePie_Misc::absolutize_url($data, $base);
15229              }
15230  
15231              if ($type & (SIMPLEPIE_CONSTRUCT_TEXT | SIMPLEPIE_CONSTRUCT_IRI))
15232              {
15233                  $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8');
15234              }
15235  
15236              if ($this->output_encoding !== 'UTF-8')
15237              {
15238                  $data = SimplePie_Misc::change_encoding($data, 'UTF-8', $this->output_encoding);
15239              }
15240          }
15241          return $data;
15242      }
15243  
15244  	function replace_urls($data, $tag, $attributes)
15245      {
15246          if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags))
15247          {
15248              $elements = SimplePie_Misc::get_element($tag, $data);
15249              foreach ($elements as $element)
15250              {
15251                  if (is_array($attributes))
15252                  {
15253                      foreach ($attributes as $attribute)
15254                      {
15255                          if (isset($element['attribs'][$attribute]['data']))
15256                          {
15257                              $element['attribs'][$attribute]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attribute]['data'], $this->base);
15258                              $new_element = SimplePie_Misc::element_implode($element);
15259                              $data = str_replace($element['full'], $new_element, $data);
15260                              $element['full'] = $new_element;
15261                          }
15262                      }
15263                  }
15264                  elseif (isset($element['attribs'][$attributes]['data']))
15265                  {
15266                      $element['attribs'][$attributes]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attributes]['data'], $this->base);
15267                      $data = str_replace($element['full'], SimplePie_Misc::element_implode($element), $data);
15268                  }
15269              }
15270          }
15271          return $data;
15272      }
15273  
15274  	function do_strip_htmltags($match)
15275      {
15276          if ($this->encode_instead_of_strip)
15277          {
15278              if (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))
15279              {
15280                  $match[1] = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8');
15281                  $match[2] = htmlspecialchars($match[2], ENT_COMPAT, 'UTF-8');
15282                  return "&lt;$match[1]$match[2]&gt;$match[3]&lt;/$match[1]&gt;";
15283              }
15284              else
15285              {
15286                  return htmlspecialchars($match[0], ENT_COMPAT, 'UTF-8');
15287              }
15288          }
15289          elseif (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))
15290          {
15291              return $match[4];
15292          }
15293          else
15294          {
15295              return '';
15296          }
15297      }
15298  }
15299  endif;
15300  ?>


Generated: Sat May 26 08:20:01 2012 Cross-referenced by PHPXref 0.7