From 369954c713a1b7b0eeac571b4a7cf7e8bcfa1335 Mon Sep 17 00:00:00 2001
From: Andrew Davidson Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/config/.svn/all-wcprops b/system/application/config/.svn/all-wcprops
new file mode 100644
index 0000000..9b6f258
--- /dev/null
+++ b/system/application/config/.svn/all-wcprops
@@ -0,0 +1,59 @@
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/!svn/ver/117/trunk/system/application/config
+END
+mimes.php
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/!svn/ver/18/trunk/system/application/config/mimes.php
+END
+user_agents.php
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/!svn/ver/18/trunk/system/application/config/user_agents.php
+END
+routes.php
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/!svn/ver/18/trunk/system/application/config/routes.php
+END
+hooks.php
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/!svn/ver/18/trunk/system/application/config/hooks.php
+END
+database-sample.php
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/!svn/ver/18/trunk/system/application/config/database-sample.php
+END
+index.html
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/!svn/ver/18/trunk/system/application/config/index.html
+END
+config-sample.php
+K 25
+svn:wc:ra_dav:version-url
+V 67
+/svn/!svn/ver/117/trunk/system/application/config/config-sample.php
+END
+smileys.php
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/!svn/ver/18/trunk/system/application/config/smileys.php
+END
+autoload.php
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/!svn/ver/18/trunk/system/application/config/autoload.php
+END
diff --git a/system/application/config/.svn/entries b/system/application/config/.svn/entries
new file mode 100644
index 0000000..df950d5
--- /dev/null
+++ b/system/application/config/.svn/entries
@@ -0,0 +1,334 @@
+10
+
+dir
+124
+http://sweetcron.googlecode.com/svn/trunk/system/application/config
+http://sweetcron.googlecode.com/svn
+
+
+
+2008-10-05T07:25:02.976982Z
+117
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+51b50d7d-0b4b-0410-974b-f188aa86c7d9
+
+mimes.php
+file
+
+
+
+
+2009-09-15T00:17:49.000000Z
+f448652e2041378459f98e1351fa2075
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3915
+
+user_agents.php
+file
+
+
+
+
+2009-09-15T00:17:49.000000Z
+af54d668da8675307fd1e58dccaeced8
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3333
+
+routes.php
+file
+
+
+
+
+2009-09-15T00:17:49.000000Z
+ac739e7cd13dc9d819de049f867f2364
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1871
+
+hooks.php
+file
+
+
+
+
+2009-09-15T00:17:49.000000Z
+18ccf2a3e220d7a493e3bc8801a1cd87
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+423
+
+database-sample.php
+file
+
+
+
+
+2009-09-15T00:17:49.000000Z
+f6427b46fae29e65fdd56438cae76a83
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2277
+
+index.html
+file
+
+
+
+
+2009-09-15T00:17:49.000000Z
+362a648cc43551584abe596372cb8da8
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+149
+
+config-sample.php
+file
+
+
+
+
+2009-09-15T00:17:49.000000Z
+a25db98cac3f754b9ccaea9d132d7c27
+2008-10-05T07:25:02.976982Z
+117
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+10721
+
+smileys.php
+file
+
+
+
+
+2009-09-15T00:17:49.000000Z
+9c96d1097118853e6ef60b36e74ae897
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3217
+
+autoload.php
+file
+
+
+
+
+2009-09-15T00:17:49.000000Z
+4d2649f038c629ccaaf4d1c4e84bc08e
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3280
+
diff --git a/system/application/config/.svn/prop-base/autoload.php.svn-base b/system/application/config/.svn/prop-base/autoload.php.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/config/.svn/prop-base/autoload.php.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/config/.svn/prop-base/config-sample.php.svn-base b/system/application/config/.svn/prop-base/config-sample.php.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/config/.svn/prop-base/config-sample.php.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/config/.svn/prop-base/database-sample.php.svn-base b/system/application/config/.svn/prop-base/database-sample.php.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/config/.svn/prop-base/database-sample.php.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/config/.svn/prop-base/hooks.php.svn-base b/system/application/config/.svn/prop-base/hooks.php.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/config/.svn/prop-base/hooks.php.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/config/.svn/prop-base/index.html.svn-base b/system/application/config/.svn/prop-base/index.html.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/config/.svn/prop-base/index.html.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/config/.svn/prop-base/mimes.php.svn-base b/system/application/config/.svn/prop-base/mimes.php.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/config/.svn/prop-base/mimes.php.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/config/.svn/prop-base/routes.php.svn-base b/system/application/config/.svn/prop-base/routes.php.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/config/.svn/prop-base/routes.php.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/config/.svn/prop-base/smileys.php.svn-base b/system/application/config/.svn/prop-base/smileys.php.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/config/.svn/prop-base/smileys.php.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/config/.svn/prop-base/user_agents.php.svn-base b/system/application/config/.svn/prop-base/user_agents.php.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/config/.svn/prop-base/user_agents.php.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/config/.svn/text-base/autoload.php.svn-base b/system/application/config/.svn/text-base/autoload.php.svn-base
new file mode 100644
index 0000000..539c72d
--- /dev/null
+++ b/system/application/config/.svn/text-base/autoload.php.svn-base
@@ -0,0 +1,125 @@
+
\ No newline at end of file
diff --git a/system/application/config/.svn/text-base/config-sample.php.svn-base b/system/application/config/.svn/text-base/config-sample.php.svn-base
new file mode 100644
index 0000000..3e5aaf1
--- /dev/null
+++ b/system/application/config/.svn/text-base/config-sample.php.svn-base
@@ -0,0 +1,314 @@
+
\ No newline at end of file
diff --git a/system/application/config/.svn/text-base/database-sample.php.svn-base b/system/application/config/.svn/text-base/database-sample.php.svn-base
new file mode 100644
index 0000000..0d0e08e
--- /dev/null
+++ b/system/application/config/.svn/text-base/database-sample.php.svn-base
@@ -0,0 +1,53 @@
+
\ No newline at end of file
diff --git a/system/application/config/.svn/text-base/hooks.php.svn-base b/system/application/config/.svn/text-base/hooks.php.svn-base
new file mode 100644
index 0000000..f0a0d6e
--- /dev/null
+++ b/system/application/config/.svn/text-base/hooks.php.svn-base
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/system/application/config/.svn/text-base/index.html.svn-base b/system/application/config/.svn/text-base/index.html.svn-base
new file mode 100644
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/config/.svn/text-base/index.html.svn-base
@@ -0,0 +1,15 @@
+
+
+ Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/config/.svn/text-base/mimes.php.svn-base b/system/application/config/.svn/text-base/mimes.php.svn-base
new file mode 100644
index 0000000..225b0a5
--- /dev/null
+++ b/system/application/config/.svn/text-base/mimes.php.svn-base
@@ -0,0 +1,102 @@
+ 'application/mac-binhex40',
+ 'cpt' => 'application/mac-compactpro',
+ 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel'),
+ 'bin' => 'application/macbinary',
+ 'dms' => 'application/octet-stream',
+ 'lha' => 'application/octet-stream',
+ 'lzh' => 'application/octet-stream',
+ 'exe' => 'application/octet-stream',
+ 'class' => 'application/octet-stream',
+ 'psd' => 'application/x-photoshop',
+ 'so' => 'application/octet-stream',
+ 'sea' => 'application/octet-stream',
+ 'dll' => 'application/octet-stream',
+ 'oda' => 'application/oda',
+ 'pdf' => array('application/pdf', 'application/x-download'),
+ 'ai' => 'application/postscript',
+ 'eps' => 'application/postscript',
+ 'ps' => 'application/postscript',
+ 'smi' => 'application/smil',
+ 'smil' => 'application/smil',
+ 'mif' => 'application/vnd.mif',
+ 'xls' => array('application/excel', 'application/vnd.ms-excel'),
+ 'ppt' => 'application/powerpoint',
+ 'wbxml' => 'application/wbxml',
+ 'wmlc' => 'application/wmlc',
+ 'dcr' => 'application/x-director',
+ 'dir' => 'application/x-director',
+ 'dxr' => 'application/x-director',
+ 'dvi' => 'application/x-dvi',
+ 'gtar' => 'application/x-gtar',
+ 'gz' => 'application/x-gzip',
+ 'php' => 'application/x-httpd-php',
+ 'php4' => 'application/x-httpd-php',
+ 'php3' => 'application/x-httpd-php',
+ 'phtml' => 'application/x-httpd-php',
+ 'phps' => 'application/x-httpd-php-source',
+ 'js' => 'application/x-javascript',
+ 'swf' => 'application/x-shockwave-flash',
+ 'sit' => 'application/x-stuffit',
+ 'tar' => 'application/x-tar',
+ 'tgz' => 'application/x-tar',
+ 'xhtml' => 'application/xhtml+xml',
+ 'xht' => 'application/xhtml+xml',
+ 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed'),
+ 'mid' => 'audio/midi',
+ 'midi' => 'audio/midi',
+ 'mpga' => 'audio/mpeg',
+ 'mp2' => 'audio/mpeg',
+ 'mp3' => 'audio/mpeg',
+ 'aif' => 'audio/x-aiff',
+ 'aiff' => 'audio/x-aiff',
+ 'aifc' => 'audio/x-aiff',
+ 'ram' => 'audio/x-pn-realaudio',
+ 'rm' => 'audio/x-pn-realaudio',
+ 'rpm' => 'audio/x-pn-realaudio-plugin',
+ 'ra' => 'audio/x-realaudio',
+ 'rv' => 'video/vnd.rn-realvideo',
+ 'wav' => 'audio/x-wav',
+ 'bmp' => 'image/bmp',
+ 'gif' => 'image/gif',
+ 'jpeg' => array('image/jpeg', 'image/pjpeg'),
+ 'jpg' => array('image/jpeg', 'image/pjpeg'),
+ 'jpe' => array('image/jpeg', 'image/pjpeg'),
+ 'png' => array('image/png', 'image/x-png'),
+ 'tiff' => 'image/tiff',
+ 'tif' => 'image/tiff',
+ 'css' => 'text/css',
+ 'html' => 'text/html',
+ 'htm' => 'text/html',
+ 'shtml' => 'text/html',
+ 'txt' => 'text/plain',
+ 'text' => 'text/plain',
+ 'log' => array('text/plain', 'text/x-log'),
+ 'rtx' => 'text/richtext',
+ 'rtf' => 'text/rtf',
+ 'xml' => 'text/xml',
+ 'xsl' => 'text/xml',
+ 'mpeg' => 'video/mpeg',
+ 'mpg' => 'video/mpeg',
+ 'mpe' => 'video/mpeg',
+ 'qt' => 'video/quicktime',
+ 'mov' => 'video/quicktime',
+ 'avi' => 'video/x-msvideo',
+ 'movie' => 'video/x-sgi-movie',
+ 'doc' => 'application/msword',
+ 'word' => array('application/msword', 'application/octet-stream'),
+ 'xl' => 'application/excel',
+ 'eml' => 'message/rfc822'
+ );
+
+
+?>
\ No newline at end of file
diff --git a/system/application/config/.svn/text-base/routes.php.svn-base b/system/application/config/.svn/text-base/routes.php.svn-base
new file mode 100644
index 0000000..d7e13ac
--- /dev/null
+++ b/system/application/config/.svn/text-base/routes.php.svn-base
@@ -0,0 +1,53 @@
+
\ No newline at end of file
diff --git a/system/application/config/.svn/text-base/smileys.php.svn-base b/system/application/config/.svn/text-base/smileys.php.svn-base
new file mode 100644
index 0000000..a227d8b
--- /dev/null
+++ b/system/application/config/.svn/text-base/smileys.php.svn-base
@@ -0,0 +1,64 @@
+ array('grin.gif', '19', '19', 'grin'),
+ ':lol:' => array('lol.gif', '19', '19', 'LOL'),
+ ':cheese:' => array('cheese.gif', '19', '19', 'cheese'),
+ ':)' => array('smile.gif', '19', '19', 'smile'),
+ ';-)' => array('wink.gif', '19', '19', 'wink'),
+ ';)' => array('wink.gif', '19', '19', 'wink'),
+ ':smirk:' => array('smirk.gif', '19', '19', 'smirk'),
+ ':roll:' => array('rolleyes.gif', '19', '19', 'rolleyes'),
+ ':-S' => array('confused.gif', '19', '19', 'confused'),
+ ':wow:' => array('surprise.gif', '19', '19', 'surprised'),
+ ':bug:' => array('bigsurprise.gif', '19', '19', 'big surprise'),
+ ':-P' => array('tongue_laugh.gif', '19', '19', 'tongue laugh'),
+ '%-P' => array('tongue_rolleye.gif', '19', '19', 'tongue rolleye'),
+ ';-P' => array('tongue_wink.gif', '19', '19', 'tongue wink'),
+ ':P' => array('rasberry.gif', '19', '19', 'rasberry'),
+ ':blank:' => array('blank.gif', '19', '19', 'blank stare'),
+ ':long:' => array('longface.gif', '19', '19', 'long face'),
+ ':ohh:' => array('ohh.gif', '19', '19', 'ohh'),
+ ':grrr:' => array('grrr.gif', '19', '19', 'grrr'),
+ ':gulp:' => array('gulp.gif', '19', '19', 'gulp'),
+ '8-/' => array('ohoh.gif', '19', '19', 'oh oh'),
+ ':down:' => array('downer.gif', '19', '19', 'downer'),
+ ':red:' => array('embarrassed.gif', '19', '19', 'red face'),
+ ':sick:' => array('sick.gif', '19', '19', 'sick'),
+ ':shut:' => array('shuteye.gif', '19', '19', 'shut eye'),
+ ':-/' => array('hmm.gif', '19', '19', 'hmmm'),
+ '>:(' => array('mad.gif', '19', '19', 'mad'),
+ ':mad:' => array('mad.gif', '19', '19', 'mad'),
+ '>:-(' => array('angry.gif', '19', '19', 'angry'),
+ ':angry:' => array('angry.gif', '19', '19', 'angry'),
+ ':zip:' => array('zip.gif', '19', '19', 'zipper'),
+ ':kiss:' => array('kiss.gif', '19', '19', 'kiss'),
+ ':ahhh:' => array('shock.gif', '19', '19', 'shock'),
+ ':coolsmile:' => array('shade_smile.gif', '19', '19', 'cool smile'),
+ ':coolsmirk:' => array('shade_smirk.gif', '19', '19', 'cool smirk'),
+ ':coolgrin:' => array('shade_grin.gif', '19', '19', 'cool grin'),
+ ':coolhmm:' => array('shade_hmm.gif', '19', '19', 'cool hmm'),
+ ':coolmad:' => array('shade_mad.gif', '19', '19', 'cool mad'),
+ ':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'),
+ ':vampire:' => array('vampire.gif', '19', '19', 'vampire'),
+ ':snake:' => array('snake.gif', '19', '19', 'snake'),
+ ':exclaim:' => array('exclaim.gif', '19', '19', 'excaim'),
+ ':question:' => array('question.gif', '19', '19', 'question') // no comma after last item
+
+ );
+?>
\ No newline at end of file
diff --git a/system/application/config/.svn/text-base/user_agents.php.svn-base b/system/application/config/.svn/text-base/user_agents.php.svn-base
new file mode 100644
index 0000000..08a665f
--- /dev/null
+++ b/system/application/config/.svn/text-base/user_agents.php.svn-base
@@ -0,0 +1,103 @@
+ 'Windows Longhorn',
+ 'windows nt 5.2' => 'Windows 2003',
+ 'windows nt 5.0' => 'Windows 2000',
+ 'windows nt 5.1' => 'Windows XP',
+ 'windows nt 4.0' => 'Windows NT 4.0',
+ 'winnt4.0' => 'Windows NT 4.0',
+ 'winnt 4.0' => 'Windows NT',
+ 'winnt' => 'Windows NT',
+ 'windows 98' => 'Windows 98',
+ 'win98' => 'Windows 98',
+ 'windows 95' => 'Windows 95',
+ 'win95' => 'Windows 95',
+ 'windows' => 'Unknown Windows OS',
+ 'os x' => 'Mac OS X',
+ 'ppc mac' => 'Power PC Mac',
+ 'freebsd' => 'FreeBSD',
+ 'ppc' => 'Macintosh',
+ 'linux' => 'Linux',
+ 'debian' => 'Debian',
+ 'sunos' => 'Sun Solaris',
+ 'beos' => 'BeOS',
+ 'apachebench' => 'ApacheBench',
+ 'aix' => 'AIX',
+ 'irix' => 'Irix',
+ 'osf' => 'DEC OSF',
+ 'hp-ux' => 'HP-UX',
+ 'netbsd' => 'NetBSD',
+ 'bsdi' => 'BSDi',
+ 'openbsd' => 'OpenBSD',
+ 'gnu' => 'GNU/Linux',
+ 'unix' => 'Unknown Unix OS'
+ );
+
+
+// The order of this array should NOT be changed. Many browsers return
+// multiple browser types so we want to identify the sub-type first.
+$browsers = array(
+ 'Opera' => 'Opera',
+ 'MSIE' => 'Internet Explorer',
+ 'Internet Explorer' => 'Internet Explorer',
+ 'Shiira' => 'Shiira',
+ 'Firefox' => 'Firefox',
+ 'Chimera' => 'Chimera',
+ 'Phoenix' => 'Phoenix',
+ 'Firebird' => 'Firebird',
+ 'Camino' => 'Camino',
+ 'Netscape' => 'Netscape',
+ 'OmniWeb' => 'OmniWeb',
+ 'Mozilla' => 'Mozilla',
+ 'Safari' => 'Safari',
+ 'Konqueror' => 'Konqueror',
+ 'icab' => 'iCab',
+ 'Lynx' => 'Lynx',
+ 'Links' => 'Links',
+ 'hotjava' => 'HotJava',
+ 'amaya' => 'Amaya',
+ 'IBrowse' => 'IBrowse'
+ );
+
+$mobiles = array(
+ 'mobileexplorer' => 'Mobile Explorer',
+ 'openwave' => 'Open Wave',
+ 'opera mini' => 'Opera Mini',
+ 'operamini' => 'Opera Mini',
+ 'elaine' => 'Palm',
+ 'palmsource' => 'Palm',
+ 'digital paths' => 'Palm',
+ 'avantgo' => 'Avantgo',
+ 'xiino' => 'Xiino',
+ 'palmscape' => 'Palmscape',
+ 'nokia' => 'Nokia',
+ 'ericsson' => 'Ericsson',
+ 'blackberry' => 'BlackBerry',
+ 'motorola' => 'Motorola'
+ );
+
+// There are hundreds of bots but these are the most common.
+$robots = array(
+ 'googlebot' => 'Googlebot',
+ 'msnbot' => 'MSNBot',
+ 'slurp' => 'Inktomi Slurp',
+ 'yahoo' => 'Yahoo',
+ 'askjeeves' => 'AskJeeves',
+ 'fastcrawler' => 'FastCrawler',
+ 'infoseek' => 'InfoSeek Robot 1.0',
+ 'lycos' => 'Lycos'
+ );
+
+
+?>
\ No newline at end of file
diff --git a/system/application/config/autoload.php b/system/application/config/autoload.php
new file mode 100755
index 0000000..539c72d
--- /dev/null
+++ b/system/application/config/autoload.php
@@ -0,0 +1,125 @@
+
\ No newline at end of file
diff --git a/system/application/config/config-sample.php b/system/application/config/config-sample.php
new file mode 100755
index 0000000..3e5aaf1
--- /dev/null
+++ b/system/application/config/config-sample.php
@@ -0,0 +1,314 @@
+
\ No newline at end of file
diff --git a/system/application/config/database-sample.php b/system/application/config/database-sample.php
new file mode 100755
index 0000000..0d0e08e
--- /dev/null
+++ b/system/application/config/database-sample.php
@@ -0,0 +1,53 @@
+
\ No newline at end of file
diff --git a/system/application/config/hooks.php b/system/application/config/hooks.php
new file mode 100755
index 0000000..f0a0d6e
--- /dev/null
+++ b/system/application/config/hooks.php
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/system/application/config/index.html b/system/application/config/index.html
new file mode 100755
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/config/index.html
@@ -0,0 +1,15 @@
+
+
+ Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/config/mimes.php b/system/application/config/mimes.php
new file mode 100755
index 0000000..225b0a5
--- /dev/null
+++ b/system/application/config/mimes.php
@@ -0,0 +1,102 @@
+ 'application/mac-binhex40',
+ 'cpt' => 'application/mac-compactpro',
+ 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel'),
+ 'bin' => 'application/macbinary',
+ 'dms' => 'application/octet-stream',
+ 'lha' => 'application/octet-stream',
+ 'lzh' => 'application/octet-stream',
+ 'exe' => 'application/octet-stream',
+ 'class' => 'application/octet-stream',
+ 'psd' => 'application/x-photoshop',
+ 'so' => 'application/octet-stream',
+ 'sea' => 'application/octet-stream',
+ 'dll' => 'application/octet-stream',
+ 'oda' => 'application/oda',
+ 'pdf' => array('application/pdf', 'application/x-download'),
+ 'ai' => 'application/postscript',
+ 'eps' => 'application/postscript',
+ 'ps' => 'application/postscript',
+ 'smi' => 'application/smil',
+ 'smil' => 'application/smil',
+ 'mif' => 'application/vnd.mif',
+ 'xls' => array('application/excel', 'application/vnd.ms-excel'),
+ 'ppt' => 'application/powerpoint',
+ 'wbxml' => 'application/wbxml',
+ 'wmlc' => 'application/wmlc',
+ 'dcr' => 'application/x-director',
+ 'dir' => 'application/x-director',
+ 'dxr' => 'application/x-director',
+ 'dvi' => 'application/x-dvi',
+ 'gtar' => 'application/x-gtar',
+ 'gz' => 'application/x-gzip',
+ 'php' => 'application/x-httpd-php',
+ 'php4' => 'application/x-httpd-php',
+ 'php3' => 'application/x-httpd-php',
+ 'phtml' => 'application/x-httpd-php',
+ 'phps' => 'application/x-httpd-php-source',
+ 'js' => 'application/x-javascript',
+ 'swf' => 'application/x-shockwave-flash',
+ 'sit' => 'application/x-stuffit',
+ 'tar' => 'application/x-tar',
+ 'tgz' => 'application/x-tar',
+ 'xhtml' => 'application/xhtml+xml',
+ 'xht' => 'application/xhtml+xml',
+ 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed'),
+ 'mid' => 'audio/midi',
+ 'midi' => 'audio/midi',
+ 'mpga' => 'audio/mpeg',
+ 'mp2' => 'audio/mpeg',
+ 'mp3' => 'audio/mpeg',
+ 'aif' => 'audio/x-aiff',
+ 'aiff' => 'audio/x-aiff',
+ 'aifc' => 'audio/x-aiff',
+ 'ram' => 'audio/x-pn-realaudio',
+ 'rm' => 'audio/x-pn-realaudio',
+ 'rpm' => 'audio/x-pn-realaudio-plugin',
+ 'ra' => 'audio/x-realaudio',
+ 'rv' => 'video/vnd.rn-realvideo',
+ 'wav' => 'audio/x-wav',
+ 'bmp' => 'image/bmp',
+ 'gif' => 'image/gif',
+ 'jpeg' => array('image/jpeg', 'image/pjpeg'),
+ 'jpg' => array('image/jpeg', 'image/pjpeg'),
+ 'jpe' => array('image/jpeg', 'image/pjpeg'),
+ 'png' => array('image/png', 'image/x-png'),
+ 'tiff' => 'image/tiff',
+ 'tif' => 'image/tiff',
+ 'css' => 'text/css',
+ 'html' => 'text/html',
+ 'htm' => 'text/html',
+ 'shtml' => 'text/html',
+ 'txt' => 'text/plain',
+ 'text' => 'text/plain',
+ 'log' => array('text/plain', 'text/x-log'),
+ 'rtx' => 'text/richtext',
+ 'rtf' => 'text/rtf',
+ 'xml' => 'text/xml',
+ 'xsl' => 'text/xml',
+ 'mpeg' => 'video/mpeg',
+ 'mpg' => 'video/mpeg',
+ 'mpe' => 'video/mpeg',
+ 'qt' => 'video/quicktime',
+ 'mov' => 'video/quicktime',
+ 'avi' => 'video/x-msvideo',
+ 'movie' => 'video/x-sgi-movie',
+ 'doc' => 'application/msword',
+ 'word' => array('application/msword', 'application/octet-stream'),
+ 'xl' => 'application/excel',
+ 'eml' => 'message/rfc822'
+ );
+
+
+?>
\ No newline at end of file
diff --git a/system/application/config/routes.php b/system/application/config/routes.php
new file mode 100755
index 0000000..d7e13ac
--- /dev/null
+++ b/system/application/config/routes.php
@@ -0,0 +1,53 @@
+
\ No newline at end of file
diff --git a/system/application/config/smileys.php b/system/application/config/smileys.php
new file mode 100755
index 0000000..a227d8b
--- /dev/null
+++ b/system/application/config/smileys.php
@@ -0,0 +1,64 @@
+ array('grin.gif', '19', '19', 'grin'),
+ ':lol:' => array('lol.gif', '19', '19', 'LOL'),
+ ':cheese:' => array('cheese.gif', '19', '19', 'cheese'),
+ ':)' => array('smile.gif', '19', '19', 'smile'),
+ ';-)' => array('wink.gif', '19', '19', 'wink'),
+ ';)' => array('wink.gif', '19', '19', 'wink'),
+ ':smirk:' => array('smirk.gif', '19', '19', 'smirk'),
+ ':roll:' => array('rolleyes.gif', '19', '19', 'rolleyes'),
+ ':-S' => array('confused.gif', '19', '19', 'confused'),
+ ':wow:' => array('surprise.gif', '19', '19', 'surprised'),
+ ':bug:' => array('bigsurprise.gif', '19', '19', 'big surprise'),
+ ':-P' => array('tongue_laugh.gif', '19', '19', 'tongue laugh'),
+ '%-P' => array('tongue_rolleye.gif', '19', '19', 'tongue rolleye'),
+ ';-P' => array('tongue_wink.gif', '19', '19', 'tongue wink'),
+ ':P' => array('rasberry.gif', '19', '19', 'rasberry'),
+ ':blank:' => array('blank.gif', '19', '19', 'blank stare'),
+ ':long:' => array('longface.gif', '19', '19', 'long face'),
+ ':ohh:' => array('ohh.gif', '19', '19', 'ohh'),
+ ':grrr:' => array('grrr.gif', '19', '19', 'grrr'),
+ ':gulp:' => array('gulp.gif', '19', '19', 'gulp'),
+ '8-/' => array('ohoh.gif', '19', '19', 'oh oh'),
+ ':down:' => array('downer.gif', '19', '19', 'downer'),
+ ':red:' => array('embarrassed.gif', '19', '19', 'red face'),
+ ':sick:' => array('sick.gif', '19', '19', 'sick'),
+ ':shut:' => array('shuteye.gif', '19', '19', 'shut eye'),
+ ':-/' => array('hmm.gif', '19', '19', 'hmmm'),
+ '>:(' => array('mad.gif', '19', '19', 'mad'),
+ ':mad:' => array('mad.gif', '19', '19', 'mad'),
+ '>:-(' => array('angry.gif', '19', '19', 'angry'),
+ ':angry:' => array('angry.gif', '19', '19', 'angry'),
+ ':zip:' => array('zip.gif', '19', '19', 'zipper'),
+ ':kiss:' => array('kiss.gif', '19', '19', 'kiss'),
+ ':ahhh:' => array('shock.gif', '19', '19', 'shock'),
+ ':coolsmile:' => array('shade_smile.gif', '19', '19', 'cool smile'),
+ ':coolsmirk:' => array('shade_smirk.gif', '19', '19', 'cool smirk'),
+ ':coolgrin:' => array('shade_grin.gif', '19', '19', 'cool grin'),
+ ':coolhmm:' => array('shade_hmm.gif', '19', '19', 'cool hmm'),
+ ':coolmad:' => array('shade_mad.gif', '19', '19', 'cool mad'),
+ ':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'),
+ ':vampire:' => array('vampire.gif', '19', '19', 'vampire'),
+ ':snake:' => array('snake.gif', '19', '19', 'snake'),
+ ':exclaim:' => array('exclaim.gif', '19', '19', 'excaim'),
+ ':question:' => array('question.gif', '19', '19', 'question') // no comma after last item
+
+ );
+?>
\ No newline at end of file
diff --git a/system/application/config/user_agents.php b/system/application/config/user_agents.php
new file mode 100755
index 0000000..08a665f
--- /dev/null
+++ b/system/application/config/user_agents.php
@@ -0,0 +1,103 @@
+ 'Windows Longhorn',
+ 'windows nt 5.2' => 'Windows 2003',
+ 'windows nt 5.0' => 'Windows 2000',
+ 'windows nt 5.1' => 'Windows XP',
+ 'windows nt 4.0' => 'Windows NT 4.0',
+ 'winnt4.0' => 'Windows NT 4.0',
+ 'winnt 4.0' => 'Windows NT',
+ 'winnt' => 'Windows NT',
+ 'windows 98' => 'Windows 98',
+ 'win98' => 'Windows 98',
+ 'windows 95' => 'Windows 95',
+ 'win95' => 'Windows 95',
+ 'windows' => 'Unknown Windows OS',
+ 'os x' => 'Mac OS X',
+ 'ppc mac' => 'Power PC Mac',
+ 'freebsd' => 'FreeBSD',
+ 'ppc' => 'Macintosh',
+ 'linux' => 'Linux',
+ 'debian' => 'Debian',
+ 'sunos' => 'Sun Solaris',
+ 'beos' => 'BeOS',
+ 'apachebench' => 'ApacheBench',
+ 'aix' => 'AIX',
+ 'irix' => 'Irix',
+ 'osf' => 'DEC OSF',
+ 'hp-ux' => 'HP-UX',
+ 'netbsd' => 'NetBSD',
+ 'bsdi' => 'BSDi',
+ 'openbsd' => 'OpenBSD',
+ 'gnu' => 'GNU/Linux',
+ 'unix' => 'Unknown Unix OS'
+ );
+
+
+// The order of this array should NOT be changed. Many browsers return
+// multiple browser types so we want to identify the sub-type first.
+$browsers = array(
+ 'Opera' => 'Opera',
+ 'MSIE' => 'Internet Explorer',
+ 'Internet Explorer' => 'Internet Explorer',
+ 'Shiira' => 'Shiira',
+ 'Firefox' => 'Firefox',
+ 'Chimera' => 'Chimera',
+ 'Phoenix' => 'Phoenix',
+ 'Firebird' => 'Firebird',
+ 'Camino' => 'Camino',
+ 'Netscape' => 'Netscape',
+ 'OmniWeb' => 'OmniWeb',
+ 'Mozilla' => 'Mozilla',
+ 'Safari' => 'Safari',
+ 'Konqueror' => 'Konqueror',
+ 'icab' => 'iCab',
+ 'Lynx' => 'Lynx',
+ 'Links' => 'Links',
+ 'hotjava' => 'HotJava',
+ 'amaya' => 'Amaya',
+ 'IBrowse' => 'IBrowse'
+ );
+
+$mobiles = array(
+ 'mobileexplorer' => 'Mobile Explorer',
+ 'openwave' => 'Open Wave',
+ 'opera mini' => 'Opera Mini',
+ 'operamini' => 'Opera Mini',
+ 'elaine' => 'Palm',
+ 'palmsource' => 'Palm',
+ 'digital paths' => 'Palm',
+ 'avantgo' => 'Avantgo',
+ 'xiino' => 'Xiino',
+ 'palmscape' => 'Palmscape',
+ 'nokia' => 'Nokia',
+ 'ericsson' => 'Ericsson',
+ 'blackberry' => 'BlackBerry',
+ 'motorola' => 'Motorola'
+ );
+
+// There are hundreds of bots but these are the most common.
+$robots = array(
+ 'googlebot' => 'Googlebot',
+ 'msnbot' => 'MSNBot',
+ 'slurp' => 'Inktomi Slurp',
+ 'yahoo' => 'Yahoo',
+ 'askjeeves' => 'AskJeeves',
+ 'fastcrawler' => 'FastCrawler',
+ 'infoseek' => 'InfoSeek Robot 1.0',
+ 'lycos' => 'Lycos'
+ );
+
+
+?>
\ No newline at end of file
diff --git a/system/application/controllers/.svn/all-wcprops b/system/application/controllers/.svn/all-wcprops
new file mode 100644
index 0000000..6648945
--- /dev/null
+++ b/system/application/controllers/.svn/all-wcprops
@@ -0,0 +1,41 @@
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/!svn/ver/124/trunk/system/application/controllers
+END
+p.php
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/!svn/ver/124/trunk/system/application/controllers/p.php
+END
+cron.php
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/!svn/ver/124/trunk/system/application/controllers/cron.php
+END
+items.php
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/!svn/ver/124/trunk/system/application/controllers/items.php
+END
+feed.php
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/!svn/ver/124/trunk/system/application/controllers/feed.php
+END
+index.html
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/!svn/ver/18/trunk/system/application/controllers/index.html
+END
+home.php
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/!svn/ver/124/trunk/system/application/controllers/home.php
+END
diff --git a/system/application/controllers/.svn/entries b/system/application/controllers/.svn/entries
new file mode 100644
index 0000000..1b66f91
--- /dev/null
+++ b/system/application/controllers/.svn/entries
@@ -0,0 +1,235 @@
+10
+
+dir
+124
+http://sweetcron.googlecode.com/svn/trunk/system/application/controllers
+http://sweetcron.googlecode.com/svn
+
+
+
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+51b50d7d-0b4b-0410-974b-f188aa86c7d9
+
+p.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+4c4f9e19be11bec2af84184ffddf4672
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1916
+
+cron.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+9cd1c44a456ca42ed9da963ef61cf1f8
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2071
+
+items.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+fd2aff5f140f6685783c2217a1edec7b
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2833
+
+admin
+dir
+
+feed.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+87ec197a083e6d260157e93ccaf15641
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2545
+
+index.html
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+362a648cc43551584abe596372cb8da8
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+149
+
+home.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+ab83c9b3543dab448a546cfcaa07933a
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1945
+
diff --git a/system/application/controllers/.svn/prop-base/index.html.svn-base b/system/application/controllers/.svn/prop-base/index.html.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/controllers/.svn/prop-base/index.html.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/controllers/.svn/text-base/cron.php.svn-base b/system/application/controllers/.svn/text-base/cron.php.svn-base
new file mode 100644
index 0000000..eae1bb2
--- /dev/null
+++ b/system/application/controllers/.svn/text-base/cron.php.svn-base
@@ -0,0 +1,53 @@
+config->item('cron_key')) {
+ $this->sweetcron->fetch_items();
+ } else {
+ die("Uh uh uh, you didn't say the magic word");
+ }
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/.svn/text-base/feed.php.svn-base b/system/application/controllers/.svn/text-base/feed.php.svn-base
new file mode 100644
index 0000000..f167e31
--- /dev/null
+++ b/system/application/controllers/.svn/text-base/feed.php.svn-base
@@ -0,0 +1,76 @@
+sweetcron->get_items_page('rss_feed', 1, TRUE);
+ }
+
+ function search($query = NULL)
+ {
+ if ($query) {
+ $this->sweetcron->get_items_page('rss_feed', 1, TRUE, $query, 'search');
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+
+ function tag($tag = NULL)
+ {
+ if ($tag) {
+ $this->sweetcron->get_items_page('rss_feed', 1, TRUE, $tag, 'tag');
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+
+ function site($feed_domain = NULL)
+ {
+ if ($feed_domain) {
+ $this->sweetcron->get_items_page('rss_feed', 1, TRUE, $feed_domain, 'site');
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/.svn/text-base/home.php.svn-base b/system/application/controllers/.svn/text-base/home.php.svn-base
new file mode 100644
index 0000000..3f0f82a
--- /dev/null
+++ b/system/application/controllers/.svn/text-base/home.php.svn-base
@@ -0,0 +1,49 @@
+sweetcron->get_items_page('index', $this->uri->segment(2,1), TRUE);
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/.svn/text-base/index.html.svn-base b/system/application/controllers/.svn/text-base/index.html.svn-base
new file mode 100644
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/controllers/.svn/text-base/index.html.svn-base
@@ -0,0 +1,15 @@
+
+
+ Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/controllers/.svn/text-base/items.php.svn-base b/system/application/controllers/.svn/text-base/items.php.svn-base
new file mode 100644
index 0000000..b8aa6b2
--- /dev/null
+++ b/system/application/controllers/.svn/text-base/items.php.svn-base
@@ -0,0 +1,91 @@
+sweetcron->do_search();
+ }
+
+ function index()
+ {
+ header('Location: '.$this->config->item('base_url'));
+ }
+
+ function search($query = NULL)
+ {
+ if ($query) {
+ $this->sweetcron->get_items_page('search', $this->uri->segment(5,1), TRUE, $query);
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+
+ function tag($tag = NULL)
+ {
+ if ($tag) {
+ $this->sweetcron->get_items_page('tag', $this->uri->segment(5,1), TRUE, $tag);
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+
+ function site($feed_domain = NULL)
+ {
+ if ($feed_domain) {
+ $this->sweetcron->get_items_page('site', $this->uri->segment(5,1), TRUE, $feed_domain);
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+
+ function view($item_id = NULL)
+ {
+ if ($item_id) {
+ $this->sweetcron->get_single_item_page($item_id);
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/.svn/text-base/p.php.svn-base b/system/application/controllers/.svn/text-base/p.php.svn-base
new file mode 100644
index 0000000..461d06f
--- /dev/null
+++ b/system/application/controllers/.svn/text-base/p.php.svn-base
@@ -0,0 +1,49 @@
+sweetcron->get_items_page('static_page');
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/.svn/all-wcprops b/system/application/controllers/admin/.svn/all-wcprops
new file mode 100644
index 0000000..edd06d1
--- /dev/null
+++ b/system/application/controllers/admin/.svn/all-wcprops
@@ -0,0 +1,59 @@
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/!svn/ver/124/trunk/system/application/controllers/admin
+END
+write.php
+K 25
+svn:wc:ra_dav:version-url
+V 70
+/svn/!svn/ver/124/trunk/system/application/controllers/admin/write.php
+END
+options.php
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/!svn/ver/124/trunk/system/application/controllers/admin/options.php
+END
+process.php
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/!svn/ver/124/trunk/system/application/controllers/admin/process.php
+END
+items.php
+K 25
+svn:wc:ra_dav:version-url
+V 70
+/svn/!svn/ver/124/trunk/system/application/controllers/admin/items.php
+END
+ajax.php
+K 25
+svn:wc:ra_dav:version-url
+V 69
+/svn/!svn/ver/124/trunk/system/application/controllers/admin/ajax.php
+END
+install.php
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/!svn/ver/124/trunk/system/application/controllers/admin/install.php
+END
+feeds.php
+K 25
+svn:wc:ra_dav:version-url
+V 70
+/svn/!svn/ver/124/trunk/system/application/controllers/admin/feeds.php
+END
+dashboard.php
+K 25
+svn:wc:ra_dav:version-url
+V 74
+/svn/!svn/ver/124/trunk/system/application/controllers/admin/dashboard.php
+END
+login.php
+K 25
+svn:wc:ra_dav:version-url
+V 69
+/svn/!svn/ver/18/trunk/system/application/controllers/admin/login.php
+END
diff --git a/system/application/controllers/admin/.svn/entries b/system/application/controllers/admin/.svn/entries
new file mode 100644
index 0000000..95623ca
--- /dev/null
+++ b/system/application/controllers/admin/.svn/entries
@@ -0,0 +1,334 @@
+10
+
+dir
+124
+http://sweetcron.googlecode.com/svn/trunk/system/application/controllers/admin
+http://sweetcron.googlecode.com/svn
+
+
+
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+51b50d7d-0b4b-0410-974b-f188aa86c7d9
+
+write.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+131d227ee499c28d9f7c55f2f4d61fc0
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5098
+
+options.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+56f8e6c8e1edb6f97bf84b78545dfcfd
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4239
+
+process.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+1f8d271db4a2b99b04fcd78112bd4935
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2212
+
+items.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+c9c62f4b97b734ede915af1b0e5adf28
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2885
+
+ajax.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+cc4207af311f603b78be4d214f94b26a
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2402
+
+install.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+f1b94107782361ed9dfe13d4aa2ecad6
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4698
+
+feeds.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+b8f63a402ccd50179ee5b3470b4bed5a
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4828
+
+dashboard.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+04d3bb1aec011ab54bf39e17a359d0f4
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2271
+
+login.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+ae5db605d38084541235b248c333a351
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4668
+
diff --git a/system/application/controllers/admin/.svn/text-base/ajax.php.svn-base b/system/application/controllers/admin/.svn/text-base/ajax.php.svn-base
new file mode 100644
index 0000000..6c0c31a
--- /dev/null
+++ b/system/application/controllers/admin/.svn/text-base/ajax.php.svn-base
@@ -0,0 +1,65 @@
+option_name = 'cron_key';
+ $option->option_value = substr(md5(time().$this->config->item('lifestream_title')), 0, 8);
+ $this->option_model->add_option($option);
+ echo $option->option_value;
+ }
+
+ function unpublish_item()
+ {
+ $item_id = $this->input->post('id');
+ $this->db->update('items', array('item_status' => 'draft'), array('ID' => $item_id));
+ }
+
+ function publish_item()
+ {
+ $item_id = $this->input->post('id');
+ $this->db->update('items', array('item_status' => 'publish'), array('ID' => $item_id));
+ }
+
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/.svn/text-base/dashboard.php.svn-base b/system/application/controllers/admin/.svn/text-base/dashboard.php.svn-base
new file mode 100644
index 0000000..d9aecca
--- /dev/null
+++ b/system/application/controllers/admin/.svn/text-base/dashboard.php.svn-base
@@ -0,0 +1,57 @@
+page_name = 'Dashboard';
+ $data->item_count = $this->item_model->count_all_items(TRUE);
+ $data->feed_count = $this->feed_model->count_active_feeds();
+ $data->items = $this->item_model->get_all_items(0, 5, TRUE);
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/dashboard', $data);
+ $this->load->view('admin/_footer');
+
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/.svn/text-base/feeds.php.svn-base b/system/application/controllers/admin/.svn/text-base/feeds.php.svn-base
new file mode 100644
index 0000000..f243eb3
--- /dev/null
+++ b/system/application/controllers/admin/.svn/text-base/feeds.php.svn-base
@@ -0,0 +1,129 @@
+page_name = 'Feeds';
+ $data->feeds = $this->feed_model->get_active_feeds();
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/feeds', $data);
+ $this->load->view('admin/_footer');
+ }
+
+ function add()
+ {
+ $data->page_name = 'Add Feed';
+ if ($_POST) {
+ if ($this->input->post('url') == 'http://') {
+ $_POST['url'] = '';
+ }
+ $this->load->library('validation');
+ $rules['url'] = "trim|required|callback__test_feed";
+ $this->validation->set_rules($rules);
+ if ($this->validation->run() == FALSE) {
+ $data->errors = $this->validation->error_string;
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/feed_add', $data);
+ } else {
+ $new->feed_title = $this->simplepie->get_title();
+ $new->feed_icon = $this->simplepie->get_favicon();
+ $new->feed_url = $this->validation->url;
+
+ $new->feed_status = 'active';
+
+ //use permalink because sometimes feed is on subdomain which screws up plugin compatibility
+ $url = parse_url($this->simplepie->get_permalink());
+ if (!$url['host']) {
+ $url = parse_url($this->validation->url);
+ }
+ if (substr($url['host'], 0, 4) == 'www.') {
+ $new->feed_domain = substr($url['host'], 4);
+ } else {
+ $new->feed_domain = $url['host'];
+ }
+ if (!$new->feed_icon) {
+ $new->feed_icon = 'http://'.$new->feed_domain.'/favicon.ico';
+ }
+ $this->feed_model->add_feed($new);
+ header('Location: '.$this->config->item('base_url').'admin/feeds');
+ }
+ } else {
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/feed_add', $data);
+ }
+ $this->load->view('admin/_footer');
+ }
+
+ function delete($feed_id)
+ {
+ $this->feed_model->delete_feed($feed_id);
+ header('Location: '.$this->config->item('base_url').'admin/feeds');
+ }
+
+ function _test_feed($url)
+ {
+ $this->simplepie->set_feed_url(prep_url($url));
+ $this->simplepie->enable_cache(FALSE);
+ $this->simplepie->init();
+ //check if already in the db
+ if ($this->db->get_where('feeds', array('feed_url' => $url))->row()) {
+ //if it was a deleted feed just reactivate it and forward to feed page
+ $feed = $this->db->get_where('feeds', array('feed_url' => $url))->row();
+ if ($feed->feed_status == 'deleted') {
+ $this->db->update('feeds', array('feed_status' => 'active'), array('feed_id' => $feed->feed_id));
+ header('Location: '.$this->config->item('base_url').'admin/feeds');
+ exit();
+ } else {
+ $this->validation->set_message('_test_feed', 'You already added that feed...');
+ return false;
+ }
+ } else if ($this->simplepie->error()) {
+ $this->validation->set_message('_test_feed', $this->simplepie->error());
+ return false;
+ } else {
+ //looks like the feed is ok
+ return true;
+ }
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/.svn/text-base/install.php.svn-base b/system/application/controllers/admin/.svn/text-base/install.php.svn-base
new file mode 100644
index 0000000..82f7d20
--- /dev/null
+++ b/system/application/controllers/admin/.svn/text-base/install.php.svn-base
@@ -0,0 +1,120 @@
+load->library('sweetcron');
+ $this->sweetcron->compatibility_check();
+ $this->sweetcron->install_check();
+ $data->page_name = 'Install';
+
+ if ($_POST) {
+ $this->load->library('validation');
+ $rules['lifestream_title'] = "trim|required";
+ $rules['username'] = "trim|required|min_length[5]|max_length[20]";
+ $rules['email'] = "trim|required|valid_email";
+ $this->validation->set_rules($rules);
+ if ($this->validation->run() == FALSE) {
+ $data->errors = $this->validation->error_string;
+ } else {
+ $this->load->helper('file');
+ $sql = read_file(BASEPATH.'utilities/install.sql');
+ $sql = str_replace('%DB_PREFIX%', $this->db->dbprefix, $sql);
+ $sql = explode('CREATE', $sql);
+ unset($sql[0]);
+ //install sql and pray to baby jebus
+ foreach ($sql as $snippet) {
+ $this->db->query('CREATE'.$snippet);
+ }
+ //populate options
+ $options->lifestream_title = array('option_name' => 'lifestream_title', 'option_value' => $this->validation->lifestream_title);
+ $options->admin_email = array('option_name' => 'admin_email', 'option_value' => $this->validation->email);
+ $options->per_page = array('option_name' => 'per_page', 'option_value' => 9);
+ $options->cron_type = array('option_name' => 'cron_type', 'option_value' => 'pseudo');
+ $cron_key = substr(md5(time().rand(1,100).$this->validation->lifestream_title.time()), 0, 8);
+ $options->cron_key = array('option_name' => 'cron_key', 'option_value' => $cron_key);
+ $options->theme = array('option_name' => 'theme', 'option_value' => 'sandbox');
+ $this->load->model('option_model');
+ foreach ($options as $option) {
+ $this->option_model->add_option($option);
+ }
+
+ //add user
+ $password = substr(md5(time().rand(1,100).$this->validation->lifestream_title), 0, 8);
+ $user->user_login = $this->validation->username;
+ $user->user_pass = md5($password);
+ $user->user_email = $this->validation->email;
+ $user->user_activation_key = md5(time());
+ $this->db->insert('users', $user);
+
+ //send email
+ $url = $this->config->item('base_url');
+ $this->load->library('email');
+
+ $this->email->from($this->validation->email, 'Sweetcron');
+ $this->email->to($this->validation->email);
+
+ $this->email->subject('[Sweetcron] Welcome to Sweetcron');
+ $this->email->message('You have successfully installed Sweetcron!
+
+Your login details are as follows:
+
+Username: '.$this->validation->username.'
+Password: '.$password.'
+
+Your Sweetcron site: '.$url.'
+
+Thanks and have fun!');
+
+ $this->email->send();
+ $data->success = TRUE;
+ $data->password = $password;
+ }
+ }
+
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/install', $data);
+ $this->load->view('admin/_footer');
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/.svn/text-base/items.php.svn-base b/system/application/controllers/admin/.svn/text-base/items.php.svn-base
new file mode 100644
index 0000000..91ff0dd
--- /dev/null
+++ b/system/application/controllers/admin/.svn/text-base/items.php.svn-base
@@ -0,0 +1,88 @@
+sweetcron->get_items_page('index', $this->uri->segment(4,1), FALSE);
+ }
+
+ function search($query = NULL)
+ {
+ if ($query) {
+ $this->sweetcron->get_items_page('search', $this->uri->segment(6,1), FALSE, $query);
+ } else {
+ header('Location: '.$this->config->item('base_url').'admin/items');
+ }
+ }
+
+ function tag($tag = NULL)
+ {
+ if ($tag) {
+ $this->sweetcron->get_items_page('tag', $this->uri->segment(6,1), FALSE, $tag);
+ } else {
+ header('Location: '.$this->config->item('base_url').'admin/items');
+ }
+ }
+
+ function site($feed_domain = NULL)
+ {
+ if ($feed_domain) {
+ $this->sweetcron->get_items_page('site', $this->uri->segment(6,1), FALSE, $feed_domain);
+ } else {
+ header('Location: '.$this->config->item('base_url').'admin/items');
+ }
+ }
+
+ function fetch()
+ {
+ $this->sweetcron->fetch_items();
+ header('Location: '.$_SERVER['HTTP_REFERER']);
+ }
+
+ function delete($item_id)
+ {
+ $this->item_model->delete_item($item_id);
+ header('Location: '.$_SERVER['HTTP_REFERER']);
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/.svn/text-base/login.php.svn-base b/system/application/controllers/admin/.svn/text-base/login.php.svn-base
new file mode 100644
index 0000000..155c492
--- /dev/null
+++ b/system/application/controllers/admin/.svn/text-base/login.php.svn-base
@@ -0,0 +1,130 @@
+data->user === FALSE) {
+ header('Location: '.$this->config->item('base_url').'admin');
+ }
+ }
+
+ function index() {
+ $data->page_name = 'Login';
+ $this->load->view('admin/_header', $data);
+ if ($_POST) {
+ $this->load->library('validation');
+ $rules['username'] = "required|trim";
+ $rules['password'] = "required|trim";
+ $this->validation->set_rules($rules);
+ if ($this->validation->run() == FALSE) {
+ $data->errors = $this->validation->error_string;
+ $this->load->view('admin/login', $data);
+ } else {
+ //passed validation but need to check if can log in
+ if (!$this->auth->try_login(array('user_login' => $this->validation->username, 'user_pass' => md5($this->validation->password)))) {
+ //authentication error
+ $data->errors = 'Usernames / Password incorrect';
+ $this->load->view('admin/login', $data);
+ } else {
+ header('Location: '.$this->config->item('base_url').'admin');
+ }
+ }
+ } else {
+ $this->load->view('admin/login');
+ }
+
+ $this->load->view('admin/_footer');
+ }
+
+ function forgot() {
+ $data->page_name = 'Password Reset';
+ $this->load->view('admin/_header', $data);
+ if ($_POST) {
+ $this->load->library('validation');
+ $rules['email'] = "required|trim|valid_email|callback__is_admin_email";
+ $this->validation->set_rules($rules);
+ if ($this->validation->run() == FALSE) {
+ $data->errors = $this->validation->error_string;
+ $this->load->view('admin/forgot', $data);
+ } else {
+ //change activation key and send a mail
+ $key = substr(md5(time().rand(1,100)),0,10);
+ $user->user_activation_key = $key;
+ $this->db->update('users', $user, array('user_email' => $this->validation->email));
+ $link = $this->config->item('base_url').'admin/login/reset_password/'.$key;
+ //send email
+ $this->load->library('email');
+
+ $this->email->from($this->validation->email, 'Sweetcron');
+ $this->email->to($this->validation->email);
+
+ $this->email->subject('[Sweetcron] Reset Password');
+ $this->email->message('You have initiated a password reset request.
+
+Click this link to reset your password:
+
+'.$link.'
+
+If you feel you have received this message in error, ignore this message and do not click the link.');
+
+ $this->email->send();
+ $data->success = TRUE;
+ $this->load->view('admin/forgot',$data);
+ }
+ } else {
+ $this->load->view('admin/forgot');
+ }
+
+ $this->load->view('admin/_footer');
+ }
+
+ function reset_password($key)
+ {
+ if ($user = $this->db->get_where('users', array('user_activation_key' => $key))->row()) {
+ //reset the activation key
+ $key = substr(md5(time().rand(1,100)),0,10);
+ $edited->user_activation_key = $key;
+ //reset users password
+ $password = substr(md5(time().rand(1,100).$this->config->item('lifestream_title')), 0, 8);
+ $edited->user_pass = md5($password);
+ $this->db->update('users', $edited, array('user_email' => $user->user_email));
+
+ $this->load->library('email');
+
+ $this->email->from($user->user_email, 'Sweetcron');
+ $this->email->to($user->user_email);
+
+ $this->email->subject('[Sweetcron] New Password');
+ $this->email->message('You initiated and confirmed a password reset request.
+
+Your login details are as follows:
+
+Username: '.$user->user_login.'
+Password: '.$password.'
+
+Thanks and have fun!');
+
+ $this->email->send();
+
+ die('Your password was reset - please check your email');
+ } else {
+ die("Uh uh uh, you didn't say the magic word!");
+ }
+ }
+
+ function _is_admin_email($email)
+ {
+ if ($this->db->get_where('users', array('user_email' => $email))->row()) {
+ return true;
+ } else {
+ $this->validation->set_message('_is_admin_email', 'That email is not registered with Sweetcron');
+ return false;
+ }
+ }
+
+ function bye()
+ {
+ $this->auth->logout();
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/.svn/text-base/options.php.svn-base b/system/application/controllers/admin/.svn/text-base/options.php.svn-base
new file mode 100644
index 0000000..88d5bf3
--- /dev/null
+++ b/system/application/controllers/admin/.svn/text-base/options.php.svn-base
@@ -0,0 +1,108 @@
+load->helper('file');
+ $this->load->helper('inflector');
+ $data->page_name = 'Options';
+ $theme_folder = get_dir_file_info(BASEPATH.'application/views/themes', FALSE, TRUE);
+ foreach ($theme_folder as $key => $value) {
+ if (is_dir(BASEPATH.'application/views/themes/'.$key)) {
+ $themes[$key]->folder = $key;
+ $themes[$key]->name = humanize($key);
+ }
+ }
+ $data->themes = $themes;
+
+ if ($_POST) {
+ $this->load->library('validation');
+ $fields['lifestream_title'] = 'Lifestream Title';
+ $fields['admin_email'] = 'Admin Email';
+ $fields['new_password'] = 'New Password';
+ $fields['new_password_confirm'] = 'New Password Confirm';
+ $fields['per_page'] = 'Items Per Page';
+
+ $this->validation->set_fields($fields);
+
+ $rules['lifestream_title'] = "trim|required";
+ $rules['admin_email'] = "trim|required|valid_email";
+ $rules['new_password'] = "trim|matches[new_password_confirm]";
+ $rules['new_password_confirm'] = "trim";
+ $rules['per_page'] = "numeric";
+ $this->validation->set_rules($rules);
+ if ($this->validation->run() == FALSE) {
+ $data->errors = $this->validation->error_string;
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/options', $data);
+ $this->load->view('admin/_footer');
+ } else {
+ //set new password if required
+ if ($this->validation->new_password && $this->validation->new_password != '') {
+ $password = md5($this->validation->new_password);
+ $this->db->update('users', array('user_pass' => $password), array('ID' => $this->data->user->ID));
+ }
+ //set admin email
+ $this->db->update('users', array('user_email' => $this->validation->admin_email), array('ID' => $this->data->user->ID));
+
+ unset($_POST['new_password']);
+ unset($_POST['new_password_confirm']);
+ //save options
+ foreach ($_POST as $key => $value) {
+ $option_array[$key]->option_name = $key;
+ $option_array[$key]->option_value = $value;
+ }
+ foreach ($option_array as $option) {
+ $this->option_model->add_option($option);
+ }
+ header('Location: '.$this->config->item('base_url').'admin/options');
+ }
+ } else {
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/options', $data);
+ $this->load->view('admin/_footer');
+ }
+
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/.svn/text-base/process.php.svn-base b/system/application/controllers/admin/.svn/text-base/process.php.svn-base
new file mode 100644
index 0000000..e6cf8db
--- /dev/null
+++ b/system/application/controllers/admin/.svn/text-base/process.php.svn-base
@@ -0,0 +1,56 @@
+input->post('keywords')) {
+ //strip out stuff and send to page
+ $keywords = urlencode($this->input->post('keywords'));
+ header('Location: '.$this->config->item('base_url').'admin/items/search/'.$keywords);
+ } else {
+ show_error('You must type some keywords to search');
+ }
+ }
+
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/.svn/text-base/write.php.svn-base b/system/application/controllers/admin/.svn/text-base/write.php.svn-base
new file mode 100644
index 0000000..69c8e25
--- /dev/null
+++ b/system/application/controllers/admin/.svn/text-base/write.php.svn-base
@@ -0,0 +1,126 @@
+uri->segment(3) == 'edit') {
+ if ($this->input->post('referer')) {
+ $data->referer = $this->input->post('referer');
+ } else {
+ $data->referer = $_SERVER['HTTP_REFERER'];
+ }
+ $data->editing = TRUE;
+ //get item
+ $data->item = $this->item_model->get_edit_item_by_id($this->uri->segment(4));
+ if (isset($data->item->item_tags[0])) {
+ foreach ($data->item->item_tags as $tag) {
+ $tags[] = $tag->name;
+ }
+ $data->tag_string = implode(', ', $tags);
+ }
+ $new_post->item_data = $data->item->item_data;
+ }
+ $data->page_name = 'Write';
+ if ($_POST) {
+ $this->load->library('validation');
+ $rules['title'] = "trim|required|xss_clean";
+ $rules['date'] = "trim|xss_clean";
+ $rules['content'] = "trim|xss_clean";
+ $rules['tags'] = "trim|xss_clean";
+ $this->validation->set_rules($rules);
+ if ($this->validation->run() == FALSE) {
+ $data->errors = $this->validation->error_string;
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/write', $data);
+ } else {
+ //prepare data
+ if (!isset($data->editing)) {
+ $new_post->item_data = array();
+ }
+ if ($this->validation->tags) {
+ $tags = explode(',', $this->validation->tags);
+ foreach ($tags as $key => $value) {
+ $tags[$key] = trim($value);
+ }
+ if (isset($tags[0])) {
+ $new_post->item_data['tags'] = $tags;
+ }
+ }
+
+ $new_post->item_title = $this->validation->title;
+ if (!$this->validation->content) {
+ $new_post->item_content = '';
+ } else {
+ $new_post->item_content = $this->validation->content;
+ }
+
+ if ($this->input->post('save_edit') == 'true') {
+ //save edits
+ if ($this->input->post('timestamp') == 'make_current') {
+ $new_post->item_date = time();
+ } elseif ($this->input->post('timestamp') == 'make_current_publish') {
+ $new_post->item_status = 'publish';
+ $new_post->item_date = time();
+ }
+ $this->item_model->update_item($new_post, $data->item);
+ header('Location: '.$this->input->post('referer'));
+ } else {
+ //add new item
+ $new_post->item_name = url_title($this->validation->title);
+ $new_post->item_date = time();
+ if ($this->input->post('draft') == 'true') {
+ $new_post->item_status = 'draft';
+ }
+ $this->item_model->add_blog_post($new_post);
+ header('Location: '.$this->config->item('base_url').'admin/items');
+ }
+ }
+ } else {
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/write', $data);
+ }
+ $this->load->view('admin/_footer');
+ }
+
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/ajax.php b/system/application/controllers/admin/ajax.php
new file mode 100644
index 0000000..6c0c31a
--- /dev/null
+++ b/system/application/controllers/admin/ajax.php
@@ -0,0 +1,65 @@
+option_name = 'cron_key';
+ $option->option_value = substr(md5(time().$this->config->item('lifestream_title')), 0, 8);
+ $this->option_model->add_option($option);
+ echo $option->option_value;
+ }
+
+ function unpublish_item()
+ {
+ $item_id = $this->input->post('id');
+ $this->db->update('items', array('item_status' => 'draft'), array('ID' => $item_id));
+ }
+
+ function publish_item()
+ {
+ $item_id = $this->input->post('id');
+ $this->db->update('items', array('item_status' => 'publish'), array('ID' => $item_id));
+ }
+
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/dashboard.php b/system/application/controllers/admin/dashboard.php
new file mode 100644
index 0000000..d9aecca
--- /dev/null
+++ b/system/application/controllers/admin/dashboard.php
@@ -0,0 +1,57 @@
+page_name = 'Dashboard';
+ $data->item_count = $this->item_model->count_all_items(TRUE);
+ $data->feed_count = $this->feed_model->count_active_feeds();
+ $data->items = $this->item_model->get_all_items(0, 5, TRUE);
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/dashboard', $data);
+ $this->load->view('admin/_footer');
+
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/feeds.php b/system/application/controllers/admin/feeds.php
new file mode 100644
index 0000000..f243eb3
--- /dev/null
+++ b/system/application/controllers/admin/feeds.php
@@ -0,0 +1,129 @@
+page_name = 'Feeds';
+ $data->feeds = $this->feed_model->get_active_feeds();
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/feeds', $data);
+ $this->load->view('admin/_footer');
+ }
+
+ function add()
+ {
+ $data->page_name = 'Add Feed';
+ if ($_POST) {
+ if ($this->input->post('url') == 'http://') {
+ $_POST['url'] = '';
+ }
+ $this->load->library('validation');
+ $rules['url'] = "trim|required|callback__test_feed";
+ $this->validation->set_rules($rules);
+ if ($this->validation->run() == FALSE) {
+ $data->errors = $this->validation->error_string;
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/feed_add', $data);
+ } else {
+ $new->feed_title = $this->simplepie->get_title();
+ $new->feed_icon = $this->simplepie->get_favicon();
+ $new->feed_url = $this->validation->url;
+
+ $new->feed_status = 'active';
+
+ //use permalink because sometimes feed is on subdomain which screws up plugin compatibility
+ $url = parse_url($this->simplepie->get_permalink());
+ if (!$url['host']) {
+ $url = parse_url($this->validation->url);
+ }
+ if (substr($url['host'], 0, 4) == 'www.') {
+ $new->feed_domain = substr($url['host'], 4);
+ } else {
+ $new->feed_domain = $url['host'];
+ }
+ if (!$new->feed_icon) {
+ $new->feed_icon = 'http://'.$new->feed_domain.'/favicon.ico';
+ }
+ $this->feed_model->add_feed($new);
+ header('Location: '.$this->config->item('base_url').'admin/feeds');
+ }
+ } else {
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/feed_add', $data);
+ }
+ $this->load->view('admin/_footer');
+ }
+
+ function delete($feed_id)
+ {
+ $this->feed_model->delete_feed($feed_id);
+ header('Location: '.$this->config->item('base_url').'admin/feeds');
+ }
+
+ function _test_feed($url)
+ {
+ $this->simplepie->set_feed_url(prep_url($url));
+ $this->simplepie->enable_cache(FALSE);
+ $this->simplepie->init();
+ //check if already in the db
+ if ($this->db->get_where('feeds', array('feed_url' => $url))->row()) {
+ //if it was a deleted feed just reactivate it and forward to feed page
+ $feed = $this->db->get_where('feeds', array('feed_url' => $url))->row();
+ if ($feed->feed_status == 'deleted') {
+ $this->db->update('feeds', array('feed_status' => 'active'), array('feed_id' => $feed->feed_id));
+ header('Location: '.$this->config->item('base_url').'admin/feeds');
+ exit();
+ } else {
+ $this->validation->set_message('_test_feed', 'You already added that feed...');
+ return false;
+ }
+ } else if ($this->simplepie->error()) {
+ $this->validation->set_message('_test_feed', $this->simplepie->error());
+ return false;
+ } else {
+ //looks like the feed is ok
+ return true;
+ }
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/install.php b/system/application/controllers/admin/install.php
new file mode 100644
index 0000000..82f7d20
--- /dev/null
+++ b/system/application/controllers/admin/install.php
@@ -0,0 +1,120 @@
+load->library('sweetcron');
+ $this->sweetcron->compatibility_check();
+ $this->sweetcron->install_check();
+ $data->page_name = 'Install';
+
+ if ($_POST) {
+ $this->load->library('validation');
+ $rules['lifestream_title'] = "trim|required";
+ $rules['username'] = "trim|required|min_length[5]|max_length[20]";
+ $rules['email'] = "trim|required|valid_email";
+ $this->validation->set_rules($rules);
+ if ($this->validation->run() == FALSE) {
+ $data->errors = $this->validation->error_string;
+ } else {
+ $this->load->helper('file');
+ $sql = read_file(BASEPATH.'utilities/install.sql');
+ $sql = str_replace('%DB_PREFIX%', $this->db->dbprefix, $sql);
+ $sql = explode('CREATE', $sql);
+ unset($sql[0]);
+ //install sql and pray to baby jebus
+ foreach ($sql as $snippet) {
+ $this->db->query('CREATE'.$snippet);
+ }
+ //populate options
+ $options->lifestream_title = array('option_name' => 'lifestream_title', 'option_value' => $this->validation->lifestream_title);
+ $options->admin_email = array('option_name' => 'admin_email', 'option_value' => $this->validation->email);
+ $options->per_page = array('option_name' => 'per_page', 'option_value' => 9);
+ $options->cron_type = array('option_name' => 'cron_type', 'option_value' => 'pseudo');
+ $cron_key = substr(md5(time().rand(1,100).$this->validation->lifestream_title.time()), 0, 8);
+ $options->cron_key = array('option_name' => 'cron_key', 'option_value' => $cron_key);
+ $options->theme = array('option_name' => 'theme', 'option_value' => 'sandbox');
+ $this->load->model('option_model');
+ foreach ($options as $option) {
+ $this->option_model->add_option($option);
+ }
+
+ //add user
+ $password = substr(md5(time().rand(1,100).$this->validation->lifestream_title), 0, 8);
+ $user->user_login = $this->validation->username;
+ $user->user_pass = md5($password);
+ $user->user_email = $this->validation->email;
+ $user->user_activation_key = md5(time());
+ $this->db->insert('users', $user);
+
+ //send email
+ $url = $this->config->item('base_url');
+ $this->load->library('email');
+
+ $this->email->from($this->validation->email, 'Sweetcron');
+ $this->email->to($this->validation->email);
+
+ $this->email->subject('[Sweetcron] Welcome to Sweetcron');
+ $this->email->message('You have successfully installed Sweetcron!
+
+Your login details are as follows:
+
+Username: '.$this->validation->username.'
+Password: '.$password.'
+
+Your Sweetcron site: '.$url.'
+
+Thanks and have fun!');
+
+ $this->email->send();
+ $data->success = TRUE;
+ $data->password = $password;
+ }
+ }
+
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/install', $data);
+ $this->load->view('admin/_footer');
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/items.php b/system/application/controllers/admin/items.php
new file mode 100644
index 0000000..91ff0dd
--- /dev/null
+++ b/system/application/controllers/admin/items.php
@@ -0,0 +1,88 @@
+sweetcron->get_items_page('index', $this->uri->segment(4,1), FALSE);
+ }
+
+ function search($query = NULL)
+ {
+ if ($query) {
+ $this->sweetcron->get_items_page('search', $this->uri->segment(6,1), FALSE, $query);
+ } else {
+ header('Location: '.$this->config->item('base_url').'admin/items');
+ }
+ }
+
+ function tag($tag = NULL)
+ {
+ if ($tag) {
+ $this->sweetcron->get_items_page('tag', $this->uri->segment(6,1), FALSE, $tag);
+ } else {
+ header('Location: '.$this->config->item('base_url').'admin/items');
+ }
+ }
+
+ function site($feed_domain = NULL)
+ {
+ if ($feed_domain) {
+ $this->sweetcron->get_items_page('site', $this->uri->segment(6,1), FALSE, $feed_domain);
+ } else {
+ header('Location: '.$this->config->item('base_url').'admin/items');
+ }
+ }
+
+ function fetch()
+ {
+ $this->sweetcron->fetch_items();
+ header('Location: '.$_SERVER['HTTP_REFERER']);
+ }
+
+ function delete($item_id)
+ {
+ $this->item_model->delete_item($item_id);
+ header('Location: '.$_SERVER['HTTP_REFERER']);
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/login.php b/system/application/controllers/admin/login.php
new file mode 100644
index 0000000..155c492
--- /dev/null
+++ b/system/application/controllers/admin/login.php
@@ -0,0 +1,130 @@
+data->user === FALSE) {
+ header('Location: '.$this->config->item('base_url').'admin');
+ }
+ }
+
+ function index() {
+ $data->page_name = 'Login';
+ $this->load->view('admin/_header', $data);
+ if ($_POST) {
+ $this->load->library('validation');
+ $rules['username'] = "required|trim";
+ $rules['password'] = "required|trim";
+ $this->validation->set_rules($rules);
+ if ($this->validation->run() == FALSE) {
+ $data->errors = $this->validation->error_string;
+ $this->load->view('admin/login', $data);
+ } else {
+ //passed validation but need to check if can log in
+ if (!$this->auth->try_login(array('user_login' => $this->validation->username, 'user_pass' => md5($this->validation->password)))) {
+ //authentication error
+ $data->errors = 'Usernames / Password incorrect';
+ $this->load->view('admin/login', $data);
+ } else {
+ header('Location: '.$this->config->item('base_url').'admin');
+ }
+ }
+ } else {
+ $this->load->view('admin/login');
+ }
+
+ $this->load->view('admin/_footer');
+ }
+
+ function forgot() {
+ $data->page_name = 'Password Reset';
+ $this->load->view('admin/_header', $data);
+ if ($_POST) {
+ $this->load->library('validation');
+ $rules['email'] = "required|trim|valid_email|callback__is_admin_email";
+ $this->validation->set_rules($rules);
+ if ($this->validation->run() == FALSE) {
+ $data->errors = $this->validation->error_string;
+ $this->load->view('admin/forgot', $data);
+ } else {
+ //change activation key and send a mail
+ $key = substr(md5(time().rand(1,100)),0,10);
+ $user->user_activation_key = $key;
+ $this->db->update('users', $user, array('user_email' => $this->validation->email));
+ $link = $this->config->item('base_url').'admin/login/reset_password/'.$key;
+ //send email
+ $this->load->library('email');
+
+ $this->email->from($this->validation->email, 'Sweetcron');
+ $this->email->to($this->validation->email);
+
+ $this->email->subject('[Sweetcron] Reset Password');
+ $this->email->message('You have initiated a password reset request.
+
+Click this link to reset your password:
+
+'.$link.'
+
+If you feel you have received this message in error, ignore this message and do not click the link.');
+
+ $this->email->send();
+ $data->success = TRUE;
+ $this->load->view('admin/forgot',$data);
+ }
+ } else {
+ $this->load->view('admin/forgot');
+ }
+
+ $this->load->view('admin/_footer');
+ }
+
+ function reset_password($key)
+ {
+ if ($user = $this->db->get_where('users', array('user_activation_key' => $key))->row()) {
+ //reset the activation key
+ $key = substr(md5(time().rand(1,100)),0,10);
+ $edited->user_activation_key = $key;
+ //reset users password
+ $password = substr(md5(time().rand(1,100).$this->config->item('lifestream_title')), 0, 8);
+ $edited->user_pass = md5($password);
+ $this->db->update('users', $edited, array('user_email' => $user->user_email));
+
+ $this->load->library('email');
+
+ $this->email->from($user->user_email, 'Sweetcron');
+ $this->email->to($user->user_email);
+
+ $this->email->subject('[Sweetcron] New Password');
+ $this->email->message('You initiated and confirmed a password reset request.
+
+Your login details are as follows:
+
+Username: '.$user->user_login.'
+Password: '.$password.'
+
+Thanks and have fun!');
+
+ $this->email->send();
+
+ die('Your password was reset - please check your email');
+ } else {
+ die("Uh uh uh, you didn't say the magic word!");
+ }
+ }
+
+ function _is_admin_email($email)
+ {
+ if ($this->db->get_where('users', array('user_email' => $email))->row()) {
+ return true;
+ } else {
+ $this->validation->set_message('_is_admin_email', 'That email is not registered with Sweetcron');
+ return false;
+ }
+ }
+
+ function bye()
+ {
+ $this->auth->logout();
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/options.php b/system/application/controllers/admin/options.php
new file mode 100644
index 0000000..88d5bf3
--- /dev/null
+++ b/system/application/controllers/admin/options.php
@@ -0,0 +1,108 @@
+load->helper('file');
+ $this->load->helper('inflector');
+ $data->page_name = 'Options';
+ $theme_folder = get_dir_file_info(BASEPATH.'application/views/themes', FALSE, TRUE);
+ foreach ($theme_folder as $key => $value) {
+ if (is_dir(BASEPATH.'application/views/themes/'.$key)) {
+ $themes[$key]->folder = $key;
+ $themes[$key]->name = humanize($key);
+ }
+ }
+ $data->themes = $themes;
+
+ if ($_POST) {
+ $this->load->library('validation');
+ $fields['lifestream_title'] = 'Lifestream Title';
+ $fields['admin_email'] = 'Admin Email';
+ $fields['new_password'] = 'New Password';
+ $fields['new_password_confirm'] = 'New Password Confirm';
+ $fields['per_page'] = 'Items Per Page';
+
+ $this->validation->set_fields($fields);
+
+ $rules['lifestream_title'] = "trim|required";
+ $rules['admin_email'] = "trim|required|valid_email";
+ $rules['new_password'] = "trim|matches[new_password_confirm]";
+ $rules['new_password_confirm'] = "trim";
+ $rules['per_page'] = "numeric";
+ $this->validation->set_rules($rules);
+ if ($this->validation->run() == FALSE) {
+ $data->errors = $this->validation->error_string;
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/options', $data);
+ $this->load->view('admin/_footer');
+ } else {
+ //set new password if required
+ if ($this->validation->new_password && $this->validation->new_password != '') {
+ $password = md5($this->validation->new_password);
+ $this->db->update('users', array('user_pass' => $password), array('ID' => $this->data->user->ID));
+ }
+ //set admin email
+ $this->db->update('users', array('user_email' => $this->validation->admin_email), array('ID' => $this->data->user->ID));
+
+ unset($_POST['new_password']);
+ unset($_POST['new_password_confirm']);
+ //save options
+ foreach ($_POST as $key => $value) {
+ $option_array[$key]->option_name = $key;
+ $option_array[$key]->option_value = $value;
+ }
+ foreach ($option_array as $option) {
+ $this->option_model->add_option($option);
+ }
+ header('Location: '.$this->config->item('base_url').'admin/options');
+ }
+ } else {
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/options', $data);
+ $this->load->view('admin/_footer');
+ }
+
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/process.php b/system/application/controllers/admin/process.php
new file mode 100644
index 0000000..e6cf8db
--- /dev/null
+++ b/system/application/controllers/admin/process.php
@@ -0,0 +1,56 @@
+input->post('keywords')) {
+ //strip out stuff and send to page
+ $keywords = urlencode($this->input->post('keywords'));
+ header('Location: '.$this->config->item('base_url').'admin/items/search/'.$keywords);
+ } else {
+ show_error('You must type some keywords to search');
+ }
+ }
+
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/admin/write.php b/system/application/controllers/admin/write.php
new file mode 100644
index 0000000..69c8e25
--- /dev/null
+++ b/system/application/controllers/admin/write.php
@@ -0,0 +1,126 @@
+uri->segment(3) == 'edit') {
+ if ($this->input->post('referer')) {
+ $data->referer = $this->input->post('referer');
+ } else {
+ $data->referer = $_SERVER['HTTP_REFERER'];
+ }
+ $data->editing = TRUE;
+ //get item
+ $data->item = $this->item_model->get_edit_item_by_id($this->uri->segment(4));
+ if (isset($data->item->item_tags[0])) {
+ foreach ($data->item->item_tags as $tag) {
+ $tags[] = $tag->name;
+ }
+ $data->tag_string = implode(', ', $tags);
+ }
+ $new_post->item_data = $data->item->item_data;
+ }
+ $data->page_name = 'Write';
+ if ($_POST) {
+ $this->load->library('validation');
+ $rules['title'] = "trim|required|xss_clean";
+ $rules['date'] = "trim|xss_clean";
+ $rules['content'] = "trim|xss_clean";
+ $rules['tags'] = "trim|xss_clean";
+ $this->validation->set_rules($rules);
+ if ($this->validation->run() == FALSE) {
+ $data->errors = $this->validation->error_string;
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/write', $data);
+ } else {
+ //prepare data
+ if (!isset($data->editing)) {
+ $new_post->item_data = array();
+ }
+ if ($this->validation->tags) {
+ $tags = explode(',', $this->validation->tags);
+ foreach ($tags as $key => $value) {
+ $tags[$key] = trim($value);
+ }
+ if (isset($tags[0])) {
+ $new_post->item_data['tags'] = $tags;
+ }
+ }
+
+ $new_post->item_title = $this->validation->title;
+ if (!$this->validation->content) {
+ $new_post->item_content = '';
+ } else {
+ $new_post->item_content = $this->validation->content;
+ }
+
+ if ($this->input->post('save_edit') == 'true') {
+ //save edits
+ if ($this->input->post('timestamp') == 'make_current') {
+ $new_post->item_date = time();
+ } elseif ($this->input->post('timestamp') == 'make_current_publish') {
+ $new_post->item_status = 'publish';
+ $new_post->item_date = time();
+ }
+ $this->item_model->update_item($new_post, $data->item);
+ header('Location: '.$this->input->post('referer'));
+ } else {
+ //add new item
+ $new_post->item_name = url_title($this->validation->title);
+ $new_post->item_date = time();
+ if ($this->input->post('draft') == 'true') {
+ $new_post->item_status = 'draft';
+ }
+ $this->item_model->add_blog_post($new_post);
+ header('Location: '.$this->config->item('base_url').'admin/items');
+ }
+ }
+ } else {
+ $this->load->view('admin/_header', $data);
+ $this->load->view('admin/write', $data);
+ }
+ $this->load->view('admin/_footer');
+ }
+
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/cron.php b/system/application/controllers/cron.php
new file mode 100644
index 0000000..eae1bb2
--- /dev/null
+++ b/system/application/controllers/cron.php
@@ -0,0 +1,53 @@
+config->item('cron_key')) {
+ $this->sweetcron->fetch_items();
+ } else {
+ die("Uh uh uh, you didn't say the magic word");
+ }
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/feed.php b/system/application/controllers/feed.php
new file mode 100644
index 0000000..f167e31
--- /dev/null
+++ b/system/application/controllers/feed.php
@@ -0,0 +1,76 @@
+sweetcron->get_items_page('rss_feed', 1, TRUE);
+ }
+
+ function search($query = NULL)
+ {
+ if ($query) {
+ $this->sweetcron->get_items_page('rss_feed', 1, TRUE, $query, 'search');
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+
+ function tag($tag = NULL)
+ {
+ if ($tag) {
+ $this->sweetcron->get_items_page('rss_feed', 1, TRUE, $tag, 'tag');
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+
+ function site($feed_domain = NULL)
+ {
+ if ($feed_domain) {
+ $this->sweetcron->get_items_page('rss_feed', 1, TRUE, $feed_domain, 'site');
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/home.php b/system/application/controllers/home.php
new file mode 100644
index 0000000..3f0f82a
--- /dev/null
+++ b/system/application/controllers/home.php
@@ -0,0 +1,49 @@
+sweetcron->get_items_page('index', $this->uri->segment(2,1), TRUE);
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/index.html b/system/application/controllers/index.html
new file mode 100755
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/controllers/index.html
@@ -0,0 +1,15 @@
+
+
+ Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/controllers/items.php b/system/application/controllers/items.php
new file mode 100644
index 0000000..b8aa6b2
--- /dev/null
+++ b/system/application/controllers/items.php
@@ -0,0 +1,91 @@
+sweetcron->do_search();
+ }
+
+ function index()
+ {
+ header('Location: '.$this->config->item('base_url'));
+ }
+
+ function search($query = NULL)
+ {
+ if ($query) {
+ $this->sweetcron->get_items_page('search', $this->uri->segment(5,1), TRUE, $query);
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+
+ function tag($tag = NULL)
+ {
+ if ($tag) {
+ $this->sweetcron->get_items_page('tag', $this->uri->segment(5,1), TRUE, $tag);
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+
+ function site($feed_domain = NULL)
+ {
+ if ($feed_domain) {
+ $this->sweetcron->get_items_page('site', $this->uri->segment(5,1), TRUE, $feed_domain);
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+
+ function view($item_id = NULL)
+ {
+ if ($item_id) {
+ $this->sweetcron->get_single_item_page($item_id);
+ } else {
+ header('Location: '.$this->config->item('base_url'));
+ }
+ }
+
+}
+?>
\ No newline at end of file
diff --git a/system/application/controllers/p.php b/system/application/controllers/p.php
new file mode 100644
index 0000000..461d06f
--- /dev/null
+++ b/system/application/controllers/p.php
@@ -0,0 +1,49 @@
+sweetcron->get_items_page('static_page');
+ }
+}
+?>
\ No newline at end of file
diff --git a/system/application/errors/.svn/all-wcprops b/system/application/errors/.svn/all-wcprops
new file mode 100644
index 0000000..dc652cc
--- /dev/null
+++ b/system/application/errors/.svn/all-wcprops
@@ -0,0 +1,35 @@
+K 25
+svn:wc:ra_dav:version-url
+V 48
+/svn/!svn/ver/18/trunk/system/application/errors
+END
+error_db.php
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/!svn/ver/18/trunk/system/application/errors/error_db.php
+END
+error_404.php
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/!svn/ver/18/trunk/system/application/errors/error_404.php
+END
+error_php.php
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/!svn/ver/18/trunk/system/application/errors/error_php.php
+END
+index.html
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/!svn/ver/18/trunk/system/application/errors/index.html
+END
+error_general.php
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/!svn/ver/18/trunk/system/application/errors/error_general.php
+END
diff --git a/system/application/errors/.svn/entries b/system/application/errors/.svn/entries
new file mode 100644
index 0000000..bcc84ff
--- /dev/null
+++ b/system/application/errors/.svn/entries
@@ -0,0 +1,198 @@
+10
+
+dir
+124
+http://sweetcron.googlecode.com/svn/trunk/system/application/errors
+http://sweetcron.googlecode.com/svn
+
+
+
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+51b50d7d-0b4b-0410-974b-f188aa86c7d9
+
+error_db.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+5670a42820ea40968b47b75e8a710c63
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+520
+
+error_404.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+4dc5ce77087d486ebbf9ec398166c1e6
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+567
+
+error_php.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+f4ab89a1c904098a1253e34b0a72e42d
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+288
+
+index.html
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+362a648cc43551584abe596372cb8da8
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+149
+
+error_general.php
+file
+
+
+
+
+2009-09-15T00:17:51.000000Z
+489e05135731c7911cdb63ea39785dfa
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+511
+
diff --git a/system/application/errors/.svn/prop-base/error_404.php.svn-base b/system/application/errors/.svn/prop-base/error_404.php.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/errors/.svn/prop-base/error_404.php.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/errors/.svn/prop-base/error_db.php.svn-base b/system/application/errors/.svn/prop-base/error_db.php.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/errors/.svn/prop-base/error_db.php.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/errors/.svn/prop-base/error_general.php.svn-base b/system/application/errors/.svn/prop-base/error_general.php.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/errors/.svn/prop-base/error_general.php.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/errors/.svn/prop-base/error_php.php.svn-base b/system/application/errors/.svn/prop-base/error_php.php.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/errors/.svn/prop-base/error_php.php.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/errors/.svn/prop-base/index.html.svn-base b/system/application/errors/.svn/prop-base/index.html.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/errors/.svn/prop-base/index.html.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/errors/.svn/text-base/error_404.php.svn-base b/system/application/errors/.svn/text-base/error_404.php.svn-base
new file mode 100644
index 0000000..bfe9444
--- /dev/null
+++ b/system/application/errors/.svn/text-base/error_404.php.svn-base
@@ -0,0 +1,35 @@
+
+
+ Severity: Message: Filename: Line Number: Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/errors/error_404.php b/system/application/errors/error_404.php
new file mode 100755
index 0000000..bfe9444
--- /dev/null
+++ b/system/application/errors/error_404.php
@@ -0,0 +1,35 @@
+
+
+ Severity: Message: Filename: Line Number: Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/helpers/.svn/all-wcprops b/system/application/helpers/.svn/all-wcprops
new file mode 100644
index 0000000..62c8990
--- /dev/null
+++ b/system/application/helpers/.svn/all-wcprops
@@ -0,0 +1,11 @@
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/!svn/ver/18/trunk/system/application/helpers
+END
+index.html
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/!svn/ver/18/trunk/system/application/helpers/index.html
+END
diff --git a/system/application/helpers/.svn/entries b/system/application/helpers/.svn/entries
new file mode 100644
index 0000000..15b6bb7
--- /dev/null
+++ b/system/application/helpers/.svn/entries
@@ -0,0 +1,62 @@
+10
+
+dir
+124
+http://sweetcron.googlecode.com/svn/trunk/system/application/helpers
+http://sweetcron.googlecode.com/svn
+
+
+
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+51b50d7d-0b4b-0410-974b-f188aa86c7d9
+
+index.html
+file
+
+
+
+
+2009-09-15T00:17:46.000000Z
+362a648cc43551584abe596372cb8da8
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+149
+
diff --git a/system/application/helpers/.svn/prop-base/index.html.svn-base b/system/application/helpers/.svn/prop-base/index.html.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/helpers/.svn/prop-base/index.html.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/helpers/.svn/text-base/index.html.svn-base b/system/application/helpers/.svn/text-base/index.html.svn-base
new file mode 100644
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/helpers/.svn/text-base/index.html.svn-base
@@ -0,0 +1,15 @@
+
+
+ Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/helpers/index.html b/system/application/helpers/index.html
new file mode 100755
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/helpers/index.html
@@ -0,0 +1,15 @@
+
+
+ Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/hooks/.svn/all-wcprops b/system/application/hooks/.svn/all-wcprops
new file mode 100644
index 0000000..41e2803
--- /dev/null
+++ b/system/application/hooks/.svn/all-wcprops
@@ -0,0 +1,11 @@
+K 25
+svn:wc:ra_dav:version-url
+V 47
+/svn/!svn/ver/18/trunk/system/application/hooks
+END
+index.html
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/!svn/ver/18/trunk/system/application/hooks/index.html
+END
diff --git a/system/application/hooks/.svn/entries b/system/application/hooks/.svn/entries
new file mode 100644
index 0000000..b132f32
--- /dev/null
+++ b/system/application/hooks/.svn/entries
@@ -0,0 +1,62 @@
+10
+
+dir
+124
+http://sweetcron.googlecode.com/svn/trunk/system/application/hooks
+http://sweetcron.googlecode.com/svn
+
+
+
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+51b50d7d-0b4b-0410-974b-f188aa86c7d9
+
+index.html
+file
+
+
+
+
+2009-09-15T00:17:46.000000Z
+362a648cc43551584abe596372cb8da8
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+149
+
diff --git a/system/application/hooks/.svn/prop-base/index.html.svn-base b/system/application/hooks/.svn/prop-base/index.html.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/hooks/.svn/prop-base/index.html.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/hooks/.svn/text-base/index.html.svn-base b/system/application/hooks/.svn/text-base/index.html.svn-base
new file mode 100644
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/hooks/.svn/text-base/index.html.svn-base
@@ -0,0 +1,15 @@
+
+
+ Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/hooks/index.html b/system/application/hooks/index.html
new file mode 100755
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/hooks/index.html
@@ -0,0 +1,15 @@
+
+
+ Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/index.html b/system/application/index.html
new file mode 100755
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/index.html
@@ -0,0 +1,15 @@
+
+
+ Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/language/.svn/all-wcprops b/system/application/language/.svn/all-wcprops
new file mode 100644
index 0000000..1cb01c7
--- /dev/null
+++ b/system/application/language/.svn/all-wcprops
@@ -0,0 +1,5 @@
+K 25
+svn:wc:ra_dav:version-url
+V 50
+/svn/!svn/ver/18/trunk/system/application/language
+END
diff --git a/system/application/language/.svn/entries b/system/application/language/.svn/entries
new file mode 100644
index 0000000..ac302fd
--- /dev/null
+++ b/system/application/language/.svn/entries
@@ -0,0 +1,31 @@
+10
+
+dir
+124
+http://sweetcron.googlecode.com/svn/trunk/system/application/language
+http://sweetcron.googlecode.com/svn
+
+
+
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+51b50d7d-0b4b-0410-974b-f188aa86c7d9
+
+english
+dir
+
diff --git a/system/application/language/english/.svn/all-wcprops b/system/application/language/english/.svn/all-wcprops
new file mode 100644
index 0000000..9d0173f
--- /dev/null
+++ b/system/application/language/english/.svn/all-wcprops
@@ -0,0 +1,11 @@
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/!svn/ver/18/trunk/system/application/language/english
+END
+index.html
+K 25
+svn:wc:ra_dav:version-url
+V 69
+/svn/!svn/ver/18/trunk/system/application/language/english/index.html
+END
diff --git a/system/application/language/english/.svn/entries b/system/application/language/english/.svn/entries
new file mode 100644
index 0000000..4ddc635
--- /dev/null
+++ b/system/application/language/english/.svn/entries
@@ -0,0 +1,62 @@
+10
+
+dir
+124
+http://sweetcron.googlecode.com/svn/trunk/system/application/language/english
+http://sweetcron.googlecode.com/svn
+
+
+
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+51b50d7d-0b4b-0410-974b-f188aa86c7d9
+
+index.html
+file
+
+
+
+
+2009-09-15T00:17:46.000000Z
+362a648cc43551584abe596372cb8da8
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+149
+
diff --git a/system/application/language/english/.svn/prop-base/index.html.svn-base b/system/application/language/english/.svn/prop-base/index.html.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/language/english/.svn/prop-base/index.html.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/language/english/.svn/text-base/index.html.svn-base b/system/application/language/english/.svn/text-base/index.html.svn-base
new file mode 100644
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/language/english/.svn/text-base/index.html.svn-base
@@ -0,0 +1,15 @@
+
+
+ Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/language/english/index.html b/system/application/language/english/index.html
new file mode 100755
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/language/english/index.html
@@ -0,0 +1,15 @@
+
+
+ Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/libraries/.svn/all-wcprops b/system/application/libraries/.svn/all-wcprops
new file mode 100644
index 0000000..1b686d4
--- /dev/null
+++ b/system/application/libraries/.svn/all-wcprops
@@ -0,0 +1,53 @@
+K 25
+svn:wc:ra_dav:version-url
+V 52
+/svn/!svn/ver/124/trunk/system/application/libraries
+END
+sweetcron.php
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/!svn/ver/124/trunk/system/application/libraries/sweetcron.php
+END
+page.php
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/!svn/ver/18/trunk/system/application/libraries/page.php
+END
+auth.php
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/!svn/ver/18/trunk/system/application/libraries/auth.php
+END
+markdown.php
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/!svn/ver/18/trunk/system/application/libraries/markdown.php
+END
+index.html
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/!svn/ver/18/trunk/system/application/libraries/index.html
+END
+sweetcron_item.php
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/!svn/ver/124/trunk/system/application/libraries/sweetcron_item.php
+END
+simplepie.php
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/!svn/ver/18/trunk/system/application/libraries/simplepie.php
+END
+MY_Controller.php
+K 25
+svn:wc:ra_dav:version-url
+V 70
+/svn/!svn/ver/124/trunk/system/application/libraries/MY_Controller.php
+END
diff --git a/system/application/libraries/.svn/entries b/system/application/libraries/.svn/entries
new file mode 100644
index 0000000..f42c751
--- /dev/null
+++ b/system/application/libraries/.svn/entries
@@ -0,0 +1,300 @@
+10
+
+dir
+124
+http://sweetcron.googlecode.com/svn/trunk/system/application/libraries
+http://sweetcron.googlecode.com/svn
+
+
+
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+51b50d7d-0b4b-0410-974b-f188aa86c7d9
+
+sweetcron.php
+file
+
+
+
+
+2009-09-15T00:17:59.000000Z
+48dbd1806030f43605ba15ae008e7033
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+15659
+
+page.php
+file
+
+
+
+
+2009-09-15T00:17:59.000000Z
+50c32b2203293353f2812f29f2b3babd
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+7137
+
+auth.php
+file
+
+
+
+
+2009-09-15T00:17:59.000000Z
+976a91467ae5ff46255a75820587f476
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3224
+
+markdown.php
+file
+
+
+
+
+2009-09-15T00:17:59.000000Z
+b97e901d3c07d7b998cd44ded00a5680
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+82461
+
+index.html
+file
+
+
+
+
+2009-09-15T00:17:59.000000Z
+362a648cc43551584abe596372cb8da8
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+149
+
+sweetcron_item.php
+file
+
+
+
+
+2009-09-15T00:17:59.000000Z
+7cc5706c8485d3eb5702af717e6819a4
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4605
+
+simplepie.php
+file
+
+
+
+
+2009-09-15T00:17:59.000000Z
+7028d3369d785dda97d5eed958e13378
+2008-08-28T06:03:25.654136Z
+18
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+348018
+
+MY_Controller.php
+file
+
+
+
+
+2009-09-15T00:17:59.000000Z
+f01707f6a0c2c66d00e24acf97fa2423
+2008-12-22T02:10:08.113778Z
+124
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3356
+
diff --git a/system/application/libraries/.svn/prop-base/index.html.svn-base b/system/application/libraries/.svn/prop-base/index.html.svn-base
new file mode 100644
index 0000000..869ac71
--- /dev/null
+++ b/system/application/libraries/.svn/prop-base/index.html.svn-base
@@ -0,0 +1,5 @@
+K 14
+svn:executable
+V 1
+*
+END
diff --git a/system/application/libraries/.svn/text-base/MY_Controller.php.svn-base b/system/application/libraries/.svn/text-base/MY_Controller.php.svn-base
new file mode 100644
index 0000000..de6f23b
--- /dev/null
+++ b/system/application/libraries/.svn/text-base/MY_Controller.php.svn-base
@@ -0,0 +1,87 @@
+load->library('sweetcron');
+ $this->load->file(BASEPATH.'/application/libraries/sweetcron_item.php');
+ $this->sweetcron->compatibility_check();
+ $this->sweetcron->integrity_check();
+
+ //load other stuff
+ $this->load->file(BASEPATH.'/application/libraries/markdown.php');
+ $this->load->helper('text');
+ $this->load->helper('url');
+ $this->load->library('simplepie');
+ $this->load->library('page');
+ $this->load->model('feed_model');
+ $this->load->model('item_model');
+ $this->load->model('tag_model');
+ $this->load->model('option_model');
+ $this->load->helper('date');
+ $this->load->library('auth');
+
+ //update last access
+ $option->option_name = 'last_access';
+ $option->option_value = time();
+ $this->option_model->add_option($option);
+
+ //Set config items
+ $this->option_model->load_config_options();
+
+ //initiate pseudo-cron
+ $this->sweetcron->pseudo_cron();
+ $this->data->user = $this->auth->get_user($this->session->userdata('user_id'));
+ }
+}
+
+// Controllers accessible only by logged in users
+class Auth_Controller extends Public_Controller {
+ function Auth_Controller() {
+ parent::Public_Controller();
+ //OMG WHO R U
+ if ($this->data->user === FALSE) {
+ header('Location: '.$this->config->item('base_url').'admin/login');
+ exit();
+ } else {
+ return;
+ }
+ }
+}
\ No newline at end of file
diff --git a/system/application/libraries/.svn/text-base/auth.php.svn-base b/system/application/libraries/.svn/text-base/auth.php.svn-base
new file mode 100644
index 0000000..1883e6d
--- /dev/null
+++ b/system/application/libraries/.svn/text-base/auth.php.svn-base
@@ -0,0 +1,103 @@
+CI =& get_instance();
+ log_message('debug', 'Authorization class initialized.');
+
+ $this->CI->load->database();
+ }
+
+ /***
+ Determines whether the passed condition is valid to login a user, if so - sets a session variable containing the user's ID
+ * @param $condition array The condition to query the database for
+ * @return boolean
+ ***/
+ function try_login($condition = array()) {
+ $query = $this->CI->db->getwhere($this->db_table, $condition, 1, 0);
+
+ if ($query->num_rows != 1) { return FALSE; }
+
+ $row = $query->row();
+ $this->CI->session->set_userdata(array('user_id' => $row->ID, 'call_user' => $row->user_login));
+
+ return $row;
+ }
+
+
+ /***
+ Returns an object containing user information via the user's ID
+ * @param $id integer The user's ID
+ * @return object Upon valid user
+ * @return FALSE Upon invalid user
+ ***/
+ function get_user($id = FALSE) {
+ if ($id == FALSE) $id = $this->CI->session->userdata('user_id');
+ if ($id == FALSE) return FALSE;
+
+ $condition = array(($this->db_table . '.' . $this->db_userid) => $id);
+
+ $query = $this->CI->db->getwhere($this->db_table, $condition, 1, 0);
+
+ $row = ($query->num_rows() == 1) ? $query->row() : FALSE;
+
+ return $row;
+ }
+
+ /***
+ Logs out a user by deleting their session variables
+ * @return null
+ ***/
+ function logout() {
+ $this->CI->session->set_userdata(array('user_id' => FALSE));
+ header('Location: '.$this->CI->config->item('base_url'));
+ }
+
+ function is_logged()
+ {
+ if ($this->CI->data->user === FALSE) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+
+ // use $this->auth->permit('super_admin') at the start of non-visual functions to prevent hackery
+ // parameter can be a string role or an array of roles
+ // if user is not of correct role they see an error page - they would only see this if they were
+ // trying something malicious, i.e. trying to access functions that their role doesn't allow
+ function permit($permitted_role = null)
+ {
+ if ($permitted_role) {
+ if (is_array($permitted_role)) {
+ if (!in_array($this->CI->data->user->user_role, $permitted_role)) {
+ return false;
+ } else {
+ return true;
+ }
+ } else {
+ if ($this->CI->data->user->user_role != $permitted_role) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/system/application/libraries/.svn/text-base/index.html.svn-base b/system/application/libraries/.svn/text-base/index.html.svn-base
new file mode 100644
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/libraries/.svn/text-base/index.html.svn-base
@@ -0,0 +1,15 @@
+
+
+ Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/libraries/.svn/text-base/markdown.php.svn-base b/system/application/libraries/.svn/text-base/markdown.php.svn-base
new file mode 100644
index 0000000..ed79197
--- /dev/null
+++ b/system/application/libraries/.svn/text-base/markdown.php.svn-base
@@ -0,0 +1,2894 @@
+
+#
+# Original Markdown
+# Copyright (c) 2004-2006 John Gruber
+# '.$text.'A PHP Error was encountered
+
+A PHP Error was encountered
+
+
", $text); + } + return $text; + } + + function mdwp_strip_p($t) { return preg_replace('{?p>}i', '', $t); } + + function mdwp_hide_tags($text) { + global $mdwp_hidden_tags, $mdwp_placeholders; + return str_replace($mdwp_hidden_tags, $mdwp_placeholders, $text); + } + function mdwp_show_tags($text) { + global $mdwp_hidden_tags, $mdwp_placeholders; + return str_replace($mdwp_placeholders, $mdwp_hidden_tags, $text); + } +} + + +### bBlog Plugin Info ### + +function identify_modifier_markdown() { + return array( + 'name' => 'markdown', + 'type' => 'modifier', + 'nicename' => 'PHP Markdown Extra', + 'description' => 'A text-to-HTML conversion tool for web writers', + 'authors' => 'Michel Fortin and John Gruber', + 'licence' => 'GPL', + 'version' => MARKDOWNEXTRA_VERSION, + 'help' => 'Markdown syntax allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by John Gruber. More...', + ); +} + + +### Smarty Modifier Interface ### + +function smarty_modifier_markdown($text) { + return Markdown($text); +} + + +### Textile Compatibility Mode ### + +# Rename this file to "classTextile.php" and it can replace Textile everywhere. + +if (strcasecmp(substr(__FILE__, -16), "classTextile.php") == 0) { + # Try to include PHP SmartyPants. Should be in the same directory. + @include_once 'smartypants.php'; + # Fake Textile class. It calls Markdown instead. + class Textile { + function TextileThis($text, $lite='', $encode='') { + if ($lite == '' && $encode == '') $text = Markdown($text); + if (function_exists('SmartyPants')) $text = SmartyPants($text); + return $text; + } + # Fake restricted version: restrictions are not supported for now. + function TextileRestricted($text, $lite='', $noimage='') { + return $this->TextileThis($text, $lite); + } + # Workaround to ensure compatibility with TextPattern 4.0.3. + function blockLite($text) { return $text; } + } +} + + + +# +# Markdown Parser Class +# + +class Markdown_Parser { + + # Regex to match balanced [brackets]. + # Needed to insert a maximum bracked depth while converting to PHP. + var $nested_brackets_depth = 6; + var $nested_brackets_re; + + var $nested_url_parenthesis_depth = 4; + var $nested_url_parenthesis_re; + + # Table of hash values for escaped characters: + var $escape_chars = '\`*_{}[]()>#+-.!'; + var $escape_chars_re; + + # Change to ">" for HTML output. + var $empty_element_suffix = MARKDOWN_EMPTY_ELEMENT_SUFFIX; + var $tab_width = MARKDOWN_TAB_WIDTH; + + # Change to `true` to disallow markup or entities. + var $no_markup = false; + var $no_entities = false; + + # Predefined urls and titles for reference links and images. + var $predef_urls = array(); + var $predef_titles = array(); + + + function Markdown_Parser() { + # + # Constructor function. Initialize appropriate member variables. + # + $this->_initDetab(); + $this->prepareItalicsAndBold(); + + $this->nested_brackets_re = + str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth). + str_repeat('\])*', $this->nested_brackets_depth); + + $this->nested_url_parenthesis_re = + str_repeat('(?>[^()\s]+|\(', $this->nested_url_parenthesis_depth). + str_repeat('(?>\)))*', $this->nested_url_parenthesis_depth); + + $this->escape_chars_re = '['.preg_quote($this->escape_chars).']'; + + # Sort document, block, and span gamut in ascendent priority order. + asort($this->document_gamut); + asort($this->block_gamut); + asort($this->span_gamut); + } + + + # Internal hashes used during transformation. + var $urls = array(); + var $titles = array(); + var $html_hashes = array(); + + # Status flag to avoid invalid nesting. + var $in_anchor = false; + + + function setup() { + # + # Called before the transformation process starts to setup parser + # states. + # + # Clear global hashes. + $this->urls = $this->predef_urls; + $this->titles = $this->predef_titles; + $this->html_hashes = array(); + + $in_anchor = false; + } + + function teardown() { + # + # Called after the transformation process to clear any variable + # which may be taking up memory unnecessarly. + # + $this->urls = array(); + $this->titles = array(); + $this->html_hashes = array(); + } + + + function transform($text) { + # + # Main function. Performs some preprocessing on the input text + # and pass it through the document gamut. + # + $this->setup(); + + # Remove UTF-8 BOM and marker character in input, if present. + $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text); + + # Standardize line endings: + # DOS to Unix and Mac to Unix + $text = preg_replace('{\r\n?}', "\n", $text); + + # Make sure $text ends with a couple of newlines: + $text .= "\n\n"; + + # Convert all tabs to spaces. + $text = $this->detab($text); + + # Turn block-level HTML blocks into hash entries + $text = $this->hashHTMLBlocks($text); + + # Strip any lines consisting only of spaces and tabs. + # This makes subsequent regexen easier to write, because we can + # match consecutive blank lines with /\n+/ instead of something + # contorted like /[ ]*\n+/ . + $text = preg_replace('/^[ ]+$/m', '', $text); + + # Run document gamut methods. + foreach ($this->document_gamut as $method => $priority) { + $text = $this->$method($text); + } + + $this->teardown(); + + return $text . "\n"; + } + + var $document_gamut = array( + # Strip link definitions, store in hashes. + "stripLinkDefinitions" => 20, + + "runBasicBlockGamut" => 30, + ); + + + function stripLinkDefinitions($text) { + # + # Strips link definitions from text, stores the URLs and titles in + # hash references. + # + $less_than_tab = $this->tab_width - 1; + + # Link defs are in the form: ^[id]: url "optional title" + $text = preg_replace_callback('{ + ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1 + [ ]* + \n? # maybe *one* newline + [ ]* + (\S+?)>? # url = $2 + [ ]* + \n? # maybe one newline + [ ]* + (?: + (?<=\s) # lookbehind for whitespace + ["(] + (.*?) # title = $3 + [")] + [ ]* + )? # title is optional + (?:\n+|\Z) + }xm', + array(&$this, '_stripLinkDefinitions_callback'), + $text); + return $text; + } + function _stripLinkDefinitions_callback($matches) { + $link_id = strtolower($matches[1]); + $this->urls[$link_id] = $matches[2]; + $this->titles[$link_id] =& $matches[3]; + return ''; # String that will replace the block + } + + + function hashHTMLBlocks($text) { + if ($this->no_markup) return $text; + + $less_than_tab = $this->tab_width - 1; + + # Hashify HTML blocks: + # We only want to do this for block-level HTML tags, such as headers, + # lists, and tables. That's because we still want to wrap
s around + # "paragraphs" that are wrapped in non-block-level tags, such as anchors, + # phrase emphasis, and spans. The list of tags we're looking for is + # hard-coded: + # + # * List "a" is made of tags which can be both inline or block-level. + # These will be treated block-level when the start tag is alone on + # its line, otherwise they're not matched here and will be taken as + # inline later. + # * List "b" is made of tags which are always block-level; + # + $block_tags_a_re = 'ins|del'; + $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'. + 'script|noscript|form|fieldset|iframe|math'; + + # Regular expression for the content of a block tag. + $nested_tags_level = 4; + $attr = ' + (?> # optional tag attributes + \s # starts with whitespace + (?> + [^>"/]+ # text outside quotes + | + /+(?!>) # slash not followed by ">" + | + "[^"]*" # text inside double quotes (tolerate ">") + | + \'[^\']*\' # text inside single quotes (tolerate ">") + )* + )? + '; + $content = + str_repeat(' + (?> + [^<]+ # content without tag + | + <\2 # nested opening tag + '.$attr.' # attributes + (?> + /> + | + >', $nested_tags_level). # end of opening tag + '.*?'. # last level nested tag content + str_repeat(' + \2\s*> # closing nested tag + ) + | + <(?!/\2\s*> # other tags with a different name + ) + )*', + $nested_tags_level); + $content2 = str_replace('\2', '\3', $content); + + # First, look for nested blocks, e.g.: + #
` blocks.
+ #
+ $text = preg_replace_callback('{
+ (?:\n\n|\A\n?)
+ ( # $1 = the code block -- one or more lines, starting with a space/tab
+ (?>
+ [ ]{'.$this->tab_width.'} # Lines must start with a tab or a tab-width of spaces
+ .*\n+
+ )+
+ )
+ ((?=^[ ]{0,'.$this->tab_width.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
+ }xm',
+ array(&$this, '_doCodeBlocks_callback'), $text);
+
+ return $text;
+ }
+ function _doCodeBlocks_callback($matches) {
+ $codeblock = $matches[1];
+
+ $codeblock = $this->outdent($codeblock);
+ $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
+
+ # trim leading newlines and trailing newlines
+ $codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock);
+
+ $codeblock = "$codeblock\n
";
+ return "\n\n".$this->hashBlock($codeblock)."\n\n";
+ }
+
+
+ function makeCodeSpan($code) {
+ #
+ # Create a code span markup for $code. Called from handleSpanToken.
+ #
+ $code = htmlspecialchars(trim($code), ENT_NOQUOTES);
+ return $this->hashPart("$code
");
+ }
+
+
+ var $em_relist = array(
+ '' => '(?:(? '(?<=\S)(? '(?<=\S)(? '(?:(? '(?<=\S)(? '(?<=\S)(? '(?:(? '(?<=\S)(? '(?<=\S)(?em_relist as $em => $em_re) {
+ foreach ($this->strong_relist as $strong => $strong_re) {
+ # Construct list of allowed token expressions.
+ $token_relist = array();
+ if (isset($this->em_strong_relist["$em$strong"])) {
+ $token_relist[] = $this->em_strong_relist["$em$strong"];
+ }
+ $token_relist[] = $em_re;
+ $token_relist[] = $strong_re;
+
+ # Construct master expression from list.
+ $token_re = '{('. implode('|', $token_relist) .')}';
+ $this->em_strong_prepared_relist["$em$strong"] = $token_re;
+ }
+ }
+ }
+
+ function doItalicsAndBold($text) {
+ $token_stack = array('');
+ $text_stack = array('');
+ $em = '';
+ $strong = '';
+ $tree_char_em = false;
+
+ while (1) {
+ #
+ # Get prepared regular expression for seraching emphasis tokens
+ # in current context.
+ #
+ $token_re = $this->em_strong_prepared_relist["$em$strong"];
+
+ #
+ # Each loop iteration seach for the next emphasis token.
+ # Each token is then passed to handleSpanToken.
+ #
+ $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
+ $text_stack[0] .= $parts[0];
+ $token =& $parts[1];
+ $text =& $parts[2];
+
+ if (empty($token)) {
+ # Reached end of text span: empty stack without emitting.
+ # any more emphasis.
+ while ($token_stack[0]) {
+ $text_stack[1] .= array_shift($token_stack);
+ $text_stack[0] .= array_shift($text_stack);
+ }
+ break;
+ }
+
+ $token_len = strlen($token);
+ if ($tree_char_em) {
+ # Reached closing marker while inside a three-char emphasis.
+ if ($token_len == 3) {
+ # Three-char closing marker, close em and strong.
+ array_shift($token_stack);
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "$span";
+ $text_stack[0] .= $this->hashPart($span);
+ $em = '';
+ $strong = '';
+ } else {
+ # Other closing marker: close one em or strong and
+ # change current token state to match the other
+ $token_stack[0] = str_repeat($token{0}, 3-$token_len);
+ $tag = $token_len == 2 ? "strong" : "em";
+ $span = $text_stack[0];
+ $span = $this->runSpanGamut($span);
+ $span = "<$tag>$span$tag>";
+ $text_stack[0] = $this->hashPart($span);
+ $$tag = ''; # $$tag stands for $em or $strong
+ }
+ $tree_char_em = false;
+ } else if ($token_len == 3) {
+ if ($em) {
+ # Reached closing marker for both em and strong.
+ # Closing strong marker:
+ for ($i = 0; $i < 2; ++$i) {
+ $shifted_token = array_shift($token_stack);
+ $tag = strlen($shifted_token) == 2 ? "strong" : "em";
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "<$tag>$span$tag>";
+ $text_stack[0] .= $this->hashPart($span);
+ $$tag = ''; # $$tag stands for $em or $strong
+ }
+ } else {
+ # Reached opening three-char emphasis marker. Push on token
+ # stack; will be handled by the special condition above.
+ $em = $token{0};
+ $strong = "$em$em";
+ array_unshift($token_stack, $token);
+ array_unshift($text_stack, '');
+ $tree_char_em = true;
+ }
+ } else if ($token_len == 2) {
+ if ($strong) {
+ # Unwind any dangling emphasis marker:
+ if (strlen($token_stack[0]) == 1) {
+ $text_stack[1] .= array_shift($token_stack);
+ $text_stack[0] .= array_shift($text_stack);
+ }
+ # Closing strong marker:
+ array_shift($token_stack);
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "$span";
+ $text_stack[0] .= $this->hashPart($span);
+ $strong = '';
+ } else {
+ array_unshift($token_stack, $token);
+ array_unshift($text_stack, '');
+ $strong = $token;
+ }
+ } else {
+ # Here $token_len == 1
+ if ($em) {
+ if (strlen($token_stack[0]) == 1) {
+ # Closing emphasis marker:
+ array_shift($token_stack);
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "$span";
+ $text_stack[0] .= $this->hashPart($span);
+ $em = '';
+ } else {
+ $text_stack[0] .= $token;
+ }
+ } else {
+ array_unshift($token_stack, $token);
+ array_unshift($text_stack, '');
+ $em = $token;
+ }
+ }
+ }
+ return $text_stack[0];
+ }
+
+
+ function doBlockQuotes($text) {
+ $text = preg_replace_callback('/
+ ( # Wrap whole match in $1
+ (?>
+ ^[ ]*>[ ]? # ">" at the start of a line
+ .+\n # rest of the first line
+ (.+\n)* # subsequent consecutive lines
+ \n* # blanks
+ )+
+ )
+ /xm',
+ array(&$this, '_doBlockQuotes_callback'), $text);
+
+ return $text;
+ }
+ function _doBlockQuotes_callback($matches) {
+ $bq = $matches[1];
+ # trim one level of quoting - trim whitespace-only lines
+ $bq = preg_replace('/^[ ]*>[ ]?|^[ ]+$/m', '', $bq);
+ $bq = $this->runBlockGamut($bq); # recurse
+
+ $bq = preg_replace('/^/m', " ", $bq);
+ # These leading spaces cause problem with content,
+ # so we need to fix that:
+ $bq = preg_replace_callback('{(\s*.+?
)}sx',
+ array(&$this, '_DoBlockQuotes_callback2'), $bq);
+
+ return "\n". $this->hashBlock("\n$bq\n
")."\n\n";
+ }
+ function _doBlockQuotes_callback2($matches) {
+ $pre = $matches[1];
+ $pre = preg_replace('/^ /m', '', $pre);
+ return $pre;
+ }
+
+
+ function formParagraphs($text) {
+ #
+ # Params:
+ # $text - string to process with html tags
+ #
+ # Strip leading and trailing lines:
+ $text = preg_replace('/\A\n+|\n+\z/', '', $text);
+
+ $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
+
+ #
+ # Wrap
tags and unhashify HTML blocks
+ #
+ foreach ($grafs as $key => $value) {
+ if (!preg_match('/^B\x1A[0-9]+B$/', $value)) {
+ # Is a paragraph.
+ $value = $this->runSpanGamut($value);
+ $value = preg_replace('/^([ ]*)/', "
", $value);
+ $value .= "
";
+ $grafs[$key] = $this->unhash($value);
+ }
+ else {
+ # Is a block.
+ # Modify elements of @grafs in-place...
+ $graf = $value;
+ $block = $this->html_hashes[$graf];
+ $graf = $block;
+// if (preg_match('{
+// \A
+// ( # $1 = tag
+// ]*
+// \b
+// markdown\s*=\s* ([\'"]) # $2 = attr quote char
+// 1
+// \2
+// [^>]*
+// >
+// )
+// ( # $3 = contents
+// .*
+// )
+// () # $4 = closing tag
+// \z
+// }xs', $block, $matches))
+// {
+// list(, $div_open, , $div_content, $div_close) = $matches;
+//
+// # We can't call Markdown(), because that resets the hash;
+// # that initialization code should be pulled into its own sub, though.
+// $div_content = $this->hashHTMLBlocks($div_content);
+//
+// # Run document gamut methods on the content.
+// foreach ($this->document_gamut as $method => $priority) {
+// $div_content = $this->$method($div_content);
+// }
+//
+// $div_open = preg_replace(
+// '{\smarkdown\s*=\s*([\'"]).+?\1}', '', $div_open);
+//
+// $graf = $div_open . "\n" . $div_content . "\n" . $div_close;
+// }
+ $grafs[$key] = $graf;
+ }
+ }
+
+ return implode("\n\n", $grafs);
+ }
+
+
+ function encodeAttribute($text) {
+ #
+ # Encode text for a double-quoted HTML attribute. This function
+ # is *not* suitable for attributes enclosed in single quotes.
+ #
+ $text = $this->encodeAmpsAndAngles($text);
+ $text = str_replace('"', '"', $text);
+ return $text;
+ }
+
+
+ function encodeAmpsAndAngles($text) {
+ #
+ # Smart processing for ampersands and angle brackets that need to
+ # be encoded. Valid character entities are left alone unless the
+ # no-entities mode is set.
+ #
+ if ($this->no_entities) {
+ $text = str_replace('&', '&', $text);
+ } else {
+ # Ampersand-encoding based entirely on Nat Irons's Amputator
+ # MT plugin:
+ $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/',
+ '&', $text);;
+ }
+ # Encode remaining <'s
+ $text = str_replace('<', '<', $text);
+
+ return $text;
+ }
+
+
+ function doAutoLinks($text) {
+ $text = preg_replace_callback('{<((https?|ftp|dict):[^\'">\s]+)>}i',
+ array(&$this, '_doAutoLinks_url_callback'), $text);
+
+ # Email addresses:
+ $text = preg_replace_callback('{
+ <
+ (?:mailto:)?
+ (
+ [-.\w\x80-\xFF]+
+ \@
+ [-a-z0-9\x80-\xFF]+(\.[-a-z0-9\x80-\xFF]+)*\.[a-z]+
+ )
+ >
+ }xi',
+ array(&$this, '_doAutoLinks_email_callback'), $text);
+
+ return $text;
+ }
+ function _doAutoLinks_url_callback($matches) {
+ $url = $this->encodeAttribute($matches[1]);
+ $link = "$url";
+ return $this->hashPart($link);
+ }
+ function _doAutoLinks_email_callback($matches) {
+ $address = $matches[1];
+ $link = $this->encodeEmailAddress($address);
+ return $this->hashPart($link);
+ }
+
+
+ function encodeEmailAddress($addr) {
+ #
+ # Input: an email address, e.g. "foo@example.com"
+ #
+ # Output: the email address as a mailto link, with each character
+ # of the address encoded as either a decimal or hex entity, in
+ # the hopes of foiling most address harvesting spam bots. E.g.:
+ #
+ #
+ #
+ # Based by a filter by Matthew Wickline, posted to BBEdit-Talk.
+ # With some optimizations by Milian Wolff.
+ #
+ $addr = "mailto:" . $addr;
+ $chars = preg_split('/(? $char) {
+ $ord = ord($char);
+ # Ignore non-ascii chars.
+ if ($ord < 128) {
+ $r = ($seed * (1 + $key)) % 100; # Pseudo-random function.
+ # roughly 10% raw, 45% hex, 45% dec
+ # '@' *must* be encoded. I insist.
+ if ($r > 90 && $char != '@') /* do nothing */;
+ else if ($r < 45) $chars[$key] = ''.dechex($ord).';';
+ else $chars[$key] = ''.$ord.';';
+ }
+ }
+
+ $addr = implode('', $chars);
+ $text = implode('', array_slice($chars, 7)); # text without `mailto:`
+ $addr = "$text";
+
+ return $addr;
+ }
+
+
+ function parseSpan($str) {
+ #
+ # Take the string $str and parse it into tokens, hashing embeded HTML,
+ # escaped characters and handling code spans.
+ #
+ $output = '';
+
+ $span_re = '{
+ (
+ \\\\'.$this->escape_chars_re.'
+ |
+ (?no_markup ? '' : '
+ |
+ # comment
+ |
+ <\?.*?\?> | <%.*?%> # processing instruction
+ |
+ <[/!$]?[-a-zA-Z0-9:]+ # regular tags
+ (?>
+ \s
+ (?>[^"\'>]+|"[^"]*"|\'[^\']*\')*
+ )?
+ >
+ ').'
+ )
+ }xs';
+
+ while (1) {
+ #
+ # Each loop iteration seach for either the next tag, the next
+ # openning code span marker, or the next escaped character.
+ # Each token is then passed to handleSpanToken.
+ #
+ $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE);
+
+ # Create token from text preceding tag.
+ if ($parts[0] != "") {
+ $output .= $parts[0];
+ }
+
+ # Check if we reach the end.
+ if (isset($parts[1])) {
+ $output .= $this->handleSpanToken($parts[1], $parts[2]);
+ $str = $parts[2];
+ }
+ else {
+ break;
+ }
+ }
+
+ return $output;
+ }
+
+
+ function handleSpanToken($token, &$str) {
+ #
+ # Handle $token provided by parseSpan by determining its nature and
+ # returning the corresponding value that should replace it.
+ #
+ switch ($token{0}) {
+ case "\\":
+ return $this->hashPart("". ord($token{1}). ";");
+ case "`":
+ # Search for end marker in remaining text.
+ if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm',
+ $str, $matches))
+ {
+ $str = $matches[2];
+ $codespan = $this->makeCodeSpan($matches[1]);
+ return $this->hashPart($codespan);
+ }
+ return $token; // return as text since no ending marker found.
+ default:
+ return $this->hashPart($token);
+ }
+ }
+
+
+ function outdent($text) {
+ #
+ # Remove one level of line-leading tabs or spaces
+ #
+ return preg_replace('/^(\t|[ ]{1,'.$this->tab_width.'})/m', '', $text);
+ }
+
+
+ # String length function for detab. `_initDetab` will create a function to
+ # hanlde UTF-8 if the default function does not exist.
+ var $utf8_strlen = 'mb_strlen';
+
+ function detab($text) {
+ #
+ # Replace tabs with the appropriate amount of space.
+ #
+ # For each line we separate the line in blocks delemited by
+ # tab characters. Then we reconstruct every line by adding the
+ # appropriate number of space between each blocks.
+
+ $text = preg_replace_callback('/^.*\t.*$/m',
+ array(&$this, '_detab_callback'), $text);
+
+ return $text;
+ }
+ function _detab_callback($matches) {
+ $line = $matches[0];
+ $strlen = $this->utf8_strlen; # strlen function for UTF-8.
+
+ # Split in blocks.
+ $blocks = explode("\t", $line);
+ # Add each blocks to the line.
+ $line = $blocks[0];
+ unset($blocks[0]); # Do not add first block twice.
+ foreach ($blocks as $block) {
+ # Calculate amount of space, insert spaces, insert block.
+ $amount = $this->tab_width -
+ $strlen($line, 'UTF-8') % $this->tab_width;
+ $line .= str_repeat(" ", $amount) . $block;
+ }
+ return $line;
+ }
+ function _initDetab() {
+ #
+ # Check for the availability of the function in the `utf8_strlen` property
+ # (initially `mb_strlen`). If the function is not available, create a
+ # function that will loosely count the number of UTF-8 characters with a
+ # regular expression.
+ #
+ if (function_exists($this->utf8_strlen)) return;
+ $this->utf8_strlen = create_function('$text', 'return preg_match_all(
+ "/[\\\\x00-\\\\xBF]|[\\\\xC0-\\\\xFF][\\\\x80-\\\\xBF]*/",
+ $text, $m);');
+ }
+
+
+ function unhash($text) {
+ #
+ # Swap back in all the tags hashed by _HashHTMLBlocks.
+ #
+ return preg_replace_callback('/(.)\x1A[0-9]+\1/',
+ array(&$this, '_unhash_callback'), $text);
+ }
+ function _unhash_callback($matches) {
+ return $this->html_hashes[$matches[0]];
+ }
+
+}
+
+
+#
+# Markdown Extra Parser Class
+#
+
+class MarkdownExtra_Parser extends Markdown_Parser {
+
+ # Prefix for footnote ids.
+ var $fn_id_prefix = "";
+
+ # Optional title attribute for footnote links and backlinks.
+ var $fn_link_title = MARKDOWN_FN_LINK_TITLE;
+ var $fn_backlink_title = MARKDOWN_FN_BACKLINK_TITLE;
+
+ # Optional class attribute for footnote links and backlinks.
+ var $fn_link_class = MARKDOWN_FN_LINK_CLASS;
+ var $fn_backlink_class = MARKDOWN_FN_BACKLINK_CLASS;
+
+ # Predefined abbreviations.
+ var $predef_abbr = array();
+
+
+ function MarkdownExtra_Parser() {
+ #
+ # Constructor function. Initialize the parser object.
+ #
+ # Add extra escapable characters before parent constructor
+ # initialize the table.
+ $this->escape_chars .= ':|';
+
+ # Insert extra document, block, and span transformations.
+ # Parent constructor will do the sorting.
+ $this->document_gamut += array(
+ "doFencedCodeBlocks" => 5,
+ "stripFootnotes" => 15,
+ "stripAbbreviations" => 25,
+ "appendFootnotes" => 50,
+ );
+ $this->block_gamut += array(
+ "doFencedCodeBlocks" => 5,
+ "doTables" => 15,
+ "doDefLists" => 45,
+ );
+ $this->span_gamut += array(
+ "doFootnotes" => 5,
+ "doAbbreviations" => 70,
+ );
+
+ parent::Markdown_Parser();
+ }
+
+
+ # Extra variables used during extra transformations.
+ var $footnotes = array();
+ var $footnotes_ordered = array();
+ var $abbr_desciptions = array();
+ var $abbr_word_re = '';
+
+ # Give the current footnote number.
+ var $footnote_counter = 1;
+
+
+ function setup() {
+ #
+ # Setting up Extra-specific variables.
+ #
+ parent::setup();
+
+ $this->footnotes = array();
+ $this->footnotes_ordered = array();
+ $this->abbr_desciptions = array();
+ $this->abbr_word_re = '';
+ $this->footnote_counter = 1;
+
+ foreach ($this->predef_abbr as $abbr_word => $abbr_desc) {
+ if ($this->abbr_word_re)
+ $this->abbr_word_re .= '|';
+ $this->abbr_word_re .= preg_quote($abbr_word);
+ $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
+ }
+ }
+
+ function teardown() {
+ #
+ # Clearing Extra-specific variables.
+ #
+ $this->footnotes = array();
+ $this->footnotes_ordered = array();
+ $this->abbr_desciptions = array();
+ $this->abbr_word_re = '';
+
+ parent::teardown();
+ }
+
+
+ ### HTML Block Parser ###
+
+ # Tags that are always treated as block tags:
+ var $block_tags_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend';
+
+ # Tags treated as block tags only if the opening tag is alone on it's line:
+ var $context_block_tags_re = 'script|noscript|math|ins|del';
+
+ # Tags where markdown="1" default to span mode:
+ var $contain_span_tags_re = 'p|h[1-6]|li|dd|dt|td|th|legend|address';
+
+ # Tags which must not have their contents modified, no matter where
+ # they appear:
+ var $clean_tags_re = 'script|math';
+
+ # Tags that do not need to be closed.
+ var $auto_close_tags_re = 'hr|img';
+
+
+ function hashHTMLBlocks($text) {
+ #
+ # Hashify HTML Blocks and "clean tags".
+ #
+ # We only want to do this for block-level HTML tags, such as headers,
+ # lists, and tables. That's because we still want to wrap s around
+ # "paragraphs" that are wrapped in non-block-level tags, such as anchors,
+ # phrase emphasis, and spans. The list of tags we're looking for is
+ # hard-coded.
+ #
+ # This works by calling _HashHTMLBlocks_InMarkdown, which then calls
+ # _HashHTMLBlocks_InHTML when it encounter block tags. When the markdown="1"
+ # attribute is found whitin a tag, _HashHTMLBlocks_InHTML calls back
+ # _HashHTMLBlocks_InMarkdown to handle the Markdown syntax within the tag.
+ # These two functions are calling each other. It's recursive!
+ #
+ #
+ # Call the HTML-in-Markdown hasher.
+ #
+ list($text, ) = $this->_hashHTMLBlocks_inMarkdown($text);
+
+ return $text;
+ }
+ function _hashHTMLBlocks_inMarkdown($text, $indent = 0,
+ $enclosing_tag_re = '', $span = false)
+ {
+ #
+ # Parse markdown text, calling _HashHTMLBlocks_InHTML for block tags.
+ #
+ # * $indent is the number of space to be ignored when checking for code
+ # blocks. This is important because if we don't take the indent into
+ # account, something like this (which looks right) won't work as expected:
+ #
+ #
+ #
+ # Hello World. <-- Is this a Markdown code block or text?
+ # <-- Is this a Markdown code block or a real tag?
+ #
+ #
+ # If you don't like this, just don't indent the tag on which
+ # you apply the markdown="1" attribute.
+ #
+ # * If $enclosing_tag_re is not empty, stops at the first unmatched closing
+ # tag with that name. Nested tags supported.
+ #
+ # * If $span is true, text inside must treated as span. So any double
+ # newline will be replaced by a single newline so that it does not create
+ # paragraphs.
+ #
+ # Returns an array of that form: ( processed text , remaining text )
+ #
+ if ($text === '') return array('', '');
+
+ # Regex to check for the presense of newlines around a block tag.
+ $newline_before_re = '/(?:^\n?|\n\n)*$/';
+ $newline_after_re =
+ '{
+ ^ # Start of text following the tag.
+ (?>[ ]*)? # Optional comment.
+ [ ]*\n # Must be followed by newline.
+ }xs';
+
+ # Regex to match any tag.
+ $block_tag_re =
+ '{
+ ( # $2: Capture hole tag.
+ ? # Any opening or closing tag.
+ (?> # Tag name.
+ '.$this->block_tags_re.' |
+ '.$this->context_block_tags_re.' |
+ '.$this->clean_tags_re.' |
+ (?!\s)'.$enclosing_tag_re.'
+ )
+ (?:
+ (?=[\s"\'/]) # Allowed characters after tag name.
+ (?>
+ ".*?" | # Double quotes (can contain `>`)
+ \'.*?\' | # Single quotes (can contain `>`)
+ .+? # Anything but quotes and `>`.
+ )*?
+ )?
+ > # End of tag.
+ |
+ # HTML Comment
+ |
+ <\?.*?\?> | <%.*?%> # Processing instruction
+ |
+ # CData Block
+ |
+ # Code span marker
+ `+
+ '. ( !$span ? ' # If not in span.
+ |
+ # Indented code block
+ (?> ^[ ]*\n? | \n[ ]*\n )
+ [ ]{'.($indent+4).'}[^\n]* \n
+ (?>
+ (?: [ ]{'.($indent+4).'}[^\n]* | [ ]* ) \n
+ )*
+ |
+ # Fenced code block marker
+ (?> ^ | \n )
+ [ ]{'.($indent).'}~~~+[ ]*\n
+ ' : '' ). ' # End (if not is span).
+ )
+ }xs';
+
+
+ $depth = 0; # Current depth inside the tag tree.
+ $parsed = ""; # Parsed text that will be returned.
+
+ #
+ # Loop through every tag until we find the closing tag of the parent
+ # or loop until reaching the end of text if no parent tag specified.
+ #
+ do {
+ #
+ # Split the text using the first $tag_match pattern found.
+ # Text before pattern will be first in the array, text after
+ # pattern will be at the end, and between will be any catches made
+ # by the pattern.
+ #
+ $parts = preg_split($block_tag_re, $text, 2,
+ PREG_SPLIT_DELIM_CAPTURE);
+
+ # If in Markdown span mode, add a empty-string span-level hash
+ # after each newline to prevent triggering any block element.
+ if ($span) {
+ $void = $this->hashPart("", ':');
+ $newline = "$void\n";
+ $parts[0] = $void . str_replace("\n", $newline, $parts[0]) . $void;
+ }
+
+ $parsed .= $parts[0]; # Text before current tag.
+
+ # If end of $text has been reached. Stop loop.
+ if (count($parts) < 3) {
+ $text = "";
+ break;
+ }
+
+ $tag = $parts[1]; # Tag to handle.
+ $text = $parts[2]; # Remaining text after current tag.
+ $tag_re = preg_quote($tag); # For use in a regular expression.
+
+ #
+ # Check for: Code span marker
+ #
+ if ($tag{0} == "`") {
+ # Find corresponding end marker.
+ $tag_re = preg_quote($tag);
+ if (preg_match('{^(?>.+?|\n(?!\n))*?(?.*\n)+?'.$tag_re.' *\n}', $text,
+ $matches))
+ {
+ # End marker found: pass text unchanged until marker.
+ $parsed .= $tag . $matches[0];
+ $text = substr($text, strlen($matches[0]));
+ }
+ else {
+ # No end marker: just skip it.
+ $parsed .= $tag;
+ }
+ }
+ }
+ #
+ # Check for: Opening Block level tag or
+ # Opening Context Block tag (like ins and del)
+ # used as a block tag (tag is alone on it's line).
+ #
+ else if (preg_match('{^<(?:'.$this->block_tags_re.')\b}', $tag) ||
+ ( preg_match('{^<(?:'.$this->context_block_tags_re.')\b}', $tag) &&
+ preg_match($newline_before_re, $parsed) &&
+ preg_match($newline_after_re, $text) )
+ )
+ {
+ # Need to parse tag and following text using the HTML parser.
+ list($block_text, $text) =
+ $this->_hashHTMLBlocks_inHTML($tag . $text, "hashBlock", true);
+
+ # Make sure it stays outside of any paragraph by adding newlines.
+ $parsed .= "\n\n$block_text\n\n";
+ }
+ #
+ # Check for: Clean tag (like script, math)
+ # HTML Comments, processing instructions.
+ #
+ else if (preg_match('{^<(?:'.$this->clean_tags_re.')\b}', $tag) ||
+ $tag{1} == '!' || $tag{1} == '?')
+ {
+ # Need to parse tag and following text using the HTML parser.
+ # (don't check for markdown attribute)
+ list($block_text, $text) =
+ $this->_hashHTMLBlocks_inHTML($tag . $text, "hashClean", false);
+
+ $parsed .= $block_text;
+ }
+ #
+ # Check for: Tag with same name as enclosing tag.
+ #
+ else if ($enclosing_tag_re !== '' &&
+ # Same name as enclosing tag.
+ preg_match('{^?(?:'.$enclosing_tag_re.')\b}', $tag))
+ {
+ #
+ # Increase/decrease nested tag count.
+ #
+ if ($tag{1} == '/') $depth--;
+ else if ($tag{strlen($tag)-2} != '/') $depth++;
+
+ if ($depth < 0) {
+ #
+ # Going out of parent element. Clean up and break so we
+ # return to the calling function.
+ #
+ $text = $tag . $text;
+ break;
+ }
+
+ $parsed .= $tag;
+ }
+ else {
+ $parsed .= $tag;
+ }
+ } while ($depth >= 0);
+
+ return array($parsed, $text);
+ }
+ function _hashHTMLBlocks_inHTML($text, $hash_method, $md_attr) {
+ #
+ # Parse HTML, calling _HashHTMLBlocks_InMarkdown for block tags.
+ #
+ # * Calls $hash_method to convert any blocks.
+ # * Stops when the first opening tag closes.
+ # * $md_attr indicate if the use of the `markdown="1"` attribute is allowed.
+ # (it is not inside clean tags)
+ #
+ # Returns an array of that form: ( processed text , remaining text )
+ #
+ if ($text === '') return array('', '');
+
+ # Regex to match `markdown` attribute inside of a tag.
+ $markdown_attr_re = '
+ {
+ \s* # Eat whitespace before the `markdown` attribute
+ markdown
+ \s*=\s*
+ (?>
+ (["\']) # $1: quote delimiter
+ (.*?) # $2: attribute value
+ \1 # matching delimiter
+ |
+ ([^\s>]*) # $3: unquoted attribute value
+ )
+ () # $4: make $3 always defined (avoid warnings)
+ }xs';
+
+ # Regex to match any tag.
+ $tag_re = '{
+ ( # $2: Capture hole tag.
+ ? # Any opening or closing tag.
+ [\w:$]+ # Tag name.
+ (?:
+ (?=[\s"\'/]) # Allowed characters after tag name.
+ (?>
+ ".*?" | # Double quotes (can contain `>`)
+ \'.*?\' | # Single quotes (can contain `>`)
+ .+? # Anything but quotes and `>`.
+ )*?
+ )?
+ > # End of tag.
+ |
+ # HTML Comment
+ |
+ <\?.*?\?> | <%.*?%> # Processing instruction
+ |
+ # CData Block
+ )
+ }xs';
+
+ $original_text = $text; # Save original text in case of faliure.
+
+ $depth = 0; # Current depth inside the tag tree.
+ $block_text = ""; # Temporary text holder for current text.
+ $parsed = ""; # Parsed text that will be returned.
+
+ #
+ # Get the name of the starting tag.
+ # (This pattern makes $base_tag_name_re safe without quoting.)
+ #
+ if (preg_match('/^<([\w:$]*)\b/', $text, $matches))
+ $base_tag_name_re = $matches[1];
+
+ #
+ # Loop through every tag until we find the corresponding closing tag.
+ #
+ do {
+ #
+ # Split the text using the first $tag_match pattern found.
+ # Text before pattern will be first in the array, text after
+ # pattern will be at the end, and between will be any catches made
+ # by the pattern.
+ #
+ $parts = preg_split($tag_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
+
+ if (count($parts) < 3) {
+ #
+ # End of $text reached with unbalenced tag(s).
+ # In that case, we return original text unchanged and pass the
+ # first character as filtered to prevent an infinite loop in the
+ # parent function.
+ #
+ return array($original_text{0}, substr($original_text, 1));
+ }
+
+ $block_text .= $parts[0]; # Text before current tag.
+ $tag = $parts[1]; # Tag to handle.
+ $text = $parts[2]; # Remaining text after current tag.
+
+ #
+ # Check for: Auto-close tag (like
)
+ # Comments and Processing Instructions.
+ #
+ if (preg_match('{^?(?:'.$this->auto_close_tags_re.')\b}', $tag) ||
+ $tag{1} == '!' || $tag{1} == '?')
+ {
+ # Just add the tag to the block as if it was text.
+ $block_text .= $tag;
+ }
+ else {
+ #
+ # Increase/decrease nested tag count. Only do so if
+ # the tag's name match base tag's.
+ #
+ if (preg_match('{^?'.$base_tag_name_re.'\b}', $tag)) {
+ if ($tag{1} == '/') $depth--;
+ else if ($tag{strlen($tag)-2} != '/') $depth++;
+ }
+
+ #
+ # Check for `markdown="1"` attribute and handle it.
+ #
+ if ($md_attr &&
+ preg_match($markdown_attr_re, $tag, $attr_m) &&
+ preg_match('/^1|block|span$/', $attr_m[2] . $attr_m[3]))
+ {
+ # Remove `markdown` attribute from opening tag.
+ $tag = preg_replace($markdown_attr_re, '', $tag);
+
+ # Check if text inside this tag must be parsed in span mode.
+ $this->mode = $attr_m[2] . $attr_m[3];
+ $span_mode = $this->mode == 'span' || $this->mode != 'block' &&
+ preg_match('{^<(?:'.$this->contain_span_tags_re.')\b}', $tag);
+
+ # Calculate indent before tag.
+ if (preg_match('/(?:^|\n)( *?)(?! ).*?$/', $block_text, $matches)) {
+ $strlen = $this->utf8_strlen;
+ $indent = $strlen($matches[1], 'UTF-8');
+ } else {
+ $indent = 0;
+ }
+
+ # End preceding block with this tag.
+ $block_text .= $tag;
+ $parsed .= $this->$hash_method($block_text);
+
+ # Get enclosing tag name for the ParseMarkdown function.
+ # (This pattern makes $tag_name_re safe without quoting.)
+ preg_match('/^<([\w:$]*)\b/', $tag, $matches);
+ $tag_name_re = $matches[1];
+
+ # Parse the content using the HTML-in-Markdown parser.
+ list ($block_text, $text)
+ = $this->_hashHTMLBlocks_inMarkdown($text, $indent,
+ $tag_name_re, $span_mode);
+
+ # Outdent markdown text.
+ if ($indent > 0) {
+ $block_text = preg_replace("/^[ ]{1,$indent}/m", "",
+ $block_text);
+ }
+
+ # Append tag content to parsed text.
+ if (!$span_mode) $parsed .= "\n\n$block_text\n\n";
+ else $parsed .= "$block_text";
+
+ # Start over a new block.
+ $block_text = "";
+ }
+ else $block_text .= $tag;
+ }
+
+ } while ($depth > 0);
+
+ #
+ # Hash last block text that wasn't processed inside the loop.
+ #
+ $parsed .= $this->$hash_method($block_text);
+
+ return array($parsed, $text);
+ }
+
+
+ function hashClean($text) {
+ #
+ # Called whenever a tag must be hashed when a function insert a "clean" tag
+ # in $text, it pass through this function and is automaticaly escaped,
+ # blocking invalid nested overlap.
+ #
+ return $this->hashPart($text, 'C');
+ }
+
+
+ function doHeaders($text) {
+ #
+ # Redefined to add id attribute support.
+ #
+ # Setext-style headers:
+ # Header 1 {#header1}
+ # ========
+ #
+ # Header 2 {#header2}
+ # --------
+ #
+ $text = preg_replace_callback(
+ '{
+ (^.+?) # $1: Header text
+ (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # $2: Id attribute
+ [ ]*\n(=+|-+)[ ]*\n+ # $3: Header footer
+ }mx',
+ array(&$this, '_doHeaders_callback_setext'), $text);
+
+ # atx-style headers:
+ # # Header 1 {#header1}
+ # ## Header 2 {#header2}
+ # ## Header 2 with closing hashes ## {#header3}
+ # ...
+ # ###### Header 6 {#header2}
+ #
+ $text = preg_replace_callback('{
+ ^(\#{1,6}) # $1 = string of #\'s
+ [ ]*
+ (.+?) # $2 = Header text
+ [ ]*
+ \#* # optional closing #\'s (not counted)
+ (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # id attribute
+ [ ]*
+ \n+
+ }xm',
+ array(&$this, '_doHeaders_callback_atx'), $text);
+
+ return $text;
+ }
+ function _doHeaders_attr($attr) {
+ if (empty($attr)) return "";
+ return " id=\"$attr\"";
+ }
+ function _doHeaders_callback_setext($matches) {
+ if ($matches[3] == '-' && preg_match('{^- }', $matches[1]))
+ return $matches[0];
+ $level = $matches[3]{0} == '=' ? 1 : 2;
+ $attr = $this->_doHeaders_attr($id =& $matches[2]);
+ $block = "".$this->runSpanGamut($matches[1])." ";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+ function _doHeaders_callback_atx($matches) {
+ $level = strlen($matches[1]);
+ $attr = $this->_doHeaders_attr($id =& $matches[3]);
+ $block = "".$this->runSpanGamut($matches[2])." ";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+
+
+ function doTables($text) {
+ #
+ # Form HTML tables.
+ #
+ $less_than_tab = $this->tab_width - 1;
+ #
+ # Find tables with leading pipe.
+ #
+ # | Header 1 | Header 2
+ # | -------- | --------
+ # | Cell 1 | Cell 2
+ # | Cell 3 | Cell 4
+ #
+ $text = preg_replace_callback('
+ {
+ ^ # Start of a line
+ [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
+ [|] # Optional leading pipe (present)
+ (.+) \n # $1: Header row (at least one pipe)
+
+ [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
+ [|] ([ ]*[-:]+[-| :]*) \n # $2: Header underline
+
+ ( # $3: Cells
+ (?>
+ [ ]* # Allowed whitespace.
+ [|] .* \n # Row content.
+ )*
+ )
+ (?=\n|\Z) # Stop at final double newline.
+ }xm',
+ array(&$this, '_doTable_leadingPipe_callback'), $text);
+
+ #
+ # Find tables without leading pipe.
+ #
+ # Header 1 | Header 2
+ # -------- | --------
+ # Cell 1 | Cell 2
+ # Cell 3 | Cell 4
+ #
+ $text = preg_replace_callback('
+ {
+ ^ # Start of a line
+ [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
+ (\S.*[|].*) \n # $1: Header row (at least one pipe)
+
+ [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
+ ([-:]+[ ]*[|][-| :]*) \n # $2: Header underline
+
+ ( # $3: Cells
+ (?>
+ .* [|] .* \n # Row content
+ )*
+ )
+ (?=\n|\Z) # Stop at final double newline.
+ }xm',
+ array(&$this, '_DoTable_callback'), $text);
+
+ return $text;
+ }
+ function _doTable_leadingPipe_callback($matches) {
+ $head = $matches[1];
+ $underline = $matches[2];
+ $content = $matches[3];
+
+ # Remove leading pipe for each row.
+ $content = preg_replace('/^ *[|]/m', '', $content);
+
+ return $this->_doTable_callback(array($matches[0], $head, $underline, $content));
+ }
+ function _doTable_callback($matches) {
+ $head = $matches[1];
+ $underline = $matches[2];
+ $content = $matches[3];
+
+ # Remove any tailing pipes for each line.
+ $head = preg_replace('/[|] *$/m', '', $head);
+ $underline = preg_replace('/[|] *$/m', '', $underline);
+ $content = preg_replace('/[|] *$/m', '', $content);
+
+ # Reading alignement from header underline.
+ $separators = preg_split('/ *[|] */', $underline);
+ foreach ($separators as $n => $s) {
+ if (preg_match('/^ *-+: *$/', $s)) $attr[$n] = ' align="right"';
+ else if (preg_match('/^ *:-+: *$/', $s))$attr[$n] = ' align="center"';
+ else if (preg_match('/^ *:-+ *$/', $s)) $attr[$n] = ' align="left"';
+ else $attr[$n] = '';
+ }
+
+ # Parsing span elements, including code spans, character escapes,
+ # and inline HTML tags, so that pipes inside those gets ignored.
+ $head = $this->parseSpan($head);
+ $headers = preg_split('/ *[|] */', $head);
+ $col_count = count($headers);
+
+ # Write column headers.
+ $text = "\n";
+ $text .= "\n";
+ $text .= "\n";
+ foreach ($headers as $n => $header)
+ $text .= " ".$this->runSpanGamut(trim($header))." \n";
+ $text .= " \n";
+ $text .= "\n";
+
+ # Split content by row.
+ $rows = explode("\n", trim($content, "\n"));
+
+ $text .= "\n";
+ foreach ($rows as $row) {
+ # Parsing span elements, including code spans, character escapes,
+ # and inline HTML tags, so that pipes inside those gets ignored.
+ $row = $this->parseSpan($row);
+
+ # Split row by cell.
+ $row_cells = preg_split('/ *[|] */', $row, $col_count);
+ $row_cells = array_pad($row_cells, $col_count, '');
+
+ $text .= "\n";
+ foreach ($row_cells as $n => $cell)
+ $text .= " ".$this->runSpanGamut(trim($cell))." \n";
+ $text .= " \n";
+ }
+ $text .= "\n";
+ $text .= "
";
+
+ return $this->hashBlock($text) . "\n";
+ }
+
+
+ function doDefLists($text) {
+ #
+ # Form HTML definition lists.
+ #
+ $less_than_tab = $this->tab_width - 1;
+
+ # Re-usable pattern to match any entire dl list:
+ $whole_list_re = '(?>
+ ( # $1 = whole list
+ ( # $2
+ [ ]{0,'.$less_than_tab.'}
+ ((?>.*\S.*\n)+) # $3 = defined term
+ \n?
+ [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
+ )
+ (?s:.+?)
+ ( # $4
+ \z
+ |
+ \n{2,}
+ (?=\S)
+ (?! # Negative lookahead for another term
+ [ ]{0,'.$less_than_tab.'}
+ (?: \S.*\n )+? # defined term
+ \n?
+ [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
+ )
+ (?! # Negative lookahead for another definition
+ [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
+ )
+ )
+ )
+ )'; // mx
+
+ $text = preg_replace_callback('{
+ (?>\A\n?|(?<=\n\n))
+ '.$whole_list_re.'
+ }mx',
+ array(&$this, '_doDefLists_callback'), $text);
+
+ return $text;
+ }
+ function _doDefLists_callback($matches) {
+ # Re-usable patterns to match list item bullets and number markers:
+ $list = $matches[1];
+
+ # Turn double returns into triple returns, so that we can make a
+ # paragraph for the last item in a list, if necessary:
+ $result = trim($this->processDefListItems($list));
+ $result = "\n" . $result . "\n
";
+ return $this->hashBlock($result) . "\n\n";
+ }
+
+
+ function processDefListItems($list_str) {
+ #
+ # Process the contents of a single definition list, splitting it
+ # into individual term and definition list items.
+ #
+ $less_than_tab = $this->tab_width - 1;
+
+ # trim trailing blank lines:
+ $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
+
+ # Process definition terms.
+ $list_str = preg_replace_callback('{
+ (?>\A\n?|\n\n+) # leading line
+ ( # definition terms = $1
+ [ ]{0,'.$less_than_tab.'} # leading whitespace
+ (?![:][ ]|[ ]) # negative lookahead for a definition
+ # mark (colon) or more whitespace.
+ (?> \S.* \n)+? # actual term (not whitespace).
+ )
+ (?=\n?[ ]{0,3}:[ ]) # lookahead for following line feed
+ # with a definition mark.
+ }xm',
+ array(&$this, '_processDefListItems_callback_dt'), $list_str);
+
+ # Process actual definitions.
+ $list_str = preg_replace_callback('{
+ \n(\n+)? # leading line = $1
+ ( # marker space = $2
+ [ ]{0,'.$less_than_tab.'} # whitespace before colon
+ [:][ ]+ # definition mark (colon)
+ )
+ ((?s:.+?)) # definition text = $3
+ (?= \n+ # stop at next definition mark,
+ (?: # next term or end of text
+ [ ]{0,'.$less_than_tab.'} [:][ ] |
+ | \z
+ )
+ )
+ }xm',
+ array(&$this, '_processDefListItems_callback_dd'), $list_str);
+
+ return $list_str;
+ }
+ function _processDefListItems_callback_dt($matches) {
+ $terms = explode("\n", trim($matches[1]));
+ $text = '';
+ foreach ($terms as $term) {
+ $term = $this->runSpanGamut(trim($term));
+ $text .= "\n" . $term . " ";
+ }
+ return $text . "\n";
+ }
+ function _processDefListItems_callback_dd($matches) {
+ $leading_line = $matches[1];
+ $marker_space = $matches[2];
+ $def = $matches[3];
+
+ if ($leading_line || preg_match('/\n{2,}/', $def)) {
+ # Replace marker with the appropriate whitespace indentation
+ $def = str_repeat(' ', strlen($marker_space)) . $def;
+ $def = $this->runBlockGamut($this->outdent($def . "\n\n"));
+ $def = "\n". $def ."\n";
+ }
+ else {
+ $def = rtrim($def);
+ $def = $this->runSpanGamut($this->outdent($def));
+ }
+
+ return "\n " . $def . " \n";
+ }
+
+
+ function doFencedCodeBlocks($text) {
+ #
+ # Adding the fenced code block syntax to regular Markdown:
+ #
+ # ~~~
+ # Code block
+ # ~~~
+ #
+ $less_than_tab = $this->tab_width;
+
+ $text = preg_replace_callback('{
+ (?:\n|\A)
+ # 1: Opening marker
+ (
+ ~{3,} # Marker: three tilde or more.
+ )
+ [ ]* \n # Whitespace and newline following marker.
+
+ # 2: Content
+ (
+ (?>
+ (?!\1 [ ]* \n) # Not a closing marker.
+ .*\n+
+ )+
+ )
+
+ # Closing marker.
+ \1 [ ]* \n
+ }xm',
+ array(&$this, '_doFencedCodeBlocks_callback'), $text);
+
+ return $text;
+ }
+ function _doFencedCodeBlocks_callback($matches) {
+ $codeblock = $matches[2];
+ $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
+ $codeblock = preg_replace_callback('/^\n+/',
+ array(&$this, '_doFencedCodeBlocks_newlines'), $codeblock);
+ $codeblock = "$codeblock
";
+ return "\n\n".$this->hashBlock($codeblock)."\n\n";
+ }
+ function _doFencedCodeBlocks_newlines($matches) {
+ return str_repeat("
empty_element_suffix",
+ strlen($matches[0]));
+ }
+
+
+ #
+ # Redefining emphasis markers so that emphasis by underscore does not
+ # work in the middle of a word.
+ #
+ var $em_relist = array(
+ '' => '(?:(? '(?<=\S)(? '(?<=\S)(? '(?:(? '(?<=\S)(? '(?<=\S)(? '(?:(? '(?<=\S)(? '(?<=\S)(? tags
+ #
+ # Strip leading and trailing lines:
+ $text = preg_replace('/\A\n+|\n+\z/', '', $text);
+
+ $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
+
+ #
+ # Wrap tags and unhashify HTML blocks
+ #
+ foreach ($grafs as $key => $value) {
+ $value = trim($this->runSpanGamut($value));
+
+ # Check if this should be enclosed in a paragraph.
+ # Clean tag hashes & block tag hashes are left alone.
+ $is_p = !preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/', $value);
+
+ if ($is_p) {
+ $value = "
$value
";
+ }
+ $grafs[$key] = $value;
+ }
+
+ # Join grafs in one text, then unhash HTML tags.
+ $text = implode("\n\n", $grafs);
+
+ # Finish by removing any tag hashes still present in $text.
+ $text = $this->unhash($text);
+
+ return $text;
+ }
+
+
+ ### Footnotes
+
+ function stripFootnotes($text) {
+ #
+ # Strips link definitions from text, stores the URLs and titles in
+ # hash references.
+ #
+ $less_than_tab = $this->tab_width - 1;
+
+ # Link defs are in the form: [^id]: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,'.$less_than_tab.'}\[\^(.+?)\][ ]?: # note_id = $1
+ [ ]*
+ \n? # maybe *one* newline
+ ( # text = $2 (no blank lines allowed)
+ (?:
+ .+ # actual text
+ |
+ \n # newlines but
+ (?!\[\^.+?\]:\s)# negative lookahead for footnote marker.
+ (?!\n+[ ]{0,3}\S)# ensure line is not blank and followed
+ # by non-indented content
+ )*
+ )
+ }xm',
+ array(&$this, '_stripFootnotes_callback'),
+ $text);
+ return $text;
+ }
+ function _stripFootnotes_callback($matches) {
+ $note_id = $this->fn_id_prefix . $matches[1];
+ $this->footnotes[$note_id] = $this->outdent($matches[2]);
+ return ''; # String that will replace the block
+ }
+
+
+ function doFootnotes($text) {
+ #
+ # Replace footnote references in $text [^id] with a special text-token
+ # which will be replaced by the actual footnote marker in appendFootnotes.
+ #
+ if (!$this->in_anchor) {
+ $text = preg_replace('{\[\^(.+?)\]}', "F\x1Afn:\\1\x1A:", $text);
+ }
+ return $text;
+ }
+
+
+ function appendFootnotes($text) {
+ #
+ # Append footnote list to text.
+ #
+ $text = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
+ array(&$this, '_appendFootnotes_callback'), $text);
+
+ if (!empty($this->footnotes_ordered)) {
+ $text .= "\n\n";
+ $text .= "\n";
+ $text .= "
fn_backlink_class != "") {
+ $class = $this->fn_backlink_class;
+ $class = $this->encodeAttribute($class);
+ $attr .= " class=\"$class\"";
+ }
+ if ($this->fn_backlink_title != "") {
+ $title = $this->fn_backlink_title;
+ $title = $this->encodeAttribute($title);
+ $attr .= " title=\"$title\"";
+ }
+ $num = 0;
+
+ while (!empty($this->footnotes_ordered)) {
+ $footnote = reset($this->footnotes_ordered);
+ $note_id = key($this->footnotes_ordered);
+ unset($this->footnotes_ordered[$note_id]);
+
+ $footnote .= "\n"; # Need to append newline before parsing.
+ $footnote = $this->runBlockGamut("$footnote\n");
+ $footnote = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
+ array(&$this, '_appendFootnotes_callback'), $footnote);
+
+ $attr = str_replace("%%", ++$num, $attr);
+ $note_id = $this->encodeAttribute($note_id);
+
+ # Add backlink to last paragraph; create new paragraph if needed.
+ $backlink = "↩";
+ if (preg_match('{$}', $footnote)) {
+ $footnote = substr($footnote, 0, -4) . " $backlink";
+ } else {
+ $footnote .= "\n\n$backlink
";
+ }
+
+ $text .= "\n";
+ $text .= $footnote . "\n";
+ $text .= " \n\n";
+ }
+
+ $text .= "\n";
+ $text .= "";
+ }
+ return $text;
+ }
+ function _appendFootnotes_callback($matches) {
+ $node_id = $this->fn_id_prefix . $matches[1];
+
+ # Create footnote marker only if it has a corresponding footnote *and*
+ # the footnote hasn't been used by another marker.
+ if (isset($this->footnotes[$node_id])) {
+ # Transfert footnote content to the ordered list.
+ $this->footnotes_ordered[$node_id] = $this->footnotes[$node_id];
+ unset($this->footnotes[$node_id]);
+
+ $num = $this->footnote_counter++;
+ $attr = " rel=\"footnote\"";
+ if ($this->fn_link_class != "") {
+ $class = $this->fn_link_class;
+ $class = $this->encodeAttribute($class);
+ $attr .= " class=\"$class\"";
+ }
+ if ($this->fn_link_title != "") {
+ $title = $this->fn_link_title;
+ $title = $this->encodeAttribute($title);
+ $attr .= " title=\"$title\"";
+ }
+
+ $attr = str_replace("%%", $num, $attr);
+ $node_id = $this->encodeAttribute($node_id);
+
+ return
+ "".
+ "$num".
+ "";
+ }
+
+ return "[^".$matches[1]."]";
+ }
+
+
+ ### Abbreviations ###
+
+ function stripAbbreviations($text) {
+ #
+ # Strips abbreviations from text, stores titles in hash references.
+ #
+ $less_than_tab = $this->tab_width - 1;
+
+ # Link defs are in the form: [id]*: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,'.$less_than_tab.'}\*\[(.+?)\][ ]?: # abbr_id = $1
+ (.*) # text = $2 (no blank lines allowed)
+ }xm',
+ array(&$this, '_stripAbbreviations_callback'),
+ $text);
+ return $text;
+ }
+ function _stripAbbreviations_callback($matches) {
+ $abbr_word = $matches[1];
+ $abbr_desc = $matches[2];
+ if ($this->abbr_word_re)
+ $this->abbr_word_re .= '|';
+ $this->abbr_word_re .= preg_quote($abbr_word);
+ $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
+ return ''; # String that will replace the block
+ }
+
+
+ function doAbbreviations($text) {
+ #
+ # Find defined abbreviations in text and wrap them in elements.
+ #
+ if ($this->abbr_word_re) {
+ // cannot use the /x modifier because abbr_word_re may
+ // contain significant spaces:
+ $text = preg_replace_callback('{'.
+ '(?abbr_word_re.')'.
+ '(?![\w\x1A])'.
+ '}',
+ array(&$this, '_doAbbreviations_callback'), $text);
+ }
+ return $text;
+ }
+ function _doAbbreviations_callback($matches) {
+ $abbr = $matches[0];
+ if (isset($this->abbr_desciptions[$abbr])) {
+ $desc = $this->abbr_desciptions[$abbr];
+ if (empty($desc)) {
+ return $this->hashPart("$abbr");
+ } else {
+ $desc = $this->encodeAttribute($desc);
+ return $this->hashPart("$abbr");
+ }
+ } else {
+ return $matches[0];
+ }
+ }
+
+}
+
+
+/*
+
+PHP Markdown Extra
+==================
+
+Description
+-----------
+
+This is a PHP port of the original Markdown formatter written in Perl
+by John Gruber. This special "Extra" version of PHP Markdown features
+further enhancements to the syntax for making additional constructs
+such as tables and definition list.
+
+Markdown is a text-to-HTML filter; it translates an easy-to-read /
+easy-to-write structured text format into HTML. Markdown's text format
+is most similar to that of plain text email, and supports features such
+as headers, *emphasis*, code blocks, blockquotes, and links.
+
+Markdown's syntax is designed not as a generic markup language, but
+specifically to serve as a front-end to (X)HTML. You can use span-level
+HTML tags anywhere in a Markdown document, and you can use block level
+HTML tags (like and as well).
+
+For more information about Markdown's syntax, see:
+
+
+
+
+Bugs
+----
+
+To file bug reports please send email to:
+
+
+
+Please include with your report: (1) the example input; (2) the output you
+expected; (3) the output Markdown actually produced.
+
+
+Version History
+---------------
+
+See the readme file for detailed release notes for this version.
+
+
+Copyright and License
+---------------------
+
+PHP Markdown & Extra
+Copyright (c) 2004-2008 Michel Fortin
+
+All rights reserved.
+
+Based on Markdown
+Copyright (c) 2003-2006 John Gruber
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name "Markdown" nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+This software is provided by the copyright holders and contributors "as
+is" and any express or implied warranties, including, but not limited
+to, the implied warranties of merchantability and fitness for a
+particular purpose are disclaimed. In no event shall the copyright owner
+or contributors be liable for any direct, indirect, incidental, special,
+exemplary, or consequential damages (including, but not limited to,
+procurement of substitute goods or services; loss of use, data, or
+profits; or business interruption) however caused and on any theory of
+liability, whether in contract, strict liability, or tort (including
+negligence or otherwise) arising in any way out of the use of this
+software, even if advised of the possibility of such damage.
+
+*/
+?>
\ No newline at end of file
diff --git a/system/application/libraries/.svn/text-base/page.php.svn-base b/system/application/libraries/.svn/text-base/page.php.svn-base
new file mode 100644
index 0000000..e94d149
--- /dev/null
+++ b/system/application/libraries/.svn/text-base/page.php.svn-base
@@ -0,0 +1,210 @@
+currentPage = (integer) abs($reqCurrentPage);
+ }
+
+ function SetItemCount($reqItemCount){
+ $this->itemCount = (integer) abs($reqItemCount);
+ }
+
+ function SetItemsPerPage($reqItemsPerPage){
+ $this->itemsPerPage = (integer) abs($reqItemsPerPage);
+ }
+
+ function SetLinksHref($reqLinksHref){
+ $this->linksHref = $reqLinksHref;
+ }
+
+ function SetLinksFormat($reqPageJumpBack, $reqPageSeparator, $reqPageJumpNext){
+ $this->pageJumpBack = $reqPageJumpBack;
+ $this->pageSeparator = $reqPageSeparator;
+ $this->pageJumpNext = $reqPageJumpNext;
+ }
+
+ function SetLinksToDisplay($reqLinksToDisplay){
+ $this->linksToDisplay = (integer) abs($reqLinksToDisplay);
+ }
+
+ function SetQueryStringVar($reqQueryStringVar){
+ $this->queryStringVar = $reqQueryStringVar;
+ }
+
+ function SetQueryString($reqQueryString){
+ $this->queryString = $reqQueryString;
+ }
+
+ function GetCurrentCollection($reqCollection){
+ if($this->currentPage < 1){
+ $start = 0;
+ }
+ elseif($this->currentPage > $this->GetPageCount()){
+ $start = $this->GetPageCount() * $this->itemsPerPage - $this->itemsPerPage;
+ }
+ else {
+ $start = $this->currentPage * $this->itemsPerPage - $this->itemsPerPage;
+ }
+
+ return array_slice($reqCollection, $start, $this->itemsPerPage);
+ }
+
+ function GetPageCount(){
+ return (integer)ceil($this->itemCount/$this->itemsPerPage);
+ }
+
+ function GetPageLinks(){
+ $strLinks = '';
+ $pageCount = $this->GetPageCount();
+ $queryString = $this->GetQueryString();
+ $linksPad = floor($this->linksToDisplay/2);
+
+ if($this->linksToDisplay == -1){
+ $this->linksToDisplay = $pageCount;
+ }
+
+
+ if($pageCount == 0){
+ $strLinks = '1';
+ }
+ elseif($this->currentPage - 1 <= $linksPad || ($pageCount - $this->linksToDisplay + 1 == 0) || $this->linksToDisplay > $pageCount){
+ $start = 1;
+ }
+ elseif($pageCount - $this->currentPage <= $linksPad){
+ $start = $pageCount - $this->linksToDisplay + 1;
+ }
+ else {
+ $start = $this->currentPage - $linksPad;
+ }
+
+
+ if(isset($start)){
+ if($start > 1){
+ if(!empty($this->pageJumpBack)){
+ $pageNum = $start - $this->linksToDisplay + $linksPad;
+ if($pageNum < 1){
+ $pageNum = 1;
+ }
+
+ $strLinks .= '';
+ $strLinks .= $this->pageJumpBack.''.$this->pageSeparator;
+ }
+
+ $strLinks .= '1...'.$this->pageSeparator;
+ }
+
+
+ if($start + $this->linksToDisplay > $pageCount){
+ $end = $pageCount;
+ }
+ else {
+ $end = $start + $this->linksToDisplay - 1;
+ }
+
+
+ for($i = $start; $i <= $end; $i ++){
+ if($i != $this->currentPage){
+ $strLinks .= '';
+ $strLinks .= ($i).''.$this->pageSeparator;
+ }
+ else {
+ $strLinks .= $i.$this->pageSeparator;
+ }
+ }
+ $strLinks = substr($strLinks, 0, -strlen($this->pageSeparator));
+
+
+ if($start + $this->linksToDisplay - 1 < $pageCount){
+ $strLinks .= $this->pageSeparator.'';
+ $strLinks .= '...'.$pageCount.''.$this->pageSeparator;
+
+ if(!empty($this->pageJumpNext)){
+ $pageNum = $start + $this->linksToDisplay + $linksPad;
+ if($pageNum > $pageCount){
+ $pageNum = $pageCount;
+ }
+
+ $strLinks .= '';
+ $strLinks .= $this->pageJumpNext.'';
+ }
+ }
+ }
+
+
+ return $strLinks;
+ }
+
+ function GetQueryString(){
+ $pattern = array('/'.$this->queryStringVar.'=[^&]*&?/', '/&$/');
+ $replace = array('', '');
+ $queryString = preg_replace($pattern, $replace, $this->queryString);
+ $queryString = str_replace('&', '&', $queryString);
+
+ if(!empty($queryString)){
+ $queryString.= '&';
+ }
+
+ return "page/";
+ }
+
+ function GetSqlLimit(){
+ return $this->itemsPerPage;
+ }
+
+ function GetOffset(){
+ return $this->currentPage * $this->itemsPerPage - $this->itemsPerPage;
+ }
+
+ function GetLimit(){
+ return $this->itemsPerPage;
+ }
+
+ function __Construct(){
+ $this->SetCurrentPage(1);
+ $this->SetItemsPerPage(10);
+ $this->SetItemCount(0);
+ $this->SetLinksFormat('« Back',' • ','Next »');
+ $this->SetLinksHref($_SERVER['PHP_SELF']);
+ $this->SetLinksToDisplay(10);
+ $this->SetQueryStringVar('page');
+ $this->SetQueryString($_SERVER['QUERY_STRING']);
+
+ if(isset($_GET[$this->queryStringVar]) && is_numeric($_GET[$this->queryStringVar])){
+ $this->SetCurrentPage($_GET[$this->queryStringVar]);
+ }
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/system/application/libraries/.svn/text-base/simplepie.php.svn-base b/system/application/libraries/.svn/text-base/simplepie.php.svn-base
new file mode 100644
index 0000000..f5cd9a7
--- /dev/null
+++ b/system/application/libraries/.svn/text-base/simplepie.php.svn-base
@@ -0,0 +1,13284 @@
+' . SIMPLEPIE_NAME . '');
+
+/**
+ * No Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_NONE', 0);
+
+/**
+ * Feed Link Element Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_AUTODISCOVERY', 1);
+
+/**
+ * Local Feed Extension Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_LOCAL_EXTENSION', 2);
+
+/**
+ * Local Feed Body Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_LOCAL_BODY', 4);
+
+/**
+ * Remote Feed Extension Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_REMOTE_EXTENSION', 8);
+
+/**
+ * Remote Feed Body Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_REMOTE_BODY', 16);
+
+/**
+ * All Feed Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_ALL', 31);
+
+/**
+ * No known feed type
+ */
+define('SIMPLEPIE_TYPE_NONE', 0);
+
+/**
+ * RSS 0.90
+ */
+define('SIMPLEPIE_TYPE_RSS_090', 1);
+
+/**
+ * RSS 0.91 (Netscape)
+ */
+define('SIMPLEPIE_TYPE_RSS_091_NETSCAPE', 2);
+
+/**
+ * RSS 0.91 (Userland)
+ */
+define('SIMPLEPIE_TYPE_RSS_091_USERLAND', 4);
+
+/**
+ * RSS 0.91 (both Netscape and Userland)
+ */
+define('SIMPLEPIE_TYPE_RSS_091', 6);
+
+/**
+ * RSS 0.92
+ */
+define('SIMPLEPIE_TYPE_RSS_092', 8);
+
+/**
+ * RSS 0.93
+ */
+define('SIMPLEPIE_TYPE_RSS_093', 16);
+
+/**
+ * RSS 0.94
+ */
+define('SIMPLEPIE_TYPE_RSS_094', 32);
+
+/**
+ * RSS 1.0
+ */
+define('SIMPLEPIE_TYPE_RSS_10', 64);
+
+/**
+ * RSS 2.0
+ */
+define('SIMPLEPIE_TYPE_RSS_20', 128);
+
+/**
+ * RDF-based RSS
+ */
+define('SIMPLEPIE_TYPE_RSS_RDF', 65);
+
+/**
+ * Non-RDF-based RSS (truly intended as syndication format)
+ */
+define('SIMPLEPIE_TYPE_RSS_SYNDICATION', 190);
+
+/**
+ * All RSS
+ */
+define('SIMPLEPIE_TYPE_RSS_ALL', 255);
+
+/**
+ * Atom 0.3
+ */
+define('SIMPLEPIE_TYPE_ATOM_03', 256);
+
+/**
+ * Atom 1.0
+ */
+define('SIMPLEPIE_TYPE_ATOM_10', 512);
+
+/**
+ * All Atom
+ */
+define('SIMPLEPIE_TYPE_ATOM_ALL', 768);
+
+/**
+ * All feed types
+ */
+define('SIMPLEPIE_TYPE_ALL', 1023);
+
+/**
+ * No construct
+ */
+define('SIMPLEPIE_CONSTRUCT_NONE', 0);
+
+/**
+ * Text construct
+ */
+define('SIMPLEPIE_CONSTRUCT_TEXT', 1);
+
+/**
+ * HTML construct
+ */
+define('SIMPLEPIE_CONSTRUCT_HTML', 2);
+
+/**
+ * XHTML construct
+ */
+define('SIMPLEPIE_CONSTRUCT_XHTML', 4);
+
+/**
+ * base64-encoded construct
+ */
+define('SIMPLEPIE_CONSTRUCT_BASE64', 8);
+
+/**
+ * IRI construct
+ */
+define('SIMPLEPIE_CONSTRUCT_IRI', 16);
+
+/**
+ * A construct that might be HTML
+ */
+define('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32);
+
+/**
+ * All constructs
+ */
+define('SIMPLEPIE_CONSTRUCT_ALL', 63);
+
+/**
+ * PCRE for HTML attributes
+ */
+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]*');
+
+/**
+ * PCRE for XML attributes
+ */
+define('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*');
+
+/**
+ * XML Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_XML', 'http://www.w3.org/XML/1998/namespace');
+
+/**
+ * Atom 1.0 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_ATOM_10', 'http://www.w3.org/2005/Atom');
+
+/**
+ * Atom 0.3 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_ATOM_03', 'http://purl.org/atom/ns#');
+
+/**
+ * RDF Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_RDF', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
+
+/**
+ * RSS 0.90 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_RSS_090', 'http://my.netscape.com/rdf/simple/0.9/');
+
+/**
+ * RSS 1.0 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/');
+
+/**
+ * RSS 1.0 Content Module Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/');
+
+/**
+ * DC 1.0 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/');
+
+/**
+ * DC 1.1 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_DC_11', 'http://purl.org/dc/elements/1.1/');
+
+/**
+ * W3C Basic Geo (WGS84 lat/long) Vocabulary Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO', 'http://www.w3.org/2003/01/geo/wgs84_pos#');
+
+/**
+ * GeoRSS Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss');
+
+/**
+ * Media RSS Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/');
+
+/**
+ * iTunes RSS Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd');
+
+/**
+ * XHTML Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml');
+
+/**
+ * IANA Link Relations Registry
+ */
+define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/');
+
+/**
+ * Whether we're running on PHP5
+ */
+define('SIMPLEPIE_PHP5', version_compare(PHP_VERSION, '5.0.0', '>='));
+
+/**
+ * No file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_NONE', 0);
+
+/**
+ * Remote file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_REMOTE', 1);
+
+/**
+ * Local file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_LOCAL', 2);
+
+/**
+ * fsockopen() file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4);
+
+/**
+ * cURL file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_CURL', 8);
+
+/**
+ * file_get_contents() file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16);
+
+/**
+ * SimplePie
+ *
+ * @package SimplePie
+ * @version "Razzleberry"
+ * @copyright 2004-2007 Ryan Parman, Geoffrey Sneddon
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @todo Option for type of fetching (cache, not modified header, fetch, etc.)
+ */
+class SimplePie
+{
+ /**
+ * @var array Raw data
+ * @access private
+ */
+ var $data = array();
+
+ /**
+ * @var mixed Error string
+ * @access private
+ */
+ var $error;
+
+ /**
+ * @var object Instance of SimplePie_Sanitize (or other class)
+ * @see SimplePie::set_sanitize_class()
+ * @access private
+ */
+ var $sanitize;
+
+ /**
+ * @var string SimplePie Useragent
+ * @see SimplePie::set_useragent()
+ * @access private
+ */
+ var $useragent = SIMPLEPIE_USERAGENT;
+
+ /**
+ * @var string Feed URL
+ * @see SimplePie::set_feed_url()
+ * @access private
+ */
+ var $feed_url;
+
+ /**
+ * @var object Instance of SimplePie_File to use as a feed
+ * @see SimplePie::set_file()
+ * @access private
+ */
+ var $file;
+
+ /**
+ * @var string Raw feed data
+ * @see SimplePie::set_raw_data()
+ * @access private
+ */
+ var $raw_data;
+
+ /**
+ * @var int Timeout for fetching remote files
+ * @see SimplePie::set_timeout()
+ * @access private
+ */
+ var $timeout = 10;
+
+ /**
+ * @var bool Forces fsockopen() to be used for remote files instead
+ * of cURL, even if a new enough version is installed
+ * @see SimplePie::force_fsockopen()
+ * @access private
+ */
+ var $force_fsockopen = false;
+
+ /**
+ * @var bool Force the given data/URL to be treated as a feed no matter what
+ * it appears like
+ * @see SimplePie::force_feed()
+ * @access private
+ */
+ var $force_feed = false;
+
+ /**
+ * @var bool Enable/Disable XML dump
+ * @see SimplePie::enable_xml_dump()
+ * @access private
+ */
+ var $xml_dump = false;
+
+ /**
+ * @var bool Enable/Disable Caching
+ * @see SimplePie::enable_cache()
+ * @access private
+ */
+ var $cache = true;
+
+ /**
+ * @var int Cache duration (in seconds)
+ * @see SimplePie::set_cache_duration()
+ * @access private
+ */
+ var $cache_duration = 3600;
+
+ /**
+ * @var int Auto-discovery cache duration (in seconds)
+ * @see SimplePie::set_autodiscovery_cache_duration()
+ * @access private
+ */
+ var $autodiscovery_cache_duration = 604800; // 7 Days.
+
+ /**
+ * @var string Cache location (relative to executing script)
+ * @see SimplePie::set_cache_location()
+ * @access private
+ */
+ var $cache_location = './cache';
+
+ /**
+ * @var string Function that creates the cache filename
+ * @see SimplePie::set_cache_name_function()
+ * @access private
+ */
+ var $cache_name_function = 'md5';
+
+ /**
+ * @var bool Reorder feed by date descending
+ * @see SimplePie::enable_order_by_date()
+ * @access private
+ */
+ var $order_by_date = true;
+
+ /**
+ * @var mixed Force input encoding to be set to the follow value
+ * (false, or anything type-cast to false, disables this feature)
+ * @see SimplePie::set_input_encoding()
+ * @access private
+ */
+ var $input_encoding = false;
+
+ /**
+ * @var int Feed Autodiscovery Level
+ * @see SimplePie::set_autodiscovery_level()
+ * @access private
+ */
+ var $autodiscovery = SIMPLEPIE_LOCATOR_ALL;
+
+ /**
+ * @var string Class used for caching feeds
+ * @see SimplePie::set_cache_class()
+ * @access private
+ */
+ var $cache_class = 'SimplePie_Cache';
+
+ /**
+ * @var string Class used for locating feeds
+ * @see SimplePie::set_locator_class()
+ * @access private
+ */
+ var $locator_class = 'SimplePie_Locator';
+
+ /**
+ * @var string Class used for parsing feeds
+ * @see SimplePie::set_parser_class()
+ * @access private
+ */
+ var $parser_class = 'SimplePie_Parser';
+
+ /**
+ * @var string Class used for fetching feeds
+ * @see SimplePie::set_file_class()
+ * @access private
+ */
+ var $file_class = 'SimplePie_File';
+
+ /**
+ * @var string Class used for items
+ * @see SimplePie::set_item_class()
+ * @access private
+ */
+ var $item_class = 'SimplePie_Item';
+
+ /**
+ * @var string Class used for authors
+ * @see SimplePie::set_author_class()
+ * @access private
+ */
+ var $author_class = 'SimplePie_Author';
+
+ /**
+ * @var string Class used for categories
+ * @see SimplePie::set_category_class()
+ * @access private
+ */
+ var $category_class = 'SimplePie_Category';
+
+ /**
+ * @var string Class used for enclosures
+ * @see SimplePie::set_enclosures_class()
+ * @access private
+ */
+ var $enclosure_class = 'SimplePie_Enclosure';
+
+ /**
+ * @var string Class used for Media RSS captions
+ * @see SimplePie::set_caption_class()
+ * @access private
+ */
+ var $caption_class = 'SimplePie_Caption';
+
+ /**
+ * @var string Class used for Media RSS
+ * @see SimplePie::set_copyright_class()
+ * @access private
+ */
+ var $copyright_class = 'SimplePie_Copyright';
+
+ /**
+ * @var string Class used for Media RSS
+ * @see SimplePie::set_credit_class()
+ * @access private
+ */
+ var $credit_class = 'SimplePie_Credit';
+
+ /**
+ * @var string Class used for Media RSS
+ * @see SimplePie::set_rating_class()
+ * @access private
+ */
+ var $rating_class = 'SimplePie_Rating';
+
+ /**
+ * @var string Class used for Media RSS
+ * @see SimplePie::set_restriction_class()
+ * @access private
+ */
+ var $restriction_class = 'SimplePie_Restriction';
+
+ /**
+ * @var string Class used for content-type sniffing
+ * @see SimplePie::set_content_type_sniffer_class()
+ * @access private
+ */
+ var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer';
+
+ /**
+ * @var string Class used for item sources.
+ * @see SimplePie::set_source_class()
+ * @access private
+ */
+ var $source_class = 'SimplePie_Source';
+
+ /**
+ * @var mixed Set javascript query string parameter (false, or
+ * anything type-cast to false, disables this feature)
+ * @see SimplePie::set_javascript()
+ * @access private
+ */
+ var $javascript = 'js';
+
+ /**
+ * @var int Maximum number of feeds to check with autodiscovery
+ * @see SimplePie::set_max_checked_feeds()
+ * @access private
+ */
+ var $max_checked_feeds = 10;
+
+ /**
+ * @var string Web-accessible path to the handler_favicon.php file.
+ * @see SimplePie::set_favicon_handler()
+ * @access private
+ */
+ var $favicon_handler = '';
+
+ /**
+ * @var string Web-accessible path to the handler_image.php file.
+ * @see SimplePie::set_image_handler()
+ * @access private
+ */
+ var $image_handler = '';
+
+ /**
+ * @var array Stores the URLs when multiple feeds are being initialized.
+ * @see SimplePie::set_feed_url()
+ * @access private
+ */
+ var $multifeed_url = array();
+
+ /**
+ * @var array Stores SimplePie objects when multiple feeds initialized.
+ * @access private
+ */
+ var $multifeed_objects = array();
+
+ /**
+ * @var array Stores the get_object_vars() array for use with multifeeds.
+ * @see SimplePie::set_feed_url()
+ * @access private
+ */
+ var $config_settings = null;
+
+ /**
+ * @var integer Stores the number of items to return per-feed with multifeeds.
+ * @see SimplePie::set_item_limit()
+ * @access private
+ */
+ var $item_limit = 0;
+
+ /**
+ * @var array Stores the default attributes to be stripped by strip_attributes().
+ * @see SimplePie::strip_attributes()
+ * @access private
+ */
+ var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
+
+ /**
+ * @var array Stores the default tags to be stripped by strip_htmltags().
+ * @see SimplePie::strip_htmltags()
+ * @access private
+ */
+ var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
+
+ /**
+ * The SimplePie class contains feed level data and options
+ *
+ * There are two ways that you can create a new SimplePie object. The first
+ * is by passing a feed URL as a parameter to the SimplePie constructor
+ * (as well as optionally setting the cache location and cache expiry). This
+ * will initialise the whole feed with all of the default settings, and you
+ * can begin accessing methods and properties immediately.
+ *
+ * The second way is to create the SimplePie object with no parameters
+ * at all. This will enable you to set configuration options. After setting
+ * them, you must initialise the feed using $feed->init(). At that point the
+ * object's methods and properties will be available to you. This format is
+ * what is used throughout this documentation.
+ *
+ * @access public
+ * @since 1.0 Preview Release
+ * @param string $feed_url This is the URL you want to parse.
+ * @param string $cache_location This is where you want the cache to be stored.
+ * @param int $cache_duration This is the number of seconds that you want to store the cache file for.
+ */
+ function SimplePie($feed_url = null, $cache_location = null, $cache_duration = null)
+ {
+ // Other objects, instances created here so we can set options on them
+ $this->sanitize =& new SimplePie_Sanitize;
+
+ // Set options if they're passed to the constructor
+ if ($cache_location !== null)
+ {
+ $this->set_cache_location($cache_location);
+ }
+
+ if ($cache_duration !== null)
+ {
+ $this->set_cache_duration($cache_duration);
+ }
+
+ // Only init the script if we're passed a feed URL
+ if ($feed_url !== null)
+ {
+ $this->set_feed_url($feed_url);
+ $this->init();
+ }
+ }
+
+ /**
+ * Used for converting object to a string
+ */
+ function __toString()
+ {
+ return md5(serialize($this->data));
+ }
+
+ /**
+ * Remove items that link back to this before destroying this object
+ */
+ function __destruct()
+ {
+ if (!empty($this->data['items']))
+ {
+ foreach ($this->data['items'] as $item)
+ {
+ $item->__destruct();
+ }
+ unset($this->data['items']);
+ }
+ if (!empty($this->data['ordered_items']))
+ {
+ foreach ($this->data['ordered_items'] as $item)
+ {
+ $item->__destruct();
+ }
+ unset($this->data['ordered_items']);
+ }
+ }
+
+ /**
+ * Force the given data/URL to be treated as a feed no matter what it
+ * appears like
+ *
+ * @access public
+ * @since 1.1
+ * @param bool $enable Force the given data/URL to be treated as a feed
+ */
+ function force_feed($enable = false)
+ {
+ $this->force_feed = (bool) $enable;
+ }
+
+ /**
+ * This is the URL of the feed you want to parse.
+ *
+ * This allows you to enter the URL of the feed you want to parse, or the
+ * website you want to try to use auto-discovery on. This takes priority
+ * over any set raw data.
+ *
+ * You can set multiple feeds to mash together by passing an array instead
+ * of a string for the $url. Remember that with each additional feed comes
+ * additional processing and resources.
+ *
+ * @access public
+ * @since 1.0 Preview Release
+ * @param mixed $url This is the URL (or array of URLs) that you want to parse.
+ * @see SimplePie::set_raw_data()
+ */
+ function set_feed_url($url)
+ {
+ if (is_array($url))
+ {
+ $this->multifeed_url = array();
+ foreach ($url as $value)
+ {
+ $this->multifeed_url[] = SimplePie_Misc::fix_protocol($value, 1);
+ }
+ }
+ else
+ {
+ $this->feed_url = SimplePie_Misc::fix_protocol($url, 1);
+ }
+ }
+
+ /**
+ * Provides an instance of SimplePie_File to use as a feed
+ *
+ * @access public
+ * @param object &$file Instance of SimplePie_File (or subclass)
+ * @return bool True on success, false on failure
+ */
+ function set_file(&$file)
+ {
+ if (is_a($file, 'SimplePie_File'))
+ {
+ $this->feed_url = $file->url;
+ $this->file =& $file;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to use a string of RSS/Atom data instead of a remote feed.
+ *
+ * If you have a feed available as a string in PHP, you can tell SimplePie
+ * to parse that data string instead of a remote feed. Any set feed URL
+ * takes precedence.
+ *
+ * @access public
+ * @since 1.0 Beta 3
+ * @param string $data RSS or Atom data as a string.
+ * @see SimplePie::set_feed_url()
+ */
+ function set_raw_data($data)
+ {
+ $this->raw_data = trim($data);
+ }
+
+ /**
+ * Allows you to override the default timeout for fetching remote feeds.
+ *
+ * This allows you to change the maximum time the feed's server to respond
+ * and send the feed back.
+ *
+ * @access public
+ * @since 1.0 Beta 3
+ * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed.
+ */
+ function set_timeout($timeout = 10)
+ {
+ $this->timeout = (int) $timeout;
+ }
+
+ /**
+ * Forces SimplePie to use fsockopen() instead of the preferred cURL
+ * functions.
+ *
+ * @access public
+ * @since 1.0 Beta 3
+ * @param bool $enable Force fsockopen() to be used
+ */
+ function force_fsockopen($enable = false)
+ {
+ $this->force_fsockopen = (bool) $enable;
+ }
+
+ /**
+ * Outputs the raw XML content of the feed, after it has gone through
+ * SimplePie's filters.
+ *
+ * Used only for debugging, this function will output the XML content as
+ * text/xml. When SimplePie reads in a feed, it does a bit of cleaning up
+ * before trying to parse it. Many parts of the feed are re-written in
+ * memory, and in the end, you have a parsable feed. XML dump shows you the
+ * actual XML that SimplePie tries to parse, which may or may not be very
+ * different from the original feed.
+ *
+ * @access public
+ * @since 1.0 Preview Release
+ * @param bool $enable Enable XML dump
+ */
+ function enable_xml_dump($enable = false)
+ {
+ $this->xml_dump = (bool) $enable;
+ }
+
+ /**
+ * Enables/disables caching in SimplePie.
+ *
+ * This option allows you to disable caching all-together in SimplePie.
+ * However, disabling the cache can lead to longer load times.
+ *
+ * @access public
+ * @since 1.0 Preview Release
+ * @param bool $enable Enable caching
+ */
+ function enable_cache($enable = true)
+ {
+ $this->cache = (bool) $enable;
+ }
+
+ /**
+ * Set the length of time (in seconds) that the contents of a feed
+ * will be cached.
+ *
+ * @access public
+ * @param int $seconds The feed content cache duration.
+ */
+ function set_cache_duration($seconds = 3600)
+ {
+ $this->cache_duration = (int) $seconds;
+ }
+
+ /**
+ * Set the length of time (in seconds) that the autodiscovered feed
+ * URL will be cached.
+ *
+ * @access public
+ * @param int $seconds The autodiscovered feed URL cache duration.
+ */
+ function set_autodiscovery_cache_duration($seconds = 604800)
+ {
+ $this->autodiscovery_cache_duration = (int) $seconds;
+ }
+
+ /**
+ * Set the file system location where the cached files should be stored.
+ *
+ * @access public
+ * @param string $location The file system location.
+ */
+ function set_cache_location($location = './cache')
+ {
+ $this->cache_location = (string) $location;
+ }
+
+ /**
+ * Determines whether feed items should be sorted into reverse chronological order.
+ *
+ * @access public
+ * @param bool $enable Sort as reverse chronological order.
+ */
+ function enable_order_by_date($enable = true)
+ {
+ $this->order_by_date = (bool) $enable;
+ }
+
+ /**
+ * Allows you to override the character encoding reported by the feed.
+ *
+ * @access public
+ * @param string $encoding Character encoding.
+ */
+ function set_input_encoding($encoding = false)
+ {
+ if ($encoding)
+ {
+ $this->input_encoding = (string) $encoding;
+ }
+ else
+ {
+ $this->input_encoding = false;
+ }
+ }
+
+ /**
+ * Set how much feed autodiscovery to do
+ *
+ * @access public
+ * @see SIMPLEPIE_LOCATOR_NONE
+ * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY
+ * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION
+ * @see SIMPLEPIE_LOCATOR_LOCAL_BODY
+ * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION
+ * @see SIMPLEPIE_LOCATOR_REMOTE_BODY
+ * @see SIMPLEPIE_LOCATOR_ALL
+ * @param int $level Feed Autodiscovery Level (level can be a
+ * combination of the above constants, see bitwise OR operator)
+ */
+ function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL)
+ {
+ $this->autodiscovery = (int) $level;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for caching.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_cache_class($class = 'SimplePie_Cache')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Cache'))
+ {
+ $this->cache_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for auto-discovery.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_locator_class($class = 'SimplePie_Locator')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Locator'))
+ {
+ $this->locator_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for XML parsing.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_parser_class($class = 'SimplePie_Parser')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Parser'))
+ {
+ $this->parser_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for remote file fetching.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_file_class($class = 'SimplePie_File')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_File'))
+ {
+ $this->file_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for data sanitization.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_sanitize_class($class = 'SimplePie_Sanitize')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Sanitize'))
+ {
+ $this->sanitize =& new $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for handling feed items.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_item_class($class = 'SimplePie_Item')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Item'))
+ {
+ $this->item_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for handling author data.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_author_class($class = 'SimplePie_Author')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Author'))
+ {
+ $this->author_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for handling category data.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_category_class($class = 'SimplePie_Category')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Category'))
+ {
+ $this->category_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for feed enclosures.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_enclosure_class($class = 'SimplePie_Enclosure')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Enclosure'))
+ {
+ $this->enclosure_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for captions
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_caption_class($class = 'SimplePie_Caption')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Caption'))
+ {
+ $this->caption_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_copyright_class($class = 'SimplePie_Copyright')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Copyright'))
+ {
+ $this->copyright_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_credit_class($class = 'SimplePie_Credit')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Credit'))
+ {
+ $this->credit_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_rating_class($class = 'SimplePie_Rating')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Rating'))
+ {
+ $this->rating_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_restriction_class($class = 'SimplePie_Restriction')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Restriction'))
+ {
+ $this->restriction_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for content-type sniffing.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Content_Type_Sniffer'))
+ {
+ $this->content_type_sniffer_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses item sources.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_source_class($class = 'SimplePie_Source')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Source'))
+ {
+ $this->source_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to override the default user agent string.
+ *
+ * @access public
+ * @param string $ua New user agent string.
+ */
+ function set_useragent($ua = SIMPLEPIE_USERAGENT)
+ {
+ $this->useragent = (string) $ua;
+ }
+
+ /**
+ * Set callback function to create cache filename with
+ *
+ * @access public
+ * @param mixed $function Callback function
+ */
+ function set_cache_name_function($function = 'md5')
+ {
+ if (is_callable($function))
+ {
+ $this->cache_name_function = $function;
+ }
+ }
+
+ /**
+ * Set javascript query string parameter
+ *
+ * @access public
+ * @param mixed $get Javascript query string parameter
+ */
+ function set_javascript($get = 'js')
+ {
+ if ($get)
+ {
+ $this->javascript = (string) $get;
+ }
+ else
+ {
+ $this->javascript = false;
+ }
+ }
+
+ /**
+ * Set options to make SP as fast as possible. Forgoes a
+ * substantial amount of data sanitization in favor of speed.
+ *
+ * @access public
+ * @param bool $set Whether to set them or not
+ */
+ function set_stupidly_fast($set = false)
+ {
+ if ($set)
+ {
+ $this->enable_order_by_date(false);
+ $this->remove_div(false);
+ $this->strip_comments(false);
+ $this->strip_htmltags(false);
+ $this->strip_attributes(false);
+ $this->set_image_handler(false);
+ }
+ }
+
+ /**
+ * Set maximum number of feeds to check with autodiscovery
+ *
+ * @access public
+ * @param int $max Maximum number of feeds to check
+ */
+ function set_max_checked_feeds($max = 10)
+ {
+ $this->max_checked_feeds = (int) $max;
+ }
+
+ function remove_div($enable = true)
+ {
+ $this->sanitize->remove_div($enable);
+ }
+
+ function strip_htmltags($tags = '', $encode = null)
+ {
+ if ($tags === '')
+ {
+ $tags = $this->strip_htmltags;
+ }
+ $this->sanitize->strip_htmltags($tags);
+ if ($encode !== null)
+ {
+ $this->sanitize->encode_instead_of_strip($tags);
+ }
+ }
+
+ function encode_instead_of_strip($enable = true)
+ {
+ $this->sanitize->encode_instead_of_strip($enable);
+ }
+
+ function strip_attributes($attribs = '')
+ {
+ if ($attribs === '')
+ {
+ $attribs = $this->strip_attributes;
+ }
+ $this->sanitize->strip_attributes($attribs);
+ }
+
+ function set_output_encoding($encoding = 'UTF-8')
+ {
+ $this->sanitize->set_output_encoding($encoding);
+ }
+
+ function strip_comments($strip = false)
+ {
+ $this->sanitize->strip_comments($strip);
+ }
+
+ /**
+ * Set element/attribute key/value pairs of HTML attributes
+ * containing URLs that need to be resolved relative to the feed
+ *
+ * @access public
+ * @since 1.0
+ * @param array $element_attribute Element/attribute key/value pairs
+ */
+ 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'))
+ {
+ $this->sanitize->set_url_replacements($element_attribute);
+ }
+
+ /**
+ * Set the handler to enable the display of cached favicons.
+ *
+ * @access public
+ * @param str $page Web-accessible path to the handler_favicon.php file.
+ * @param str $qs The query string that the value should be passed to.
+ */
+ function set_favicon_handler($page = false, $qs = 'i')
+ {
+ if ($page != false)
+ {
+ $this->favicon_handler = $page . '?' . $qs . '=';
+ }
+ else
+ {
+ $this->favicon_handler = '';
+ }
+ }
+
+ /**
+ * Set the handler to enable the display of cached images.
+ *
+ * @access public
+ * @param str $page Web-accessible path to the handler_image.php file.
+ * @param str $qs The query string that the value should be passed to.
+ */
+ function set_image_handler($page = false, $qs = 'i')
+ {
+ if ($page != false)
+ {
+ $this->sanitize->set_image_handler($page . '?' . $qs . '=');
+ }
+ else
+ {
+ $this->image_handler = '';
+ }
+ }
+
+ /**
+ * Set the limit for items returned per-feed with multifeeds.
+ *
+ * @access public
+ * @param integer $limit The maximum number of items to return.
+ */
+ function set_item_limit($limit = 0)
+ {
+ $this->item_limit = (int) $limit;
+ }
+
+ function init()
+ {
+ if ((function_exists('version_compare') && version_compare(PHP_VERSION, '4.3.0', '<')) || !extension_loaded('xml') || !extension_loaded('pcre'))
+ {
+ return false;
+ }
+ if (isset($_GET[$this->javascript]))
+ {
+ if (function_exists('ob_gzhandler'))
+ {
+ ob_start('ob_gzhandler');
+ }
+ header('Content-type: text/javascript; charset: UTF-8');
+ header('Cache-Control: must-revalidate');
+ header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
+ ?>
+function embed_odeo(link) {
+ document.writeln('');
+}
+
+function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) {
+ if (placeholder != '') {
+ document.writeln('');
+ }
+ else {
+ document.writeln('');
+ }
+}
+
+function embed_flash(bgcolor, width, height, link, loop, type) {
+ document.writeln('');
+}
+
+function embed_flv(width, height, link, placeholder, loop, player) {
+ document.writeln('');
+}
+
+function embed_wmedia(width, height, link) {
+ document.writeln('');
+}
+ sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->cache_class);
+ $this->sanitize->pass_file_data($this->file_class, $this->timeout, $this->useragent, $this->force_fsockopen);
+
+ if ($this->feed_url !== null || $this->raw_data !== null)
+ {
+ $this->data = array();
+ $this->multifeed_objects = array();
+ $cache = false;
+
+ if ($this->feed_url !== null)
+ {
+ $parsed_feed_url = SimplePie_Misc::parse_url($this->feed_url);
+ // Decide whether to enable caching
+ if ($this->cache && $parsed_feed_url['scheme'] !== '')
+ {
+ $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc');
+ }
+ // If it's enabled and we don't want an XML dump, use the cache
+ if ($cache && !$this->xml_dump)
+ {
+ // Load the Cache
+ $this->data = $cache->load();
+ if (!empty($this->data))
+ {
+ // If the cache is for an outdated build of SimplePie
+ if (!isset($this->data['build']) || $this->data['build'] != SIMPLEPIE_BUILD)
+ {
+ $cache->unlink();
+ $this->data = array();
+ }
+ // If we've hit a collision just rerun it with caching disabled
+ elseif (isset($this->data['url']) && $this->data['url'] != $this->feed_url)
+ {
+ $cache = false;
+ $this->data = array();
+ }
+ // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL.
+ elseif (isset($this->data['feed_url']))
+ {
+ // If the autodiscovery cache is still valid use it.
+ if ($cache->mtime() + $this->autodiscovery_cache_duration > time())
+ {
+ // Do not need to do feed autodiscovery yet.
+ if ($this->data['feed_url'] == $this->data['url'])
+ {
+ $cache->unlink();
+ $this->data = array();
+ }
+ else
+ {
+ $this->set_feed_url($this->data['feed_url']);
+ return $this->init();
+ }
+ }
+ }
+ // Check if the cache has been updated
+ elseif ($cache->mtime() + $this->cache_duration < time())
+ {
+ // If we have last-modified and/or etag set
+ if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag']))
+ {
+ $headers = array();
+ if (isset($this->data['headers']['last-modified']))
+ {
+ $headers['if-modified-since'] = $this->data['headers']['last-modified'];
+ }
+ if (isset($this->data['headers']['etag']))
+ {
+ $headers['if-none-match'] = '"' . $this->data['headers']['etag'] . '"';
+ }
+ $file =& new $this->file_class($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen);
+ if ($file->success)
+ {
+ if ($file->status_code == 304)
+ {
+ $cache->touch();
+ return true;
+ }
+ else
+ {
+ $headers = $file->headers;
+ }
+ }
+ else
+ {
+ unset($file);
+ }
+ }
+ }
+ // If the cache is still valid, just return true
+ else
+ {
+ return true;
+ }
+ }
+ // If the cache is empty, delete it
+ else
+ {
+ $cache->unlink();
+ $this->data = array();
+ }
+ }
+ // 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.
+ if (!isset($file))
+ {
+ if (is_a($this->file, 'SimplePie_File') && $this->file->url == $this->feed_url)
+ {
+ $file =& $this->file;
+ }
+ else
+ {
+ $file =& new $this->file_class($this->feed_url, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen);
+ }
+ }
+ // If the file connection has an error, set SimplePie::error to that and quit
+ if (!$file->success)
+ {
+ $this->error = $file->error;
+ if (!empty($this->data))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ if (!$this->force_feed)
+ {
+ // Check if the supplied URL is a feed, if it isn't, look for it.
+ $locate =& new $this->locator_class($file, $this->timeout, $this->useragent, $this->file_class, $this->max_checked_feeds, $this->content_type_sniffer_class);
+ if (!$locate->is_feed($file))
+ {
+ // We need to unset this so that if SimplePie::set_file() has been called that object is untouched
+ unset($file);
+ if ($file = $locate->find($this->autodiscovery))
+ {
+ if ($cache)
+ {
+ $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
+ if (!$cache->save($this))
+ {
+ trigger_error("$cache->name is not writeable", E_USER_WARNING);
+ }
+ $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc');
+ }
+ $this->feed_url = $file->url;
+ }
+ else
+ {
+ $this->error = "A feed could not be found at $this->feed_url";
+ SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
+ return false;
+ }
+ }
+ $locate = null;
+ }
+
+ $headers = $file->headers;
+ $data = $file->body;
+ $sniffer = new $this->content_type_sniffer_class($file);
+ $sniffed = $sniffer->get_type();
+ }
+ else
+ {
+ $data = $this->raw_data;
+ }
+
+ // Set up array of possible encodings
+ $encodings = array();
+
+ // First check to see if input has been overridden.
+ if ($this->input_encoding !== false)
+ {
+ $encodings[] = $this->input_encoding;
+ }
+
+ $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity');
+ $text_types = array('text/xml', 'text/xml-external-parsed-entity');
+
+ // RFC 3023 (only applies to sniffed content)
+ if (isset($sniffed))
+ {
+ if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml')
+ {
+ if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
+ {
+ $encodings[] = strtoupper($charset[1]);
+ }
+ $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data));
+ $encodings[] = 'UTF-8';
+ }
+ elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml')
+ {
+ if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
+ {
+ $encodings[] = $charset[1];
+ }
+ $encodings[] = 'US-ASCII';
+ }
+ // Text MIME-type default
+ elseif (substr($sniffed, 0, 5) === 'text/')
+ {
+ $encodings[] = 'US-ASCII';
+ }
+ }
+
+ // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1
+ $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data));
+ $encodings[] = 'UTF-8';
+ $encodings[] = 'ISO-8859-1';
+
+ // There's no point in trying an encoding twice
+ $encodings = array_unique($encodings);
+
+ // If we want the XML, just output that with the most likely encoding and quit
+ if ($this->xml_dump)
+ {
+ header('Content-type: text/xml; charset=' . $encodings[0]);
+ echo $data;
+ exit;
+ }
+
+ // Loop through each possible encoding, till we return something, or run out of possibilities
+ foreach ($encodings as $encoding)
+ {
+ // Change the encoding to UTF-8 (as we always use UTF-8 internally)
+ $utf8_data = SimplePie_Misc::change_encoding($data, $encoding, 'UTF-8');
+
+ // Create new parser
+ $parser =& new $this->parser_class();
+
+ // If it's parsed fine
+ if ($parser->parse($utf8_data, 'UTF-8'))
+ {
+ $this->data = $parser->get_data();
+ if (isset($this->data['child']))
+ {
+ if (isset($headers))
+ {
+ $this->data['headers'] = $headers;
+ }
+ $this->data['build'] = SIMPLEPIE_BUILD;
+
+ // Cache the file if caching is enabled
+ if ($cache && !$cache->save($this))
+ {
+ trigger_error("$cache->name is not writeable", E_USER_WARNING);
+ }
+ return true;
+ }
+ else
+ {
+ $this->error = "A feed could not be found at $this->feed_url";
+ SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
+ return false;
+ }
+ }
+ }
+ // We have an error, just set SimplePie::error to it and quit
+ $this->error = sprintf('XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());
+ SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
+ return false;
+ }
+ elseif (!empty($this->multifeed_url))
+ {
+ $i = 0;
+ $success = 0;
+ $this->multifeed_objects = array();
+ foreach ($this->multifeed_url as $url)
+ {
+ if (SIMPLEPIE_PHP5)
+ {
+ // This keyword needs to defy coding standards for PHP4 compatibility
+ $this->multifeed_objects[$i] = clone($this);
+ }
+ else
+ {
+ $this->multifeed_objects[$i] = $this;
+ }
+ $this->multifeed_objects[$i]->set_feed_url($url);
+ $success |= $this->multifeed_objects[$i]->init();
+ $i++;
+ }
+ return (bool) $success;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Return the error message for the occured error
+ *
+ * @access public
+ * @return string Error message
+ */
+ function error()
+ {
+ return $this->error;
+ }
+
+ function get_encoding()
+ {
+ return $this->sanitize->output_encoding;
+ }
+
+ function handle_content_type($mime = 'text/html')
+ {
+ if (!headers_sent())
+ {
+ $header = "Content-type: $mime;";
+ if ($this->get_encoding())
+ {
+ $header .= ' charset=' . $this->get_encoding();
+ }
+ else
+ {
+ $header .= ' charset=UTF-8';
+ }
+ header($header);
+ }
+ }
+
+ function get_type()
+ {
+ if (!isset($this->data['type']))
+ {
+ $this->data['type'] = SIMPLEPIE_TYPE_ALL;
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10;
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03;
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF']))
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_10;
+ }
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090;
+ }
+ }
+ elseif (isset($this->data['child']['']['rss']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL;
+ if (isset($this->data['child']['']['rss'][0]['attribs']['']['version']))
+ {
+ switch (trim($this->data['child']['']['rss'][0]['attribs']['']['version']))
+ {
+ case '0.91':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091;
+ if (isset($this->data['child']['']['rss'][0]['child']['']['skiphours']['hour'][0]['data']))
+ {
+ switch (trim($this->data['child']['']['rss'][0]['child']['']['skiphours']['hour'][0]['data']))
+ {
+ case '0':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE;
+ break;
+
+ case '24':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND;
+ break;
+ }
+ }
+ break;
+
+ case '0.92':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_092;
+ break;
+
+ case '0.93':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_093;
+ break;
+
+ case '0.94':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_094;
+ break;
+
+ case '2.0':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_20;
+ break;
+ }
+ }
+ }
+ else
+ {
+ $this->data['type'] = SIMPLEPIE_TYPE_NONE;
+ }
+ }
+ return $this->data['type'];
+ }
+
+ /**
+ * Returns the URL for the favicon of the feed's website.
+ *
+ * @todo Cache atom:icon
+ * @access public
+ * @since 1.0
+ */
+ function get_favicon()
+ {
+ //chopped out a bit here because I always want to use the domain default favicon, not the one set in the feed
+ if (($url = $this->get_link()) !== null && preg_match('/^http(s)?:\/\//i', $url))
+ {
+ $favicon = SimplePie_Misc::absolutize_url('/favicon.ico', $url);
+
+ if ($this->cache && $this->favicon_handler)
+ {
+ $favicon_filename = call_user_func($this->cache_name_function, $favicon);
+ $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $favicon_filename, 'spi');
+
+ if ($cache->load())
+ {
+ return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ $file =& new $this->file_class($favicon, $this->timeout / 10, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen);
+
+ if ($file->success && ($file->status_code == 200 || ($file->status_code > 206 && $file->status_code < 300)) && strlen($file->body) > 0)
+ {
+ $sniffer = new $this->content_type_sniffer_class($file);
+ if (substr($sniffer->get_type(), 0, 6) === 'image/')
+ {
+ if ($cache->save(array('headers' => $file->headers, 'body' => $file->body)))
+ {
+ return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ trigger_error("$cache->name is not writeable", E_USER_WARNING);
+ return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @todo If we have a perm redirect we should return the new URL
+ * @todo When we make the above change, let's support as well
+ * @todo Also, |atom:link|@rel=self
+ */
+ function subscribe_url()
+ {
+ if ($this->feed_url !== null)
+ {
+ return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function subscribe_feed()
+ {
+ if ($this->feed_url !== null)
+ {
+ return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function subscribe_outlook()
+ {
+ if ($this->feed_url !== null)
+ {
+ return 'outlook' . $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function subscribe_podcast()
+ {
+ if ($this->feed_url !== null)
+ {
+ return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 3), SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function subscribe_itunes()
+ {
+ if ($this->feed_url !== null)
+ {
+ return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 4), SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Creates the subscribe_* methods' return data
+ *
+ * @access private
+ * @param string $feed_url String to prefix to the feed URL
+ * @param string $site_url String to prefix to the site URL (and
+ * suffix to the feed URL)
+ * @return mixed URL if feed exists, false otherwise
+ */
+ function subscribe_service($feed_url, $site_url = null)
+ {
+ if ($this->subscribe_url())
+ {
+ $return = $this->sanitize($feed_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->feed_url);
+ if ($site_url !== null && $this->get_link() !== null)
+ {
+ $return .= $this->sanitize($site_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->get_link());
+ }
+ return $return;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function subscribe_aol()
+ {
+ return $this->subscribe_service('http://feeds.my.aol.com/add.jsp?url=');
+ }
+
+ function subscribe_bloglines()
+ {
+ return urldecode($this->subscribe_service('http://www.bloglines.com/sub/'));
+ }
+
+ function subscribe_eskobo()
+ {
+ return $this->subscribe_service('http://www.eskobo.com/?AddToMyPage=');
+ }
+
+ function subscribe_feedfeeds()
+ {
+ return $this->subscribe_service('http://www.feedfeeds.com/add?feed=');
+ }
+
+ function subscribe_feedster()
+ {
+ return $this->subscribe_service('http://www.feedster.com/myfeedster.php?action=addrss&confirm=no&rssurl=');
+ }
+
+ function subscribe_google()
+ {
+ return $this->subscribe_service('http://fusion.google.com/add?feedurl=');
+ }
+
+ function subscribe_gritwire()
+ {
+ return $this->subscribe_service('http://my.gritwire.com/feeds/addExternalFeed.aspx?FeedUrl=');
+ }
+
+ function subscribe_msn()
+ {
+ return $this->subscribe_service('http://my.msn.com/addtomymsn.armx?id=rss&ut=', '&ru=');
+ }
+
+ function subscribe_netvibes()
+ {
+ return $this->subscribe_service('http://www.netvibes.com/subscribe.php?url=');
+ }
+
+ function subscribe_newsburst()
+ {
+ return $this->subscribe_service('http://www.newsburst.com/Source/?add=');
+ }
+
+ function subscribe_newsgator()
+ {
+ return $this->subscribe_service('http://www.newsgator.com/ngs/subscriber/subext.aspx?url=');
+ }
+
+ function subscribe_odeo()
+ {
+ return $this->subscribe_service('http://www.odeo.com/listen/subscribe?feed=');
+ }
+
+ function subscribe_podnova()
+ {
+ return $this->subscribe_service('http://www.podnova.com/index_your_podcasts.srf?action=add&url=');
+ }
+
+ function subscribe_rojo()
+ {
+ return $this->subscribe_service('http://www.rojo.com/add-subscription?resource=');
+ }
+
+ function subscribe_yahoo()
+ {
+ return $this->subscribe_service('http://add.my.yahoo.com/rss?url=');
+ }
+
+ function get_feed_tags($namespace, $tag)
+ {
+ $type = $this->get_type();
+ if ($type & SIMPLEPIE_TYPE_ATOM_10)
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag];
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_ATOM_03)
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag];
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_RDF)
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag];
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
+ {
+ if (isset($this->data['child']['']['rss'][0]['child'][$namespace][$tag]))
+ {
+ return $this->data['child']['']['rss'][0]['child'][$namespace][$tag];
+ }
+ }
+ return null;
+ }
+
+ function get_channel_tags($namespace, $tag)
+ {
+ $type = $this->get_type();
+ if ($type & SIMPLEPIE_TYPE_ATOM_ALL)
+ {
+ if ($return = $this->get_feed_tags($namespace, $tag))
+ {
+ return $return;
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_10)
+ {
+ if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel'))
+ {
+ if (isset($channel[0]['child'][$namespace][$tag]))
+ {
+ return $channel[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_090)
+ {
+ if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel'))
+ {
+ if (isset($channel[0]['child'][$namespace][$tag]))
+ {
+ return $channel[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
+ {
+ if ($channel = $this->get_feed_tags('', 'channel'))
+ {
+ if (isset($channel[0]['child'][$namespace][$tag]))
+ {
+ return $channel[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ return null;
+ }
+
+ function get_image_tags($namespace, $tag)
+ {
+ $type = $this->get_type();
+ if ($type & SIMPLEPIE_TYPE_RSS_10)
+ {
+ if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image'))
+ {
+ if (isset($image[0]['child'][$namespace][$tag]))
+ {
+ return $image[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_090)
+ {
+ if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image'))
+ {
+ if (isset($image[0]['child'][$namespace][$tag]))
+ {
+ return $image[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
+ {
+ if ($image = $this->get_channel_tags('', 'image'))
+ {
+ if (isset($image[0]['child'][$namespace][$tag]))
+ {
+ return $image[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ return null;
+ }
+
+ function get_base($element = array())
+ {
+ if (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base']))
+ {
+ return $element['xml_base'];
+ }
+ elseif ($this->get_link() !== null)
+ {
+ return $this->get_link();
+ }
+ else
+ {
+ return $this->subscribe_url();
+ }
+ }
+
+ function sanitize($data, $type, $base = '')
+ {
+ return $this->sanitize->sanitize($data, $type, $base);
+ }
+
+ function get_title()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags('', 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (isset($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_categories()
+ {
+ $categories = array();
+
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['attribs']['']['term']))
+ {
+ $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] =& new $this->category_class($term, $scheme, $label);
+ }
+ foreach ((array) $this->get_channel_tags('', 'category') as $category)
+ {
+ $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
+ {
+ $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
+ {
+ $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+
+ if (!empty($categories))
+ {
+ return SimplePie_Misc::array_unique($categories);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_author($key = 0)
+ {
+ $authors = $this->get_authors();
+ if (isset($authors[$key]))
+ {
+ return $authors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_authors()
+ {
+ $authors = array();
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $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]));
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $authors[] =& new $this->author_class($name, $uri, $email);
+ }
+ }
+ if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $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]));
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $authors[] =& new $this->author_class($name, $url, $email);
+ }
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
+ {
+ $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
+ {
+ $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
+ {
+ $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+
+ if (!empty($authors))
+ {
+ return SimplePie_Misc::array_unique($authors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_contributor($key = 0)
+ {
+ $contributors = $this->get_contributors();
+ if (isset($contributors[$key]))
+ {
+ return $contributors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_contributors()
+ {
+ $contributors = array();
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $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]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $contributors[] =& new $this->author_class($name, $uri, $email);
+ }
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $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]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $contributors[] =& new $this->author_class($name, $url, $email);
+ }
+ }
+
+ if (!empty($contributors))
+ {
+ return SimplePie_Misc::array_unique($contributors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_link($key = 0, $rel = 'alternate')
+ {
+ $links = $this->get_links($rel);
+ if (isset($links[$key]))
+ {
+ return $links[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Added for parity between the parent-level and the item/entry-level.
+ */
+ function get_permalink()
+ {
+ return $this->get_link(0);
+ }
+
+ function get_links($rel = 'alternate')
+ {
+ if (!isset($this->data['links']))
+ {
+ $this->data['links'] = array();
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
+ {
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ }
+ }
+ }
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
+ {
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+
+ }
+ }
+ }
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_channel_tags('', 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+
+ $keys = array_keys($this->data['links']);
+ foreach ($keys as $key)
+ {
+ if (SimplePie_Misc::is_isegment_nz_nc($key))
+ {
+ if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
+ $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
+ }
+ else
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
+ }
+ }
+ elseif (substr($key, 0, 41) == SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
+ {
+ $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
+ }
+ $this->data['links'][$key] = array_unique($this->data['links'][$key]);
+ }
+ }
+
+ if (isset($this->data['links'][$rel]))
+ {
+ return $this->data['links'][$rel];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_description()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags('', 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_copyright()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags('', 'copyright'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_language()
+ {
+ if ($return = $this->get_channel_tags('', 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang']))
+ {
+ return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang']))
+ {
+ return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang']))
+ {
+ return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['headers']['content-language']))
+ {
+ return $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_latitude()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+ {
+ return (float) $match[1];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_longitude()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+ {
+ return (float) $match[2];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_image_title()
+ {
+ if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_image_tags('', 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_image_url()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
+ {
+ return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'url'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'url'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags('', 'url'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_image_link()
+ {
+ if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags('', 'link'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_image_width()
+ {
+ if ($return = $this->get_image_tags('', 'width'))
+ {
+ return round($return[0]['data']);
+ }
+ elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags('', 'url'))
+ {
+ return 88.0;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_image_height()
+ {
+ if ($return = $this->get_image_tags('', 'height'))
+ {
+ return round($return[0]['data']);
+ }
+ elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags('', 'url'))
+ {
+ return 31.0;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_item_quantity($max = 0)
+ {
+ $qty = count($this->get_items());
+ if ($max == 0)
+ {
+ return $qty;
+ }
+ else
+ {
+ return ($qty > $max) ? $max : $qty;
+ }
+ }
+
+ function get_item($key = 0)
+ {
+ $items = $this->get_items();
+ if (isset($items[$key]))
+ {
+ return $items[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_items($start = 0, $end = 0)
+ {
+ if (!empty($this->multifeed_objects))
+ {
+ return SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit);
+ }
+ elseif (!isset($this->data['items']))
+ {
+ if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+ }
+ }
+ if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+ }
+ }
+ if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+ }
+ }
+ if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+ }
+ }
+ if ($items = $this->get_channel_tags('', 'item'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+ }
+ }
+ }
+
+ if (!empty($this->data['items']))
+ {
+ // If we want to order it by date, check if all items have a date, and then sort it
+ if ($this->order_by_date)
+ {
+ if (!isset($this->data['ordered_items']))
+ {
+ $do_sort = true;
+ foreach ($this->data['items'] as $item)
+ {
+ if (!$item->get_date('U'))
+ {
+ $do_sort = false;
+ break;
+ }
+ }
+ $item = null;
+ $this->data['ordered_items'] = $this->data['items'];
+ if ($do_sort)
+ {
+ usort($this->data['ordered_items'], array(&$this, 'sort_items'));
+ }
+ }
+ $items = $this->data['ordered_items'];
+ }
+ else
+ {
+ $items = $this->data['items'];
+ }
+
+ // Slice the data as desired
+ if ($end == 0)
+ {
+ return array_slice($items, $start);
+ }
+ else
+ {
+ return array_slice($items, $start, $end);
+ }
+ }
+ else
+ {
+ return array();
+ }
+ }
+
+ function sort_items($a, $b)
+ {
+ return $a->get_date('U') <= $b->get_date('U');
+ }
+
+ function merge_items($urls, $start = 0, $end = 0, $limit = 0)
+ {
+ if (is_array($urls) && sizeof($urls) > 0)
+ {
+ $items = array();
+ foreach ($urls as $arg)
+ {
+ if (is_a($arg, 'SimplePie'))
+ {
+ $items = array_merge($items, $arg->get_items(0, $limit));
+ }
+ else
+ {
+ trigger_error('Arguments must be SimplePie objects', E_USER_WARNING);
+ }
+ }
+
+ $do_sort = true;
+ foreach ($items as $item)
+ {
+ if (!$item->get_date('U'))
+ {
+ $do_sort = false;
+ break;
+ }
+ }
+ $item = null;
+ if ($do_sort)
+ {
+ usort($items, array('SimplePie', 'sort_items'));
+ }
+
+ if ($end == 0)
+ {
+ return array_slice($items, $start);
+ }
+ else
+ {
+ return array_slice($items, $start, $end);
+ }
+ }
+ else
+ {
+ trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING);
+ return array();
+ }
+ }
+}
+
+class SimplePie_Item
+{
+ var $feed;
+ var $data = array();
+
+ function SimplePie_Item($feed, $data)
+ {
+ $this->feed = $feed;
+ $this->data = $data;
+ }
+
+ function __toString()
+ {
+ return md5(serialize($this->data));
+ }
+
+ /**
+ * Remove items that link back to this before destroying this object
+ */
+ function __destruct()
+ {
+ unset($this->feed);
+ }
+
+ function get_item_tags($namespace, $tag)
+ {
+ if (isset($this->data['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][$namespace][$tag];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_base($element = array())
+ {
+ return $this->feed->get_base($element);
+ }
+
+ function sanitize($data, $type, $base = '')
+ {
+ return $this->feed->sanitize($data, $type, $base);
+ }
+
+ function get_feed()
+ {
+ return $this->feed;
+ }
+
+ function get_id($hash = false)
+ {
+ if (!$hash)
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags('', 'guid'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (($return = $this->get_permalink()) !== null)
+ {
+ return $return;
+ }
+ elseif (($return = $this->get_title()) !== null)
+ {
+ return $return;
+ }
+ }
+ if ($this->get_permalink() !== null || $this->get_title() !== null)
+ {
+ return md5($this->get_permalink() . $this->get_title());
+ }
+ else
+ {
+ return md5(serialize($this->data));
+ }
+ }
+
+ function get_title()
+ {
+ if (!isset($this->data['title']))
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags('', 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $this->data['title'] = null;
+ }
+ }
+ return $this->data['title'];
+ }
+
+ function get_description($description_only = false)
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags('', 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (!$description_only)
+ {
+ return $this->get_content(true);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_content($content_only = false)
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_content_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif (!$content_only)
+ {
+ return $this->get_description(true);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (isset($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_categories()
+ {
+ $categories = array();
+
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['attribs']['']['term']))
+ {
+ $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ foreach ((array) $this->get_item_tags('', 'category') as $category)
+ {
+ $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
+ {
+ $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
+ {
+ $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+
+ if (!empty($categories))
+ {
+ return SimplePie_Misc::array_unique($categories);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_author($key = 0)
+ {
+ $authors = $this->get_authors();
+ if (isset($authors[$key]))
+ {
+ return $authors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_contributor($key = 0)
+ {
+ $contributors = $this->get_contributors();
+ if (isset($contributors[$key]))
+ {
+ return $contributors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_contributors()
+ {
+ $contributors = array();
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $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]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $contributors[] =& new $this->feed->author_class($name, $uri, $email);
+ }
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $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]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $contributors[] =& new $this->feed->author_class($name, $url, $email);
+ }
+ }
+
+ if (!empty($contributors))
+ {
+ return SimplePie_Misc::array_unique($contributors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * @todo Atom inheritance (item author, source author, feed author)
+ */
+ function get_authors()
+ {
+ $authors = array();
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $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]));
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $authors[] =& new $this->feed->author_class($name, $uri, $email);
+ }
+ }
+ if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $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]));
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $authors[] =& new $this->feed->author_class($name, $url, $email);
+ }
+ }
+ if ($author = $this->get_item_tags('', 'author'))
+ {
+ $authors[] =& new $this->feed->author_class(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
+ {
+ $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
+ {
+ $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
+ {
+ $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+
+ if (!empty($authors))
+ {
+ return SimplePie_Misc::array_unique($authors);
+ }
+ elseif (($source = $this->get_source()) && ($authors = $source->get_authors()))
+ {
+ return $authors;
+ }
+ elseif ($authors = $this->feed->get_authors())
+ {
+ return $authors;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_copyright()
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_date($date_format = 'j F Y, g:i a')
+ {
+ if (!isset($this->data['date']))
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags('', 'pubDate'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+
+ if (!empty($this->data['date']['raw']))
+ {
+ $parser = SimplePie_Parse_Date::get();
+ $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']);
+ }
+ else
+ {
+ $this->data['date'] = null;
+ }
+ }
+ if ($this->data['date'])
+ {
+ $date_format = (string) $date_format;
+ switch ($date_format)
+ {
+ case '':
+ return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);
+
+ case 'U':
+ return $this->data['date']['parsed'];
+
+ default:
+ return date($date_format, $this->data['date']['parsed']);
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_local_date($date_format = '%c')
+ {
+ if (!$date_format)
+ {
+ return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (($date = $this->get_date('U')) !== null)
+ {
+ return strftime($date_format, $date);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_permalink()
+ {
+ $link = $this->get_link();
+ $enclosure = $this->get_enclosure(0);
+ if ($link !== null)
+ {
+ return $link;
+ }
+ elseif ($enclosure !== null)
+ {
+ return $enclosure->get_link();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_link($key = 0, $rel = 'alternate')
+ {
+ $links = $this->get_links($rel);
+ if ($links[$key] !== null)
+ {
+ return $links[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_links($rel = 'alternate')
+ {
+ if (!isset($this->data['links']))
+ {
+ $this->data['links'] = array();
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+
+ }
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ }
+ }
+ if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_item_tags('', 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_item_tags('', 'guid'))
+ {
+ if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) == 'true')
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ }
+
+ $keys = array_keys($this->data['links']);
+ foreach ($keys as $key)
+ {
+ if (SimplePie_Misc::is_isegment_nz_nc($key))
+ {
+ if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
+ $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
+ }
+ else
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
+ }
+ }
+ elseif (substr($key, 0, 41) == SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
+ {
+ $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
+ }
+ $this->data['links'][$key] = array_unique($this->data['links'][$key]);
+ }
+ }
+ if (isset($this->data['links'][$rel]))
+ {
+ return $this->data['links'][$rel];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * @todo Add ability to prefer one type of content over another (in a media group).
+ */
+ function get_enclosure($key = 0, $prefer = null)
+ {
+ $enclosures = $this->get_enclosures();
+ if (isset($enclosures[$key]))
+ {
+ return $enclosures[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Grabs all available enclosures (podcasts, etc.)
+ *
+ * Supports the RSS tag, as well as Media RSS and iTunes RSS.
+ *
+ * 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.
+ *
+ * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4).
+ * @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).
+ */
+ function get_enclosures()
+ {
+ if (!isset($this->data['enclosures']))
+ {
+ $this->data['enclosures'] = array();
+
+ // Elements
+ $captions_parent = null;
+ $categories_parent = null;
+ $copyrights_parent = null;
+ $credits_parent = null;
+ $description_parent = null;
+ $duration_parent = null;
+ $hashes_parent = null;
+ $keywords_parent = null;
+ $player_parent = null;
+ $ratings_parent = null;
+ $restrictions_parent = null;
+ $thumbnails_parent = null;
+ $title_parent = null;
+
+ // Let's do the channel and item-level ones first, and just re-use them if we need to.
+ $parent = $this->get_feed();
+
+ // CAPTIONS
+ if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
+ {
+ foreach ($captions as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions_parent[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
+ }
+ }
+ elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
+ {
+ foreach ($captions as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions_parent[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
+ }
+ }
+ if (is_array($captions_parent))
+ {
+ $captions_parent = array_values(SimplePie_Misc::array_unique($captions_parent));
+ }
+
+ // CATEGORIES
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category)
+ {
+ $term = null;
+ $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
+ $label = null;
+ if (isset($category['attribs']['']['text']))
+ {
+ $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
+
+ if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category']))
+ {
+ foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory)
+ {
+ if (isset($subcategory['attribs']['']['text']))
+ {
+ $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ }
+ }
+ if (is_array($categories_parent))
+ {
+ $categories_parent = array_values(SimplePie_Misc::array_unique($categories_parent));
+ }
+
+ // COPYRIGHT
+ if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($copyright[0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($copyright[0]['data']))
+ {
+ $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights_parent =& new $this->feed->copyright_class($copyright_url, $copyright_label);
+ }
+ elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($copyright[0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($copyright[0]['data']))
+ {
+ $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights_parent =& new $this->feed->copyright_class($copyright_url, $copyright_label);
+ }
+
+ // CREDITS
+ if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
+ {
+ foreach ($credits as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits_parent[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
+ }
+ }
+ elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
+ {
+ foreach ($credits as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits_parent[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
+ }
+ }
+ if (is_array($credits_parent))
+ {
+ $credits_parent = array_values(SimplePie_Misc::array_unique($credits_parent));
+ }
+
+ // DESCRIPTION
+ if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
+ {
+ if (isset($description_parent[0]['data']))
+ {
+ $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+ elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
+ {
+ if (isset($description_parent[0]['data']))
+ {
+ $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+
+ // DURATION
+ if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration'))
+ {
+ $seconds = null;
+ $minutes = null;
+ $hours = null;
+ if (isset($duration_parent[0]['data']))
+ {
+ $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ if (sizeof($temp) > 0)
+ {
+ (int) $seconds = array_pop($temp);
+ }
+ if (sizeof($temp) > 0)
+ {
+ (int) $minutes = array_pop($temp);
+ $seconds += $minutes * 60;
+ }
+ if (sizeof($temp) > 0)
+ {
+ (int) $hours = array_pop($temp);
+ $seconds += $hours * 3600;
+ }
+ unset($temp);
+ $duration_parent = $seconds;
+ }
+ }
+
+ // HASHES
+ if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
+ {
+ foreach ($hashes_iterator as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes_parent[] = $algo.':'.$value;
+ }
+ }
+ elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
+ {
+ foreach ($hashes_iterator as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes_parent[] = $algo.':'.$value;
+ }
+ }
+ if (is_array($hashes_parent))
+ {
+ $hashes_parent = array_values(SimplePie_Misc::array_unique($hashes_parent));
+ }
+
+ // KEYWORDS
+ if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
+ {
+ if (isset($keywords[0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords_parent[] = trim($word);
+ }
+ }
+ unset($temp);
+ }
+ elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
+ {
+ if (isset($keywords[0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords_parent[] = trim($word);
+ }
+ }
+ unset($temp);
+ }
+ elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
+ {
+ if (isset($keywords[0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords_parent[] = trim($word);
+ }
+ }
+ unset($temp);
+ }
+ elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
+ {
+ if (isset($keywords[0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords_parent[] = trim($word);
+ }
+ }
+ unset($temp);
+ }
+ if (is_array($keywords_parent))
+ {
+ $keywords_parent = array_values(SimplePie_Misc::array_unique($keywords_parent));
+ }
+
+ // PLAYER
+ if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
+ {
+ if (isset($player_parent[0]['attribs']['']['url']))
+ {
+ $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
+ {
+ if (isset($player_parent[0]['attribs']['']['url']))
+ {
+ $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+
+ // RATINGS
+ if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
+ {
+ foreach ($ratings as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ }
+ elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
+ {
+ foreach ($ratings as $rating)
+ {
+ $rating_scheme = 'urn:itunes';
+ $rating_value = null;
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ }
+ elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
+ {
+ foreach ($ratings as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ }
+ elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
+ {
+ foreach ($ratings as $rating)
+ {
+ $rating_scheme = 'urn:itunes';
+ $rating_value = null;
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ }
+ if (is_array($ratings_parent))
+ {
+ $ratings_parent = array_values(SimplePie_Misc::array_unique($ratings_parent));
+ }
+
+ // RESTRICTIONS
+ if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
+ {
+ foreach ($restrictions as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ }
+ elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
+ {
+ foreach ($restrictions as $restriction)
+ {
+ $restriction_relationship = 'allow';
+ $restriction_type = null;
+ $restriction_value = 'itunes';
+ if (isset($restriction['data']) && strtolower($restriction['data']) == 'yes')
+ {
+ $restriction_relationship = 'deny';
+ }
+ $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ }
+ elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
+ {
+ foreach ($restrictions as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ }
+ elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
+ {
+ foreach ($restrictions as $restriction)
+ {
+ $restriction_relationship = 'allow';
+ $restriction_type = null;
+ $restriction_value = 'itunes';
+ if (isset($restriction['data']) && strtolower($restriction['data']) == 'yes')
+ {
+ $restriction_relationship = 'deny';
+ }
+ $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ }
+ if (is_array($restrictions_parent))
+ {
+ $restrictions_parent = array_values(SimplePie_Misc::array_unique($restrictions_parent));
+ }
+
+ // THUMBNAILS
+ if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
+ {
+ foreach ($thumbnails as $thumbnail)
+ {
+ if (isset($thumbnail['attribs']['']['url']))
+ {
+ $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ }
+ elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
+ {
+ foreach ($thumbnails as $thumbnail)
+ {
+ if (isset($thumbnail['attribs']['']['url']))
+ {
+ $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ }
+
+ // TITLES
+ if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
+ {
+ if (isset($title_parent[0]['data']))
+ {
+ $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+ elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
+ {
+ if (isset($title_parent[0]['data']))
+ {
+ $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+
+ // Clear the memory
+ unset($parent);
+
+ // If we have media:group tags, loop through them.
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
+ {
+ // If we have media:content tags, loop through them.
+ foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
+ {
+ if (isset($content['attribs']['']['url']))
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ // Elements
+ $captions = null;
+ $categories = null;
+ $copyrights = null;
+ $credits = null;
+ $description = null;
+ $hashes = null;
+ $keywords = null;
+ $player = null;
+ $ratings = null;
+ $restrictions = null;
+ $thumbnails = null;
+ $title = null;
+
+ // Start checking the attributes of media:content
+ if (isset($content['attribs']['']['bitrate']))
+ {
+ $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['channels']))
+ {
+ $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['duration']))
+ {
+ $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $duration = $duration_parent;
+ }
+ if (isset($content['attribs']['']['expression']))
+ {
+ $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['framerate']))
+ {
+ $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['height']))
+ {
+ $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['lang']))
+ {
+ $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['fileSize']))
+ {
+ $length = ceil($content['attribs']['']['fileSize']);
+ }
+ if (isset($content['attribs']['']['medium']))
+ {
+ $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['samplingrate']))
+ {
+ $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['type']))
+ {
+ $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['width']))
+ {
+ $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+
+ // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
+
+ // CAPTIONS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
+ }
+ if (is_array($captions))
+ {
+ $captions = array_values(SimplePie_Misc::array_unique($captions));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
+ }
+ if (is_array($captions))
+ {
+ $captions = array_values(SimplePie_Misc::array_unique($captions));
+ }
+ }
+ else
+ {
+ $captions = $captions_parent;
+ }
+
+ // CATEGORIES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
+ {
+ foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ }
+ if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
+ {
+ foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ }
+ if (is_array($categories) && is_array($categories_parent))
+ {
+ $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent)));
+ }
+ elseif (is_array($categories))
+ {
+ $categories = array_values(SimplePie_Misc::array_unique($categories));
+ }
+ elseif (is_array($categories_parent))
+ {
+ $categories = array_values(SimplePie_Misc::array_unique($categories_parent));
+ }
+
+ // COPYRIGHTS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
+ {
+ $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label);
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
+ {
+ $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label);
+ }
+ else
+ {
+ $copyrights = $copyrights_parent;
+ }
+
+ // CREDITS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
+ }
+ if (is_array($credits))
+ {
+ $credits = array_values(SimplePie_Misc::array_unique($credits));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
+ }
+ if (is_array($credits))
+ {
+ $credits = array_values(SimplePie_Misc::array_unique($credits));
+ }
+ }
+ else
+ {
+ $credits = $credits_parent;
+ }
+
+ // DESCRIPTION
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
+ {
+ $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
+ {
+ $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $description = $description_parent;
+ }
+
+ // HASHES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes[] = $algo.':'.$value;
+ }
+ if (is_array($hashes))
+ {
+ $hashes = array_values(SimplePie_Misc::array_unique($hashes));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes[] = $algo.':'.$value;
+ }
+ if (is_array($hashes))
+ {
+ $hashes = array_values(SimplePie_Misc::array_unique($hashes));
+ }
+ }
+ else
+ {
+ $hashes = $hashes_parent;
+ }
+
+ // KEYWORDS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
+ {
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords[] = trim($word);
+ }
+ unset($temp);
+ }
+ if (is_array($keywords))
+ {
+ $keywords = array_values(SimplePie_Misc::array_unique($keywords));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
+ {
+ if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords[] = trim($word);
+ }
+ unset($temp);
+ }
+ if (is_array($keywords))
+ {
+ $keywords = array_values(SimplePie_Misc::array_unique($keywords));
+ }
+ }
+ else
+ {
+ $keywords = $keywords_parent;
+ }
+
+ // PLAYER
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
+ {
+ $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
+ {
+ $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ $player = $player_parent;
+ }
+
+ // RATINGS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ if (is_array($ratings))
+ {
+ $ratings = array_values(SimplePie_Misc::array_unique($ratings));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ if (is_array($ratings))
+ {
+ $ratings = array_values(SimplePie_Misc::array_unique($ratings));
+ }
+ }
+ else
+ {
+ $ratings = $ratings_parent;
+ }
+
+ // RESTRICTIONS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ if (is_array($restrictions))
+ {
+ $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ if (is_array($restrictions))
+ {
+ $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
+ }
+ }
+ else
+ {
+ $restrictions = $restrictions_parent;
+ }
+
+ // THUMBNAILS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
+ {
+ $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ if (is_array($thumbnails))
+ {
+ $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
+ {
+ $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ if (is_array($thumbnails))
+ {
+ $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
+ }
+ }
+ else
+ {
+ $thumbnails = $thumbnails_parent;
+ }
+
+ // TITLES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
+ {
+ $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
+ {
+ $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $title = $title_parent;
+ }
+
+ $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);
+ }
+ }
+ }
+
+ // If we have standalone media:content tags, loop through them.
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
+ {
+ foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
+ {
+ if (isset($content['attribs']['']['url']))
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ // Elements
+ $captions = null;
+ $categories = null;
+ $copyrights = null;
+ $credits = null;
+ $description = null;
+ $hashes = null;
+ $keywords = null;
+ $player = null;
+ $ratings = null;
+ $restrictions = null;
+ $thumbnails = null;
+ $title = null;
+
+ // Start checking the attributes of media:content
+ if (isset($content['attribs']['']['bitrate']))
+ {
+ $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['channels']))
+ {
+ $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['duration']))
+ {
+ $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $duration = $duration_parent;
+ }
+ if (isset($content['attribs']['']['expression']))
+ {
+ $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['framerate']))
+ {
+ $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['height']))
+ {
+ $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['lang']))
+ {
+ $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['fileSize']))
+ {
+ $length = ceil($content['attribs']['']['fileSize']);
+ }
+ if (isset($content['attribs']['']['medium']))
+ {
+ $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['samplingrate']))
+ {
+ $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['type']))
+ {
+ $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['width']))
+ {
+ $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+
+ // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
+
+ // CAPTIONS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
+ }
+ if (is_array($captions))
+ {
+ $captions = array_values(SimplePie_Misc::array_unique($captions));
+ }
+ }
+ else
+ {
+ $captions = $captions_parent;
+ }
+
+ // CATEGORIES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
+ {
+ foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ }
+ if (is_array($categories) && is_array($categories_parent))
+ {
+ $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent)));
+ }
+ elseif (is_array($categories))
+ {
+ $categories = array_values(SimplePie_Misc::array_unique($categories));
+ }
+ elseif (is_array($categories_parent))
+ {
+ $categories = array_values(SimplePie_Misc::array_unique($categories_parent));
+ }
+ else
+ {
+ $categories = null;
+ }
+
+ // COPYRIGHTS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
+ {
+ $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label);
+ }
+ else
+ {
+ $copyrights = $copyrights_parent;
+ }
+
+ // CREDITS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
+ }
+ if (is_array($credits))
+ {
+ $credits = array_values(SimplePie_Misc::array_unique($credits));
+ }
+ }
+ else
+ {
+ $credits = $credits_parent;
+ }
+
+ // DESCRIPTION
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
+ {
+ $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $description = $description_parent;
+ }
+
+ // HASHES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes[] = $algo.':'.$value;
+ }
+ if (is_array($hashes))
+ {
+ $hashes = array_values(SimplePie_Misc::array_unique($hashes));
+ }
+ }
+ else
+ {
+ $hashes = $hashes_parent;
+ }
+
+ // KEYWORDS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
+ {
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords[] = trim($word);
+ }
+ unset($temp);
+ }
+ if (is_array($keywords))
+ {
+ $keywords = array_values(SimplePie_Misc::array_unique($keywords));
+ }
+ }
+ else
+ {
+ $keywords = $keywords_parent;
+ }
+
+ // PLAYER
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
+ {
+ $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ $player = $player_parent;
+ }
+
+ // RATINGS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ if (is_array($ratings))
+ {
+ $ratings = array_values(SimplePie_Misc::array_unique($ratings));
+ }
+ }
+ else
+ {
+ $ratings = $ratings_parent;
+ }
+
+ // RESTRICTIONS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ if (is_array($restrictions))
+ {
+ $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
+ }
+ }
+ else
+ {
+ $restrictions = $restrictions_parent;
+ }
+
+ // THUMBNAILS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
+ {
+ $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ if (is_array($thumbnails))
+ {
+ $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
+ }
+ }
+ else
+ {
+ $thumbnails = $thumbnails_parent;
+ }
+
+ // TITLES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
+ {
+ $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $title = $title_parent;
+ }
+
+ $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);
+ }
+ }
+ }
+
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
+ {
+ if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] == 'enclosure')
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ if (isset($link['attribs']['']['type']))
+ {
+ $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($link['attribs']['']['length']))
+ {
+ $length = ceil($link['attribs']['']['length']);
+ }
+
+ // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
+ $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);
+ }
+ }
+
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
+ {
+ if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] == 'enclosure')
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ if (isset($link['attribs']['']['type']))
+ {
+ $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($link['attribs']['']['length']))
+ {
+ $length = ceil($link['attribs']['']['length']);
+ }
+
+ // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
+ $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);
+ }
+ }
+
+ if ($enclosure = $this->get_item_tags('', 'enclosure'))
+ {
+ if (isset($enclosure[0]['attribs']['']['url']))
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));
+ if (isset($enclosure[0]['attribs']['']['type']))
+ {
+ $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($enclosure[0]['attribs']['']['length']))
+ {
+ $length = ceil($enclosure[0]['attribs']['']['length']);
+ }
+
+ // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
+ $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);
+ }
+ }
+
+ if (sizeof($this->data['enclosures']) == 0)
+ {
+ // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
+ $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);
+ }
+
+ $this->data['enclosures'] = array_values(SimplePie_Misc::array_unique($this->data['enclosures']));
+ }
+ if (!empty($this->data['enclosures']))
+ {
+ return $this->data['enclosures'];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_latitude()
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+ {
+ return (float) $match[1];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_longitude()
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+ {
+ return (float) $match[2];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_source()
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source'))
+ {
+ return new $this->feed->source_class($this, $return[0]);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Creates the add_to_* methods' return data
+ *
+ * @access private
+ * @param string $item_url String to prefix to the item permalink
+ * @param string $title_url String to prefix to the item title
+ * (and suffix to the item permalink)
+ * @return mixed URL if feed exists, false otherwise
+ */
+ function add_to_service($item_url, $title_url = null)
+ {
+ if ($this->get_permalink() !== null)
+ {
+ $return = $this->sanitize($item_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->get_permalink());
+ if ($title_url !== null && $this->get_title() !== null)
+ {
+ $return .= $this->sanitize($title_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->get_title());
+ }
+ return $return;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function add_to_blinklist()
+ {
+ return $this->add_to_service('http://www.blinklist.com/index.php?Action=Blink/addblink.php&Description=&Url=', '&Title=');
+ }
+
+ function add_to_blogmarks()
+ {
+ return $this->add_to_service('http://blogmarks.net/my/new.php?mini=1&simple=1&url=', '&title=');
+ }
+
+ function add_to_delicious()
+ {
+ return $this->add_to_service('http://del.icio.us/post/?v=4&url=', '&title=');
+ }
+
+ function add_to_digg()
+ {
+ return $this->add_to_service('http://digg.com/submit?phase=2&URL=');
+ }
+
+ function add_to_furl()
+ {
+ return $this->add_to_service('http://www.furl.net/storeIt.jsp?u=', '&t=');
+ }
+
+ function add_to_magnolia()
+ {
+ return $this->add_to_service('http://ma.gnolia.com/bookmarklet/add?url=', '&title=');
+ }
+
+ function add_to_myweb20()
+ {
+ return $this->add_to_service('http://myweb2.search.yahoo.com/myresults/bookmarklet?u=', '&t=');
+ }
+
+ function add_to_newsvine()
+ {
+ return $this->add_to_service('http://www.newsvine.com/_wine/save?u=', '&h=');
+ }
+
+ function add_to_reddit()
+ {
+ return $this->add_to_service('http://reddit.com/submit?url=', '&title=');
+ }
+
+ function add_to_segnalo()
+ {
+ return $this->add_to_service('http://segnalo.com/post.html.php?url=', '&title=');
+ }
+
+ function add_to_simpy()
+ {
+ return $this->add_to_service('http://www.simpy.com/simpy/LinkAdd.do?href=', '&title=');
+ }
+
+ function add_to_spurl()
+ {
+ return $this->add_to_service('http://www.spurl.net/spurl.php?v=3&url=', '&title=');
+ }
+
+ function add_to_wists()
+ {
+ return $this->add_to_service('http://wists.com/r.php?c=&r=', '&title=');
+ }
+
+ function search_technorati()
+ {
+ return $this->add_to_service('http://www.technorati.com/search/');
+ }
+}
+
+class SimplePie_Source
+{
+ var $item;
+ var $data = array();
+
+ function SimplePie_Source($item, $data)
+ {
+ $this->item = $item;
+ $this->data = $data;
+ }
+
+ function __toString()
+ {
+ return md5(serialize($this->data));
+ }
+
+ /**
+ * Remove items that link back to this before destroying this object
+ */
+ function __destruct()
+ {
+ unset($this->item);
+ }
+
+ function get_source_tags($namespace, $tag)
+ {
+ if (isset($this->data['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][$namespace][$tag];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_base($element = array())
+ {
+ return $this->item->get_base($element);
+ }
+
+ function sanitize($data, $type, $base = '')
+ {
+ return $this->item->sanitize($data, $type, $base);
+ }
+
+ function get_item()
+ {
+ return $this->item;
+ }
+
+ function get_title()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags('', 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (isset($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_categories()
+ {
+ $categories = array();
+
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['attribs']['']['term']))
+ {
+ $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] =& new $this->item->feed->category_class($term, $scheme, $label);
+ }
+ foreach ((array) $this->get_source_tags('', 'category') as $category)
+ {
+ $categories[] =& new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
+ {
+ $categories[] =& new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
+ {
+ $categories[] =& new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+
+ if (!empty($categories))
+ {
+ return SimplePie_Misc::array_unique($categories);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_author($key = 0)
+ {
+ $authors = $this->get_authors();
+ if (isset($authors[$key]))
+ {
+ return $authors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_authors()
+ {
+ $authors = array();
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $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]));
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $authors[] =& new $this->item->feed->author_class($name, $uri, $email);
+ }
+ }
+ if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $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]));
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $authors[] =& new $this->item->feed->author_class($name, $url, $email);
+ }
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
+ {
+ $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
+ {
+ $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
+ {
+ $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+
+ if (!empty($authors))
+ {
+ return SimplePie_Misc::array_unique($authors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_contributor($key = 0)
+ {
+ $contributors = $this->get_contributors();
+ if (isset($contributors[$key]))
+ {
+ return $contributors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_contributors()
+ {
+ $contributors = array();
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $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]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $contributors[] =& new $this->item->feed->author_class($name, $uri, $email);
+ }
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $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]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $contributors[] =& new $this->item->feed->author_class($name, $url, $email);
+ }
+ }
+
+ if (!empty($contributors))
+ {
+ return SimplePie_Misc::array_unique($contributors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_link($key = 0, $rel = 'alternate')
+ {
+ $links = $this->get_links($rel);
+ if (isset($links[$key]))
+ {
+ return $links[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Added for parity between the parent-level and the item/entry-level.
+ */
+ function get_permalink()
+ {
+ return $this->get_link(0);
+ }
+
+ function get_links($rel = 'alternate')
+ {
+ if (!isset($this->data['links']))
+ {
+ $this->data['links'] = array();
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
+ {
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ }
+ }
+ }
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
+ {
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+
+ }
+ }
+ }
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_source_tags('', 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+
+ $keys = array_keys($this->data['links']);
+ foreach ($keys as $key)
+ {
+ if (SimplePie_Misc::is_isegment_nz_nc($key))
+ {
+ if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
+ $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
+ }
+ else
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
+ }
+ }
+ elseif (substr($key, 0, 41) == SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
+ {
+ $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
+ }
+ $this->data['links'][$key] = array_unique($this->data['links'][$key]);
+ }
+ }
+
+ if (isset($this->data['links'][$rel]))
+ {
+ return $this->data['links'][$rel];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_description()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags('', 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_copyright()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags('', 'copyright'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_language()
+ {
+ if ($return = $this->get_source_tags('', 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['xml_lang']))
+ {
+ return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_latitude()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+ {
+ return (float) $match[1];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_longitude()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+ {
+ return (float) $match[2];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_image_url()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
+ {
+ return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Author
+{
+ var $name;
+ var $link;
+ var $email;
+
+ // Constructor, used to input the data
+ function SimplePie_Author($name = null, $link = null, $email = null)
+ {
+ $this->name = $name;
+ $this->link = $link;
+ $this->email = $email;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_name()
+ {
+ if ($this->name !== null)
+ {
+ return $this->name;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_link()
+ {
+ if ($this->link !== null)
+ {
+ return $this->link;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_email()
+ {
+ if ($this->email !== null)
+ {
+ return $this->email;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Category
+{
+ var $term;
+ var $scheme;
+ var $label;
+
+ // Constructor, used to input the data
+ function SimplePie_Category($term = null, $scheme = null, $label = null)
+ {
+ $this->term = $term;
+ $this->scheme = $scheme;
+ $this->label = $label;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_term()
+ {
+ if ($this->term !== null)
+ {
+ return $this->term;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_scheme()
+ {
+ if ($this->scheme !== null)
+ {
+ return $this->scheme;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_label()
+ {
+ if ($this->label !== null)
+ {
+ return $this->label;
+ }
+ else
+ {
+ return $this->get_term();
+ }
+ }
+}
+
+class SimplePie_Enclosure
+{
+ var $bitrate;
+ var $captions;
+ var $categories;
+ var $channels;
+ var $copyright;
+ var $credits;
+ var $description;
+ var $duration;
+ var $expression;
+ var $framerate;
+ var $handler;
+ var $hashes;
+ var $height;
+ var $javascript;
+ var $keywords;
+ var $lang;
+ var $length;
+ var $link;
+ var $medium;
+ var $player;
+ var $ratings;
+ var $restrictions;
+ var $samplingrate;
+ var $thumbnails;
+ var $title;
+ var $type;
+ var $width;
+
+ // Constructor, used to input the data
+ 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)
+ {
+ $this->bitrate = $bitrate;
+ $this->captions = $captions;
+ $this->categories = $categories;
+ $this->channels = $channels;
+ $this->copyright = $copyright;
+ $this->credits = $credits;
+ $this->description = $description;
+ $this->duration = $duration;
+ $this->expression = $expression;
+ $this->framerate = $framerate;
+ $this->hashes = $hashes;
+ $this->height = $height;
+ $this->javascript = $javascript;
+ $this->keywords = $keywords;
+ $this->lang = $lang;
+ $this->length = $length;
+ $this->link = $link;
+ $this->medium = $medium;
+ $this->player = $player;
+ $this->ratings = $ratings;
+ $this->restrictions = $restrictions;
+ $this->samplingrate = $samplingrate;
+ $this->thumbnails = $thumbnails;
+ $this->title = $title;
+ $this->type = $type;
+ $this->width = $width;
+ if (class_exists('idna_convert'))
+ {
+ $idn =& new idna_convert;
+ $parsed = SimplePie_Misc::parse_url($link);
+ $this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
+ }
+ $this->handler = $this->get_handler(); // Needs to load last
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_bitrate()
+ {
+ if ($this->bitrate !== null)
+ {
+ return $this->bitrate;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_caption($key = 0)
+ {
+ $captions = $this->get_captions();
+ if (isset($captions[$key]))
+ {
+ return $captions[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_captions()
+ {
+ if ($this->captions !== null)
+ {
+ return $this->captions;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (isset($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_categories()
+ {
+ if ($this->categories !== null)
+ {
+ return $this->categories;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_channels()
+ {
+ if ($this->channels !== null)
+ {
+ return $this->channels;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_copyright()
+ {
+ if ($this->copyright !== null)
+ {
+ return $this->copyright;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_credit($key = 0)
+ {
+ $credits = $this->get_credits();
+ if (isset($credits[$key]))
+ {
+ return $credits[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_credits()
+ {
+ if ($this->credits !== null)
+ {
+ return $this->credits;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_description()
+ {
+ if ($this->description !== null)
+ {
+ return $this->description;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_duration($convert = false)
+ {
+ if ($this->duration !== null)
+ {
+ if ($convert)
+ {
+ $time = SimplePie_Misc::time_hms($this->duration);
+ return $time;
+ }
+ else
+ {
+ return $this->duration;
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_expression()
+ {
+ if ($this->expression !== null)
+ {
+ return $this->expression;
+ }
+ else
+ {
+ return 'full';
+ }
+ }
+
+ function get_extension()
+ {
+ if ($this->link !== null)
+ {
+ $url = SimplePie_Misc::parse_url($this->link);
+ if ($url['path'] !== '')
+ {
+ return pathinfo($url['path'], PATHINFO_EXTENSION);
+ }
+ }
+ return null;
+ }
+
+ function get_framerate()
+ {
+ if ($this->framerate !== null)
+ {
+ return $this->framerate;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_handler()
+ {
+ return $this->get_real_type(true);
+ }
+
+ function get_hash($key = 0)
+ {
+ $hashes = $this->get_hashes();
+ if (isset($hashes[$key]))
+ {
+ return $hashes[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_hashes()
+ {
+ if ($this->hashes !== null)
+ {
+ return $this->hashes;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_height()
+ {
+ if ($this->height !== null)
+ {
+ return $this->height;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_language()
+ {
+ if ($this->lang !== null)
+ {
+ return $this->lang;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_keyword($key = 0)
+ {
+ $keywords = $this->get_keywords();
+ if (isset($keywords[$key]))
+ {
+ return $keywords[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_keywords()
+ {
+ if ($this->keywords !== null)
+ {
+ return $this->keywords;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_length()
+ {
+ if ($this->length !== null)
+ {
+ return $this->length;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_link()
+ {
+ if ($this->link !== null)
+ {
+ return urldecode($this->link);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_medium()
+ {
+ if ($this->medium !== null)
+ {
+ return $this->medium;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_player()
+ {
+ if ($this->player !== null)
+ {
+ return $this->player;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_rating($key = 0)
+ {
+ $ratings = $this->get_ratings();
+ if (isset($ratings[$key]))
+ {
+ return $ratings[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_ratings()
+ {
+ if ($this->ratings !== null)
+ {
+ return $this->ratings;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_restriction($key = 0)
+ {
+ $restrictions = $this->get_restrictions();
+ if (isset($restrictions[$key]))
+ {
+ return $restrictions[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_restrictions()
+ {
+ if ($this->restrictions !== null)
+ {
+ return $this->restrictions;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_sampling_rate()
+ {
+ if ($this->samplingrate !== null)
+ {
+ return $this->samplingrate;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_size()
+ {
+ $length = $this->get_length();
+ if ($length !== null)
+ {
+ return round($length/1048576, 2);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_thumbnail($key = 0)
+ {
+ $thumbnails = $this->get_thumbnails();
+ if (isset($thumbnails[$key]))
+ {
+ return $thumbnails[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_thumbnails()
+ {
+ if ($this->thumbnails !== null)
+ {
+ return $this->thumbnails;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_title()
+ {
+ if ($this->title !== null)
+ {
+ return $this->title;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_type()
+ {
+ if ($this->type !== null)
+ {
+ return $this->type;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_width()
+ {
+ if ($this->width !== null)
+ {
+ return $this->width;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function native_embed($options='')
+ {
+ return $this->embed($options, true);
+ }
+
+ /**
+ * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'.
+ */
+ function embed($options = '', $native = false)
+ {
+ // Set up defaults
+ $audio = '';
+ $video = '';
+ $alt = '';
+ $altclass = '';
+ $loop = 'false';
+ $width = 'auto';
+ $height = 'auto';
+ $bgcolor = '#ffffff';
+ $mediaplayer = '';
+ $widescreen = false;
+ $handler = $this->get_handler();
+ $type = $this->get_real_type();
+
+ // Process options and reassign values as necessary
+ if (is_array($options))
+ {
+ extract($options);
+ }
+ else
+ {
+ $options = explode(',', $options);
+ foreach($options as $option)
+ {
+ $opt = explode(':', $option, 2);
+ if (isset($opt[0], $opt[1]))
+ {
+ $opt[0] = trim($opt[0]);
+ $opt[1] = trim($opt[1]);
+ switch ($opt[0])
+ {
+ case 'audio':
+ $audio = $opt[1];
+ break;
+
+ case 'video':
+ $video = $opt[1];
+ break;
+
+ case 'alt':
+ $alt = $opt[1];
+ break;
+
+ case 'altclass':
+ $altclass = $opt[1];
+ break;
+
+ case 'loop':
+ $loop = $opt[1];
+ break;
+
+ case 'width':
+ $width = $opt[1];
+ break;
+
+ case 'height':
+ $height = $opt[1];
+ break;
+
+ case 'bgcolor':
+ $bgcolor = $opt[1];
+ break;
+
+ case 'mediaplayer':
+ $mediaplayer = $opt[1];
+ break;
+
+ case 'widescreen':
+ $widescreen = $opt[1];
+ break;
+ }
+ }
+ }
+ }
+
+ $mime = explode('/', $type, 2);
+ $mime = $mime[0];
+
+ // Process values for 'auto'
+ if ($width == 'auto')
+ {
+ if ($mime == 'video')
+ {
+ if ($height == 'auto')
+ {
+ $width = 480;
+ }
+ elseif ($widescreen)
+ {
+ $width = round((intval($height)/9)*16);
+ }
+ else
+ {
+ $width = round((intval($height)/3)*4);
+ }
+ }
+ else
+ {
+ $width = '100%';
+ }
+ }
+
+ if ($height == 'auto')
+ {
+ if ($mime == 'audio')
+ {
+ $height = 0;
+ }
+ elseif ($mime == 'video')
+ {
+ if ($width == 'auto')
+ {
+ if ($widescreen)
+ {
+ $height = 270;
+ }
+ else
+ {
+ $height = 360;
+ }
+ }
+ elseif ($widescreen)
+ {
+ $height = round((intval($width)/16)*9);
+ }
+ else
+ {
+ $height = round((intval($width)/4)*3);
+ }
+ }
+ else
+ {
+ $height = 376;
+ }
+ }
+ elseif ($mime == 'audio')
+ {
+ $height = 0;
+ }
+
+ // Set proper placeholder value
+ if ($mime == 'audio')
+ {
+ $placeholder = $audio;
+ }
+ elseif ($mime == 'video')
+ {
+ $placeholder = $video;
+ }
+
+ $embed = '';
+
+ // Make sure the JS library is included
+ if (!$native)
+ {
+ static $javascript_outputted = null;
+ if (!$javascript_outputted && $this->javascript)
+ {
+ $embed .= '';
+ $javascript_outputted = true;
+ }
+ }
+
+ // Odeo Feed MP3's
+ if ($handler == 'odeo')
+ {
+ if ($native)
+ {
+ $embed .= '';
+ }
+ else
+ {
+ $embed .= '';
+ }
+ }
+
+ // Flash
+ elseif ($handler == 'flash')
+ {
+ if ($native)
+ {
+ $embed .= "";
+ }
+ else
+ {
+ $embed .= "";
+ }
+ }
+
+ // Flash Media Player file types.
+ // Preferred handler for MP3 file types.
+ elseif ($handler == 'fmedia' || ($handler == 'mp3' && $mediaplayer != ''))
+ {
+ $height += 20;
+ if ($native)
+ {
+ $embed .= "";
+ }
+ else
+ {
+ $embed .= "";
+ }
+ }
+
+ // QuickTime 7 file types. Need to test with QuickTime 6.
+ // Only handle MP3's if the Flash Media Player is not present.
+ elseif ($handler == 'quicktime' || ($handler == 'mp3' && $mediaplayer == ''))
+ {
+ $height += 16;
+ if ($native)
+ {
+ if ($placeholder != ""){
+ $embed .= "";
+ }
+ else {
+ $embed .= "";
+ }
+ }
+ else
+ {
+ $embed .= "";
+ }
+ }
+
+ // Windows Media
+ elseif ($handler == 'wmedia')
+ {
+ $height += 45;
+ if ($native)
+ {
+ $embed .= "";
+ }
+ else
+ {
+ $embed .= "";
+ }
+ }
+
+ // Everything else
+ else $embed .= '' . $alt . '';
+
+ return $embed;
+ }
+
+ function get_real_type($find_handler = false)
+ {
+ // If it's Odeo, let's get it out of the way.
+ if (substr(strtolower($this->get_link()), 0, 15) == 'http://odeo.com')
+ {
+ return 'odeo';
+ }
+
+ // Mime-types by handler.
+ $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash
+ $types_fmedia = array('video/flv', 'video/x-flv'); // Flash Media Player
+ $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
+ $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
+ $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3
+
+ if ($this->get_type() !== null)
+ {
+ $type = strtolower($this->type);
+ }
+ else
+ {
+ $type = null;
+ }
+
+ // If we encounter an unsupported mime-type, check the file extension and guess intelligently.
+ if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3)))
+ {
+ switch (strtolower($this->get_extension()))
+ {
+ // Audio mime-types
+ case 'aac':
+ case 'adts':
+ $type = 'audio/acc';
+ break;
+
+ case 'aif':
+ case 'aifc':
+ case 'aiff':
+ case 'cdda':
+ $type = 'audio/aiff';
+ break;
+
+ case 'bwf':
+ $type = 'audio/wav';
+ break;
+
+ case 'kar':
+ case 'mid':
+ case 'midi':
+ case 'smf':
+ $type = 'audio/midi';
+ break;
+
+ case 'm4a':
+ $type = 'audio/x-m4a';
+ break;
+
+ case 'mp3':
+ case 'swa':
+ $type = 'audio/mp3';
+ break;
+
+ case 'wav':
+ $type = 'audio/wav';
+ break;
+
+ case 'wax':
+ $type = 'audio/x-ms-wax';
+ break;
+
+ case 'wma':
+ $type = 'audio/x-ms-wma';
+ break;
+
+ // Video mime-types
+ case '3gp':
+ case '3gpp':
+ $type = 'video/3gpp';
+ break;
+
+ case '3g2':
+ case '3gp2':
+ $type = 'video/3gpp2';
+ break;
+
+ case 'asf':
+ $type = 'video/x-ms-asf';
+ break;
+
+ case 'flv':
+ $type = 'video/x-flv';
+ break;
+
+ case 'm1a':
+ case 'm1s':
+ case 'm1v':
+ case 'm15':
+ case 'm75':
+ case 'mp2':
+ case 'mpa':
+ case 'mpeg':
+ case 'mpg':
+ case 'mpm':
+ case 'mpv':
+ $type = 'video/mpeg';
+ break;
+
+ case 'm4v':
+ $type = 'video/x-m4v';
+ break;
+
+ case 'mov':
+ case 'qt':
+ $type = 'video/quicktime';
+ break;
+
+ case 'mp4':
+ case 'mpg4':
+ $type = 'video/mp4';
+ break;
+
+ case 'sdv':
+ $type = 'video/sd-video';
+ break;
+
+ case 'wm':
+ $type = 'video/x-ms-wm';
+ break;
+
+ case 'wmv':
+ $type = 'video/x-ms-wmv';
+ break;
+
+ case 'wvx':
+ $type = 'video/x-ms-wvx';
+ break;
+
+ // Flash mime-types
+ case 'spl':
+ $type = 'application/futuresplash';
+ break;
+
+ case 'swf':
+ $type = 'application/x-shockwave-flash';
+ break;
+ }
+ }
+
+ if ($find_handler)
+ {
+ if (in_array($type, $types_flash))
+ {
+ return 'flash';
+ }
+ elseif (in_array($type, $types_fmedia))
+ {
+ return 'fmedia';
+ }
+ elseif (in_array($type, $types_quicktime))
+ {
+ return 'quicktime';
+ }
+ elseif (in_array($type, $types_wmedia))
+ {
+ return 'wmedia';
+ }
+ elseif (in_array($type, $types_mp3))
+ {
+ return 'mp3';
+ }
+ else
+ {
+ return null;
+ }
+ }
+ else
+ {
+ return $type;
+ }
+ }
+}
+
+class SimplePie_Caption
+{
+ var $type;
+ var $lang;
+ var $startTime;
+ var $endTime;
+ var $text;
+
+ // Constructor, used to input the data
+ function SimplePie_Caption($type = null, $lang = null, $startTime = null, $endTime = null, $text = null)
+ {
+ $this->type = $type;
+ $this->lang = $lang;
+ $this->startTime = $startTime;
+ $this->endTime = $endTime;
+ $this->text = $text;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_endtime()
+ {
+ if ($this->endTime !== null)
+ {
+ return $this->endTime;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_language()
+ {
+ if ($this->lang !== null)
+ {
+ return $this->lang;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_starttime()
+ {
+ if ($this->startTime !== null)
+ {
+ return $this->startTime;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_text()
+ {
+ if ($this->text !== null)
+ {
+ return $this->text;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_type()
+ {
+ if ($this->type !== null)
+ {
+ return $this->type;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Credit
+{
+ var $role;
+ var $scheme;
+ var $name;
+
+ // Constructor, used to input the data
+ function SimplePie_Credit($role = null, $scheme = null, $name = null)
+ {
+ $this->role = $role;
+ $this->scheme = $scheme;
+ $this->name = $name;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_role()
+ {
+ if ($this->role !== null)
+ {
+ return $this->role;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_scheme()
+ {
+ if ($this->scheme !== null)
+ {
+ return $this->scheme;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_name()
+ {
+ if ($this->name !== null)
+ {
+ return $this->name;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Copyright
+{
+ var $url;
+ var $label;
+
+ // Constructor, used to input the data
+ function SimplePie_Copyright($url = null, $label = null)
+ {
+ $this->url = $url;
+ $this->label = $label;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_url()
+ {
+ if ($this->url !== null)
+ {
+ return $this->url;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_attribution()
+ {
+ if ($this->label !== null)
+ {
+ return $this->label;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Rating
+{
+ var $scheme;
+ var $value;
+
+ // Constructor, used to input the data
+ function SimplePie_Rating($scheme = null, $value = null)
+ {
+ $this->scheme = $scheme;
+ $this->value = $value;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_scheme()
+ {
+ if ($this->scheme !== null)
+ {
+ return $this->scheme;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_value()
+ {
+ if ($this->value !== null)
+ {
+ return $this->value;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Restriction
+{
+ var $relationship;
+ var $type;
+ var $value;
+
+ // Constructor, used to input the data
+ function SimplePie_Restriction($relationship = null, $type = null, $value = null)
+ {
+ $this->relationship = $relationship;
+ $this->type = $type;
+ $this->value = $value;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_relationship()
+ {
+ if ($this->relationship !== null)
+ {
+ return $this->relationship;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_type()
+ {
+ if ($this->type !== null)
+ {
+ return $this->type;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_value()
+ {
+ if ($this->value !== null)
+ {
+ return $this->value;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+/**
+ * @todo Move to properly supporting RFC2616 (HTTP/1.1)
+ */
+class SimplePie_File
+{
+ var $url;
+ var $useragent;
+ var $success = true;
+ var $headers = array();
+ var $body;
+ var $status_code;
+ var $redirects = 0;
+ var $error;
+ var $method = SIMPLEPIE_FILE_SOURCE_NONE;
+
+ function SimplePie_File($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
+ {
+ if (class_exists('idna_convert'))
+ {
+ $idn =& new idna_convert;
+ $parsed = SimplePie_Misc::parse_url($url);
+ $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
+ }
+ $this->url = $url;
+ $this->useragent = $useragent;
+ if (preg_match('/^http(s)?:\/\//i', $url))
+ {
+ if ($useragent === null)
+ {
+ $useragent = ini_get('user_agent');
+ $this->useragent = $useragent;
+ }
+ if (!is_array($headers))
+ {
+ $headers = array();
+ }
+ if (!$force_fsockopen && function_exists('curl_exec'))
+ {
+ $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL;
+ $fp = curl_init();
+ $headers2 = array();
+ foreach ($headers as $key => $value)
+ {
+ $headers2[] = "$key: $value";
+ }
+ if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>='))
+ {
+ curl_setopt($fp, CURLOPT_ENCODING, '');
+ }
+ curl_setopt($fp, CURLOPT_URL, $url);
+ curl_setopt($fp, CURLOPT_HEADER, 1);
+ curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
+ curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
+ curl_setopt($fp, CURLOPT_REFERER, $url);
+ curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
+ curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
+ if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>='))
+ {
+ curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
+ curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);
+ }
+
+ $this->headers = curl_exec($fp);
+ if (curl_errno($fp) == 23 || curl_errno($fp) == 61)
+ {
+ curl_setopt($fp, CURLOPT_ENCODING, 'none');
+ $this->headers = curl_exec($fp);
+ }
+ if (curl_errno($fp))
+ {
+ $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);
+ $this->success = false;
+ }
+ else
+ {
+ $info = curl_getinfo($fp);
+ curl_close($fp);
+ $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1);
+ $this->headers = array_pop($this->headers);
+ $parser =& new SimplePie_HTTP_Parser($this->headers);
+ if ($parser->parse())
+ {
+ $this->headers = $parser->headers;
+ $this->body = $parser->body;
+ $this->status_code = $parser->status_code;
+ if (($this->status_code == 300 || $this->status_code == 301 || $this->status_code == 302 || $this->status_code == 303 || $this->status_code == 307 || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
+ {
+ $this->redirects++;
+ $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
+ return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
+ }
+ }
+ }
+ }
+ else
+ {
+ $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
+ $url_parts = parse_url($url);
+ if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) == 'https')
+ {
+ $url_parts['host'] = "ssl://$url_parts[host]";
+ $url_parts['port'] = 443;
+ }
+ if (!isset($url_parts['port']))
+ {
+ $url_parts['port'] = 80;
+ }
+ $fp = @fsockopen($url_parts['host'], $url_parts['port'], $errno, $errstr, $timeout);
+ if (!$fp)
+ {
+ $this->error = 'fsockopen error: ' . $errstr;
+ $this->success = false;
+ }
+ else
+ {
+ stream_set_timeout($fp, $timeout);
+ if (isset($url_parts['path']))
+ {
+ if (isset($url_parts['query']))
+ {
+ $get = "$url_parts[path]?$url_parts[query]";
+ }
+ else
+ {
+ $get = $url_parts['path'];
+ }
+ }
+ else
+ {
+ $get = '/';
+ }
+ $out = "GET $get HTTP/1.0\r\n";
+ $out .= "Host: $url_parts[host]\r\n";
+ $out .= "User-Agent: $useragent\r\n";
+ if (function_exists('gzinflate'))
+ {
+ $out .= "Accept-Encoding: gzip,deflate\r\n";
+ }
+
+ if (isset($url_parts['user']) && isset($url_parts['pass']))
+ {
+ $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n";
+ }
+ foreach ($headers as $key => $value)
+ {
+ $out .= "$key: $value\r\n";
+ }
+ $out .= "Connection: Close\r\n\r\n";
+ fwrite($fp, $out);
+
+ $info = stream_get_meta_data($fp);
+
+ $this->headers = '';
+ while (!$info['eof'] && !$info['timed_out'])
+ {
+ $this->headers .= fread($fp, 1160);
+ $info = stream_get_meta_data($fp);
+ }
+ if (!$info['timed_out'])
+ {
+ $parser =& new SimplePie_HTTP_Parser($this->headers);
+ if ($parser->parse())
+ {
+ $this->headers = $parser->headers;
+ $this->body = $parser->body;
+ $this->status_code = $parser->status_code;
+ if (($this->status_code == 300 || $this->status_code == 301 || $this->status_code == 302 || $this->status_code == 303 || $this->status_code == 307 || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
+ {
+ $this->redirects++;
+ $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
+ return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
+ }
+ if (isset($this->headers['content-encoding']) && ($this->headers['content-encoding'] == 'gzip' || $this->headers['content-encoding'] == 'deflate'))
+ {
+ if (substr($this->body, 0, 8) == "\x1f\x8b\x08\x00\x00\x00\x00\x00")
+ {
+ $this->body = substr($this->body, 10);
+ }
+ $this->body = gzinflate($this->body);
+ }
+ }
+ }
+ else
+ {
+ $this->error = 'fsocket timed out';
+ $this->success = false;
+ }
+ fclose($fp);
+ }
+ }
+ }
+ else
+ {
+ $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS;
+ if (!$this->body = file_get_contents($url))
+ {
+ $this->error = 'file_get_contents could not read the file';
+ $this->success = false;
+ }
+ }
+ }
+}
+
+/**
+ * HTTP Response Parser
+ *
+ * @package SimplePie
+ */
+class SimplePie_HTTP_Parser
+{
+ /**
+ * HTTP Version
+ *
+ * @access public
+ * @var float
+ */
+ var $http_version = 0.0;
+
+ /**
+ * Status code
+ *
+ * @access public
+ * @var int
+ */
+ var $status_code = 0;
+
+ /**
+ * Reason phrase
+ *
+ * @access public
+ * @var string
+ */
+ var $reason = '';
+
+ /**
+ * Key/value pairs of the headers
+ *
+ * @access public
+ * @var array
+ */
+ var $headers = array();
+
+ /**
+ * Body of the response
+ *
+ * @access public
+ * @var string
+ */
+ var $body = '';
+
+ /**
+ * Current state of the state machine
+ *
+ * @access private
+ * @var string
+ */
+ var $state = 'http_version';
+
+ /**
+ * Input data
+ *
+ * @access private
+ * @var string
+ */
+ var $data = '';
+
+ /**
+ * Input data length (to avoid calling strlen() everytime this is needed)
+ *
+ * @access private
+ * @var int
+ */
+ var $data_length = 0;
+
+ /**
+ * Current position of the pointer
+ *
+ * @var int
+ * @access private
+ */
+ var $position = 0;
+
+ /**
+ * Name of the hedaer currently being parsed
+ *
+ * @access private
+ * @var string
+ */
+ var $name = '';
+
+ /**
+ * Value of the hedaer currently being parsed
+ *
+ * @access private
+ * @var string
+ */
+ var $value = '';
+
+ /**
+ * Create an instance of the class with the input data
+ *
+ * @access public
+ * @param string $data Input data
+ */
+ function SimplePie_HTTP_Parser($data)
+ {
+ $this->data = $data;
+ $this->data_length = strlen($this->data);
+ }
+
+ /**
+ * Parse the input data
+ *
+ * @access public
+ * @return bool true on success, false on failure
+ */
+ function parse()
+ {
+ while ($this->state && $this->state !== 'emit' && $this->has_data())
+ {
+ $state = $this->state;
+ $this->$state();
+ }
+ $this->data = '';
+ if ($this->state === 'emit')
+ {
+ return true;
+ }
+ else
+ {
+ $this->http_version = '';
+ $this->status_code = '';
+ $this->reason = '';
+ $this->headers = array();
+ $this->body = '';
+ return false;
+ }
+ }
+
+ /**
+ * Check whether there is data beyond the pointer
+ *
+ * @access private
+ * @return bool true if there is further data, false if not
+ */
+ function has_data()
+ {
+ return (bool) ($this->position < $this->data_length);
+ }
+
+ /**
+ * See if the next character is LWS
+ *
+ * @access private
+ * @return bool true if the next character is LWS, false if not
+ */
+ function is_linear_whitespace()
+ {
+ return (bool) ($this->data[$this->position] === "\x09"
+ || $this->data[$this->position] === "\x20"
+ || ($this->data[$this->position] === "\x0A"
+ && isset($this->data[$this->position + 1])
+ && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20")));
+ }
+
+ /**
+ * Parse the HTTP version
+ *
+ * @access private
+ */
+ function http_version()
+ {
+ if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/')
+ {
+ $len = strspn($this->data, '0123456789.', 5);
+ $this->http_version = substr($this->data, 5, $len);
+ $this->position += 5 + $len;
+ if (substr_count($this->http_version, '.') <= 1)
+ {
+ $this->http_version = (float) $this->http_version;
+ $this->position += strspn($this->data, "\x09\x20", $this->position);
+ $this->state = 'status';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ /**
+ * Parse the status code
+ *
+ * @access private
+ */
+ function status()
+ {
+ if ($len = strspn($this->data, '0123456789', $this->position))
+ {
+ $this->status_code = (int) substr($this->data, $this->position, $len);
+ $this->position += $len;
+ $this->state = 'reason';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ /**
+ * Parse the reason phrase
+ *
+ * @access private
+ */
+ function reason()
+ {
+ $len = strcspn($this->data, "\x0A", $this->position);
+ $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20");
+ $this->position += $len + 1;
+ $this->state = 'new_line';
+ }
+
+ /**
+ * Deal with a new line, shifting data around as needed
+ *
+ * @access private
+ */
+ function new_line()
+ {
+ $this->value = trim($this->value, "\x0D\x20");
+ if ($this->name !== '' && $this->value !== '')
+ {
+ $this->name = strtolower($this->name);
+ if (isset($this->headers[$this->name]))
+ {
+ $this->headers[$this->name] .= ', ' . $this->value;
+ }
+ else
+ {
+ $this->headers[$this->name] = $this->value;
+ }
+ }
+ $this->name = '';
+ $this->value = '';
+ if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A")
+ {
+ $this->position += 2;
+ $this->state = 'body';
+ }
+ elseif ($this->data[$this->position] === "\x0A")
+ {
+ $this->position++;
+ $this->state = 'body';
+ }
+ else
+ {
+ $this->state = 'name';
+ }
+ }
+
+ /**
+ * Parse a header name
+ *
+ * @access private
+ */
+ function name()
+ {
+ $len = strcspn($this->data, "\x0A:", $this->position);
+ if (isset($this->data[$this->position + $len]))
+ {
+ if ($this->data[$this->position + $len] === "\x0A")
+ {
+ $this->position += $len;
+ $this->state = 'new_line';
+ }
+ else
+ {
+ $this->name = substr($this->data, $this->position, $len);
+ $this->position += $len + 1;
+ $this->state = 'value';
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ /**
+ * Parse LWS, replacing consecutive LWS characters with a single space
+ *
+ * @access private
+ */
+ function linear_whitespace()
+ {
+ do
+ {
+ if (substr($this->data, $this->position, 2) === "\x0D\x0A")
+ {
+ $this->position += 2;
+ }
+ elseif ($this->data[$this->position] === "\x0A")
+ {
+ $this->position++;
+ }
+ $this->position += strspn($this->data, "\x09\x20", $this->position);
+ } while ($this->has_data() && $this->is_linear_whitespace());
+ $this->value .= "\x20";
+ }
+
+ /**
+ * See what state to move to while within non-quoted header values
+ *
+ * @access private
+ */
+ function value()
+ {
+ if ($this->is_linear_whitespace())
+ {
+ $this->linear_whitespace();
+ }
+ else
+ {
+ switch ($this->data[$this->position])
+ {
+ case '"':
+ $this->position++;
+ $this->state = 'quote';
+ break;
+
+ case "\x0A":
+ $this->position++;
+ $this->state = 'new_line';
+ break;
+
+ default:
+ $this->state = 'value_char';
+ break;
+ }
+ }
+ }
+
+ /**
+ * Parse a header value while outside quotes
+ *
+ * @access private
+ */
+ function value_char()
+ {
+ $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position);
+ $this->value .= substr($this->data, $this->position, $len);
+ $this->position += $len;
+ $this->state = 'value';
+ }
+
+ /**
+ * See what state to move to while within quoted header values
+ *
+ * @access private
+ */
+ function quote()
+ {
+ if ($this->is_linear_whitespace())
+ {
+ $this->linear_whitespace();
+ }
+ else
+ {
+ switch ($this->data[$this->position])
+ {
+ case '"':
+ $this->position++;
+ $this->state = 'value';
+ break;
+
+ case "\x0A":
+ $this->position++;
+ $this->state = 'new_line';
+ break;
+
+ case '\\':
+ $this->position++;
+ $this->state = 'quote_escaped';
+ break;
+
+ default:
+ $this->state = 'quote_char';
+ break;
+ }
+ }
+ }
+
+ /**
+ * Parse a header value while within quotes
+ *
+ * @access private
+ */
+ function quote_char()
+ {
+ $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position);
+ $this->value .= substr($this->data, $this->position, $len);
+ $this->position += $len;
+ $this->state = 'value';
+ }
+
+ /**
+ * Parse an escaped character within quotes
+ *
+ * @access private
+ */
+ function quote_escaped()
+ {
+ $this->value .= $this->data[$this->position];
+ $this->position++;
+ $this->state = 'quote';
+ }
+
+ /**
+ * Parse the body
+ *
+ * @access private
+ */
+ function body()
+ {
+ $this->body = substr($this->data, $this->position);
+ $this->state = 'emit';
+ }
+}
+
+class SimplePie_Cache
+{
+ /**
+ * Don't call the constructor. Please.
+ *
+ * @access private
+ */
+ function SimplePie_Cache()
+ {
+ trigger_error('Please call SimplePie_Cache::create() instead of the constructor', E_USER_ERROR);
+ }
+
+ /**
+ * Create a new SimplePie_Cache object
+ *
+ * @static
+ * @access public
+ */
+ function create($location, $filename, $extension)
+ {
+ return new SimplePie_Cache_File($location, $filename, $extension);
+ }
+}
+
+class SimplePie_Cache_File
+{
+ var $location;
+ var $filename;
+ var $extension;
+ var $name;
+
+ function SimplePie_Cache_File($location, $filename, $extension)
+ {
+ $this->location = $location;
+ $this->filename = rawurlencode($filename);
+ $this->extension = rawurlencode($extension);
+ $this->name = "$location/$this->filename.$this->extension";
+ }
+
+ function save($data)
+ {
+ if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location))
+ {
+ if (is_a($data, 'SimplePie'))
+ {
+ $data = $data->data;
+ }
+
+ $data = serialize($data);
+
+ if (function_exists('file_put_contents'))
+ {
+ return (bool) file_put_contents($this->name, $data);
+ }
+ else
+ {
+ $fp = fopen($this->name, 'wb');
+ if ($fp)
+ {
+ fwrite($fp, $data);
+ fclose($fp);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ function load()
+ {
+ if (file_exists($this->name) && is_readable($this->name))
+ {
+ return unserialize(file_get_contents($this->name));
+ }
+ return false;
+ }
+
+ function mtime()
+ {
+ if (file_exists($this->name))
+ {
+ return filemtime($this->name);
+ }
+ return false;
+ }
+
+ function touch()
+ {
+ if (file_exists($this->name))
+ {
+ return touch($this->name);
+ }
+ return false;
+ }
+
+ function unlink()
+ {
+ if (file_exists($this->name))
+ {
+ return unlink($this->name);
+ }
+ return false;
+ }
+}
+
+class SimplePie_Misc
+{
+ function time_hms($seconds)
+ {
+ $time = '';
+
+ $hours = floor($seconds / 3600);
+ $remainder = $seconds % 3600;
+ if ($hours > 0)
+ {
+ $time .= $hours.':';
+ }
+
+ $minutes = floor($remainder / 60);
+ $seconds = $remainder % 60;
+ if ($minutes < 10 && $hours > 0)
+ {
+ $minutes = '0' . $minutes;
+ }
+ if ($seconds < 10)
+ {
+ $seconds = '0' . $seconds;
+ }
+
+ $time .= $minutes.':';
+ $time .= $seconds;
+
+ return $time;
+ }
+
+ function absolutize_url($relative, $base)
+ {
+ if ($relative !== '')
+ {
+ $relative = SimplePie_Misc::parse_url($relative);
+ if ($relative['scheme'] !== '')
+ {
+ $target = $relative;
+ }
+ elseif ($base !== '')
+ {
+ $base = SimplePie_Misc::parse_url($base);
+ $target = SimplePie_Misc::parse_url('');
+ if ($relative['authority'] !== '')
+ {
+ $target = $relative;
+ $target['scheme'] = $base['scheme'];
+ }
+ else
+ {
+ $target['scheme'] = $base['scheme'];
+ $target['authority'] = $base['authority'];
+ if ($relative['path'] !== '')
+ {
+ if (strpos($relative['path'], '/') === 0)
+ {
+ $target['path'] = $relative['path'];
+ }
+ elseif ($base['authority'] !== '' && $base['path'] === '')
+ {
+ $target['path'] = '/' . $relative['path'];
+ }
+ elseif (($last_segment = strrpos($base['path'], '/')) !== false)
+ {
+ $target['path'] = substr($base['path'], 0, $last_segment + 1) . $relative['path'];
+ }
+ else
+ {
+ $target['path'] = $relative['path'];
+ }
+ $target['query'] = $relative['query'];
+ }
+ else
+ {
+ $target['path'] = $base['path'];
+ if ($relative['query'] !== '')
+ {
+ $target['query'] = $relative['query'];
+ }
+ elseif ($base['query'] !== '')
+ {
+ $target['query'] = $base['query'];
+ }
+ }
+ }
+ $target['fragment'] = $relative['fragment'];
+ }
+ else
+ {
+ // No base URL, just return the relative URL
+ $target = $relative;
+ }
+ $return = SimplePie_Misc::compress_parse_url($target['scheme'], $target['authority'], $target['path'], $target['query'], $target['fragment']);
+ }
+ else
+ {
+ $return = $base;
+ }
+ $return = SimplePie_Misc::normalize_url($return);
+ return $return;
+ }
+
+ function remove_dot_segments($input)
+ {
+ $output = '';
+ while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input == '.' || $input == '..')
+ {
+ // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise,
+ if (strpos($input, '../') === 0)
+ {
+ $input = substr($input, 3);
+ }
+ elseif (strpos($input, './') === 0)
+ {
+ $input = substr($input, 2);
+ }
+ // 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,
+ elseif (strpos($input, '/./') === 0)
+ {
+ $input = substr_replace($input, '/', 0, 3);
+ }
+ elseif ($input == '/.')
+ {
+ $input = '/';
+ }
+ // 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,
+ elseif (strpos($input, '/../') === 0)
+ {
+ $input = substr_replace($input, '/', 0, 4);
+ $output = substr_replace($output, '', strrpos($output, '/'));
+ }
+ elseif ($input == '/..')
+ {
+ $input = '/';
+ $output = substr_replace($output, '', strrpos($output, '/'));
+ }
+ // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise,
+ elseif ($input == '.' || $input == '..')
+ {
+ $input = '';
+ }
+ // 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
+ elseif (($pos = strpos($input, '/', 1)) !== false)
+ {
+ $output .= substr($input, 0, $pos);
+ $input = substr_replace($input, '', 0, $pos);
+ }
+ else
+ {
+ $output .= $input;
+ $input = '';
+ }
+ }
+ return $output . $input;
+ }
+
+ function get_element($realname, $string)
+ {
+ $return = array();
+ $name = preg_quote($realname, '/');
+ if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE))
+ {
+ for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++)
+ {
+ $return[$i]['tag'] = $realname;
+ $return[$i]['full'] = $matches[$i][0][0];
+ $return[$i]['offset'] = $matches[$i][0][1];
+ if (strlen($matches[$i][3][0]) <= 2)
+ {
+ $return[$i]['self_closing'] = true;
+ }
+ else
+ {
+ $return[$i]['self_closing'] = false;
+ $return[$i]['content'] = $matches[$i][4][0];
+ }
+ $return[$i]['attribs'] = array();
+ 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))
+ {
+ for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++)
+ {
+ if (count($attribs[$j]) == 2)
+ {
+ $attribs[$j][2] = $attribs[$j][1];
+ }
+ $return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j]), 'UTF-8');
+ }
+ }
+ }
+ }
+ return $return;
+ }
+
+ function element_implode($element)
+ {
+ $full = "<$element[tag]";
+ foreach ($element['attribs'] as $key => $value)
+ {
+ $key = strtolower($key);
+ $full .= " $key=\"" . htmlspecialchars($value['data']) . '"';
+ }
+ if ($element['self_closing'])
+ {
+ $full .= ' />';
+ }
+ else
+ {
+ $full .= ">$element[content]$element[tag]>";
+ }
+ return $full;
+ }
+
+ function error($message, $level, $file, $line)
+ {
+ switch ($level)
+ {
+ case E_USER_ERROR:
+ $note = 'PHP Error';
+ break;
+ case E_USER_WARNING:
+ $note = 'PHP Warning';
+ break;
+ case E_USER_NOTICE:
+ $note = 'PHP Notice';
+ break;
+ default:
+ $note = 'Unknown Error';
+ break;
+ }
+ error_log("$note: $message in $file on line $line", 0);
+ return $message;
+ }
+
+ /**
+ * If a file has been cached, retrieve and display it.
+ *
+ * This is most useful for caching images (get_favicon(), etc.),
+ * however it works for all cached files. This WILL NOT display ANY
+ * file/image/page/whatever, but rather only display what has already
+ * been cached by SimplePie.
+ *
+ * @access public
+ * @see SimplePie::get_favicon()
+ * @param str $identifier_url URL that is used to identify the content.
+ * This may or may not be the actual URL of the live content.
+ * @param str $cache_location Location of SimplePie's cache. Defaults
+ * to './cache'.
+ * @param str $cache_extension The file extension that the file was
+ * cached with. Defaults to 'spc'.
+ * @param str $cache_class Name of the cache-handling class being used
+ * in SimplePie. Defaults to 'SimplePie_Cache', and should be left
+ * as-is unless you've overloaded the class.
+ * @param str $cache_name_function Obsolete. Exists for backwards
+ * compatibility reasons only.
+ */
+ function display_cached_file($identifier_url, $cache_location = './cache', $cache_extension = 'spc', $cache_class = 'SimplePie_Cache', $cache_name_function = 'md5')
+ {
+ $cache = call_user_func(array($cache_class, 'create'), $cache_location, $identifier_url, $cache_extension);
+
+ if ($file = $cache->load())
+ {
+ if (isset($file['headers']['content-type']))
+ {
+ header('Content-type:' . $file['headers']['content-type']);
+ }
+ else
+ {
+ header('Content-type: application/octet-stream');
+ }
+ header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
+ echo $file['body'];
+ exit;
+ }
+
+ die('Cached file for ' . $identifier_url . ' cannot be found.');
+ }
+
+ function fix_protocol($url, $http = 1)
+ {
+ $url = SimplePie_Misc::normalize_url($url);
+ $parsed = SimplePie_Misc::parse_url($url);
+ if ($parsed['scheme'] !== '' && $parsed['scheme'] != 'http' && $parsed['scheme'] != 'https')
+ {
+ return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http);
+ }
+
+ if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url))
+ {
+ return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http);
+ }
+
+ if ($http == 2 && $parsed['scheme'] !== '')
+ {
+ return "feed:$url";
+ }
+ elseif ($http == 3 && strtolower($parsed['scheme']) == 'http')
+ {
+ return substr_replace($url, 'podcast', 0, 4);
+ }
+ elseif ($http == 4 && strtolower($parsed['scheme']) == 'http')
+ {
+ return substr_replace($url, 'itpc', 0, 4);
+ }
+ else
+ {
+ return $url;
+ }
+ }
+
+ function parse_url($url)
+ {
+ static $cache = array();
+ if (isset($cache[$url]))
+ {
+ return $cache[$url];
+ }
+ elseif (preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/', $url, $match))
+ {
+ for ($i = count($match); $i <= 9; $i++)
+ {
+ $match[$i] = '';
+ }
+ return $cache[$url] = array('scheme' => $match[2], 'authority' => $match[4], 'path' => $match[5], 'query' => $match[7], 'fragment' => $match[9]);
+ }
+ else
+ {
+ return $cache[$url] = array('scheme' => '', 'authority' => '', 'path' => '', 'query' => '', 'fragment' => '');
+ }
+ }
+
+ function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '')
+ {
+ $return = '';
+ if ($scheme !== '')
+ {
+ $return .= "$scheme:";
+ }
+ if ($authority !== '')
+ {
+ $return .= "//$authority";
+ }
+ if ($path !== '')
+ {
+ $return .= $path;
+ }
+ if ($query !== '')
+ {
+ $return .= "?$query";
+ }
+ if ($fragment !== '')
+ {
+ $return .= "#$fragment";
+ }
+ return $return;
+ }
+
+ function normalize_url($url)
+ {
+ $url = preg_replace_callback('/%([0-9A-Fa-f]{2})/', array('SimplePie_Misc', 'percent_encoding_normalization'), $url);
+ $url = SimplePie_Misc::parse_url($url);
+ $url['scheme'] = strtolower($url['scheme']);
+ if ($url['authority'] !== '')
+ {
+ $url['authority'] = strtolower($url['authority']);
+ $url['path'] = SimplePie_Misc::remove_dot_segments($url['path']);
+ }
+ return SimplePie_Misc::compress_parse_url($url['scheme'], $url['authority'], $url['path'], $url['query'], $url['fragment']);
+ }
+
+ function percent_encoding_normalization($match)
+ {
+ $integer = hexdec($match[1]);
+ if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer == 0x2D || $integer == 0x2E || $integer == 0x5F || $integer == 0x7E)
+ {
+ return chr($integer);
+ }
+ else
+ {
+ return strtoupper($match[0]);
+ }
+ }
+
+ /**
+ * Remove bad UTF-8 bytes
+ *
+ * PCRE Pattern to locate bad bytes in a UTF-8 string comes from W3C
+ * FAQ: Multilingual Forms (modified to include full ASCII range)
+ *
+ * @author Geoffrey Sneddon
+ * @see http://www.w3.org/International/questions/qa-forms-utf-8
+ * @param string $str String to remove bad UTF-8 bytes from
+ * @return string UTF-8 string
+ */
+ function utf8_bad_replace($str)
+ {
+ if (function_exists('iconv') && ($return = @iconv('UTF-8', 'UTF-8//IGNORE', $str)))
+ {
+ return $return;
+ }
+ elseif (function_exists('mb_convert_encoding') && ($return = @mb_convert_encoding($str, 'UTF-8', 'UTF-8')))
+ {
+ return $return;
+ }
+ 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))
+ {
+ return implode("\xEF\xBF\xBD", $matches[0]);
+ }
+ elseif ($str !== '')
+ {
+ return "\xEF\xBF\xBD";
+ }
+ else
+ {
+ return '';
+ }
+ }
+
+ /**
+ * Converts a Windows-1252 encoded string to a UTF-8 encoded string
+ *
+ * @static
+ * @access public
+ * @param string $string Windows-1252 encoded string
+ * @return string UTF-8 encoded string
+ */
+ function windows_1252_to_utf8($string)
+ {
+ 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");
+
+ return strtr($string, $convert_table);
+ }
+
+ function change_encoding($data, $input, $output)
+ {
+ $input = SimplePie_Misc::encoding($input);
+ $output = SimplePie_Misc::encoding($output);
+
+ // We fail to fail on non US-ASCII bytes
+ if ($input === 'US-ASCII')
+ {
+ static $non_ascii_octects = '';
+ if (!$non_ascii_octects)
+ {
+ for ($i = 0x80; $i <= 0xFF; $i++)
+ {
+ $non_ascii_octects .= chr($i);
+ }
+ }
+ $data = substr($data, 0, strcspn($data, $non_ascii_octects));
+ }
+
+ if (function_exists('iconv') && ($return = @iconv($input, $output, $data)))
+ {
+ return $return;
+ }
+ elseif (function_exists('mb_convert_encoding') && ($return = @mb_convert_encoding($data, $output, $input)))
+ {
+ return $return;
+ }
+ elseif ($input == 'windows-1252' && $output == 'UTF-8')
+ {
+ return SimplePie_Misc::windows_1252_to_utf8($data);
+ }
+ elseif ($input == 'UTF-8' && $output == 'windows-1252')
+ {
+ return utf8_decode($data);
+ }
+ return $data;
+ }
+
+ function encoding($encoding)
+ {
+ // Character sets are case-insensitive (though we'll return them in the form given in their registration)
+ switch (strtoupper($encoding))
+ {
+ case 'ANSI_X3.110-1983':
+ case 'CSA_T500-1983':
+ case 'CSISO99NAPLPS':
+ case 'ISO-IR-99':
+ case 'NAPLPS':
+ return 'ANSI_X3.110-1983';
+
+ case 'ARABIC7':
+ case 'ASMO_449':
+ case 'CSISO89ASMO449':
+ case 'ISO-IR-89':
+ case 'ISO_9036':
+ return 'ASMO_449';
+
+ case 'ADOBE-STANDARD-ENCODING':
+ case 'CSADOBESTANDARDENCODING':
+ return 'Adobe-Standard-Encoding';
+
+ case 'ADOBE-SYMBOL-ENCODING':
+ case 'CSHPPSMATH':
+ return 'Adobe-Symbol-Encoding';
+
+ case 'AMI-1251':
+ case 'AMI1251':
+ case 'AMIGA-1251':
+ case 'AMIGA1251':
+ return 'Amiga-1251';
+
+ case 'BOCU-1':
+ case 'CSBOCU-1':
+ return 'BOCU-1';
+
+ case 'BRF':
+ case 'CSBRF':
+ return 'BRF';
+
+ case 'BS_4730':
+ case 'CSISO4UNITEDKINGDOM':
+ case 'GB':
+ case 'ISO-IR-4':
+ case 'ISO646-GB':
+ case 'UK':
+ return 'BS_4730';
+
+ case 'BS_VIEWDATA':
+ case 'CSISO47BSVIEWDATA':
+ case 'ISO-IR-47':
+ return 'BS_viewdata';
+
+ case 'BIG5':
+ case 'CSBIG5':
+ return 'Big5';
+
+ case 'BIG5-HKSCS':
+ return 'Big5-HKSCS';
+
+ case 'CESU-8':
+ case 'CSCESU-8':
+ return 'CESU-8';
+
+ case 'CA':
+ case 'CSA7-1':
+ case 'CSA_Z243.4-1985-1':
+ case 'CSISO121CANADIAN1':
+ case 'ISO-IR-121':
+ case 'ISO646-CA':
+ return 'CSA_Z243.4-1985-1';
+
+ case 'CSA7-2':
+ case 'CSA_Z243.4-1985-2':
+ case 'CSISO122CANADIAN2':
+ case 'ISO-IR-122':
+ case 'ISO646-CA2':
+ return 'CSA_Z243.4-1985-2';
+
+ case 'CSA_Z243.4-1985-GR':
+ case 'CSISO123CSAZ24341985GR':
+ case 'ISO-IR-123':
+ return 'CSA_Z243.4-1985-gr';
+
+ case 'CSISO139CSN369103':
+ case 'CSN_369103':
+ case 'ISO-IR-139':
+ return 'CSN_369103';
+
+ case 'CSDECMCS':
+ case 'DEC':
+ case 'DEC-MCS':
+ return 'DEC-MCS';
+
+ case 'CSISO21GERMAN':
+ case 'DE':
+ case 'DIN_66003':
+ case 'ISO-IR-21':
+ case 'ISO646-DE':
+ return 'DIN_66003';
+
+ case 'CSISO646DANISH':
+ case 'DK':
+ case 'DS2089':
+ case 'DS_2089':
+ case 'ISO646-DK':
+ return 'DS_2089';
+
+ case 'CSIBMEBCDICATDE':
+ case 'EBCDIC-AT-DE':
+ return 'EBCDIC-AT-DE';
+
+ case 'CSEBCDICATDEA':
+ case 'EBCDIC-AT-DE-A':
+ return 'EBCDIC-AT-DE-A';
+
+ case 'CSEBCDICCAFR':
+ case 'EBCDIC-CA-FR':
+ return 'EBCDIC-CA-FR';
+
+ case 'CSEBCDICDKNO':
+ case 'EBCDIC-DK-NO':
+ return 'EBCDIC-DK-NO';
+
+ case 'CSEBCDICDKNOA':
+ case 'EBCDIC-DK-NO-A':
+ return 'EBCDIC-DK-NO-A';
+
+ case 'CSEBCDICES':
+ case 'EBCDIC-ES':
+ return 'EBCDIC-ES';
+
+ case 'CSEBCDICESA':
+ case 'EBCDIC-ES-A':
+ return 'EBCDIC-ES-A';
+
+ case 'CSEBCDICESS':
+ case 'EBCDIC-ES-S':
+ return 'EBCDIC-ES-S';
+
+ case 'CSEBCDICFISE':
+ case 'EBCDIC-FI-SE':
+ return 'EBCDIC-FI-SE';
+
+ case 'CSEBCDICFISEA':
+ case 'EBCDIC-FI-SE-A':
+ return 'EBCDIC-FI-SE-A';
+
+ case 'CSEBCDICFR':
+ case 'EBCDIC-FR':
+ return 'EBCDIC-FR';
+
+ case 'CSEBCDICIT':
+ case 'EBCDIC-IT':
+ return 'EBCDIC-IT';
+
+ case 'CSEBCDICPT':
+ case 'EBCDIC-PT':
+ return 'EBCDIC-PT';
+
+ case 'CSEBCDICUK':
+ case 'EBCDIC-UK':
+ return 'EBCDIC-UK';
+
+ case 'CSEBCDICUS':
+ case 'EBCDIC-US':
+ return 'EBCDIC-US';
+
+ case 'CSISO111ECMACYRILLIC':
+ case 'ECMA-CYRILLIC':
+ case 'ISO-IR-111':
+ case 'KOI8-E':
+ return 'ECMA-cyrillic';
+
+ case 'CSISO17SPANISH':
+ case 'ES':
+ case 'ISO-IR-17':
+ case 'ISO646-ES':
+ return 'ES';
+
+ case 'CSISO85SPANISH2':
+ case 'ES2':
+ case 'ISO-IR-85':
+ case 'ISO646-ES2':
+ return 'ES2';
+
+ case 'CSEUCPKDFMTJAPANESE':
+ case 'EUC-JP':
+ case 'EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE':
+ return 'EUC-JP';
+
+ case 'CSEUCKR':
+ case 'EUC-KR':
+ return 'EUC-KR';
+
+ case 'CSEUCFIXWIDJAPANESE':
+ case 'EXTENDED_UNIX_CODE_FIXED_WIDTH_FOR_JAPANESE':
+ return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
+
+ case 'GB18030':
+ return 'GB18030';
+
+ case 'CSGB2312':
+ case 'GB2312':
+ return 'GB2312';
+
+ case 'CP936':
+ case 'GBK':
+ case 'MS936':
+ case 'WINDOWS-936':
+ return 'GBK';
+
+ case 'CN':
+ case 'CSISO57GB1988':
+ case 'GB_1988-80':
+ case 'ISO-IR-57':
+ case 'ISO646-CN':
+ return 'GB_1988-80';
+
+ case 'CHINESE':
+ case 'CSISO58GB231280':
+ case 'GB_2312-80':
+ case 'ISO-IR-58':
+ return 'GB_2312-80';
+
+ case 'CSISO153GOST1976874':
+ case 'GOST_19768-74':
+ case 'ISO-IR-153':
+ case 'ST_SEV_358-88':
+ return 'GOST_19768-74';
+
+ case 'CSHPDESKTOP':
+ case 'HP-DESKTOP':
+ return 'HP-DeskTop';
+
+ case 'CSHPLEGAL':
+ case 'HP-LEGAL':
+ return 'HP-Legal';
+
+ case 'CSHPMATH8':
+ case 'HP-MATH8':
+ return 'HP-Math8';
+
+ case 'CSHPPIFONT':
+ case 'HP-PI-FONT':
+ return 'HP-Pi-font';
+
+ case 'HZ-GB-2312':
+ return 'HZ-GB-2312';
+
+ case 'CSIBMSYMBOLS':
+ case 'IBM-SYMBOLS':
+ return 'IBM-Symbols';
+
+ case 'CSIBMTHAI':
+ case 'IBM-THAI':
+ return 'IBM-Thai';
+
+ case 'CCSID00858':
+ case 'CP00858':
+ case 'IBM00858':
+ case 'PC-MULTILINGUAL-850+EURO':
+ return 'IBM00858';
+
+ case 'CCSID00924':
+ case 'CP00924':
+ case 'EBCDIC-LATIN9--EURO':
+ case 'IBM00924':
+ return 'IBM00924';
+
+ case 'CCSID01140':
+ case 'CP01140':
+ case 'EBCDIC-US-37+EURO':
+ case 'IBM01140':
+ return 'IBM01140';
+
+ case 'CCSID01141':
+ case 'CP01141':
+ case 'EBCDIC-DE-273+EURO':
+ case 'IBM01141':
+ return 'IBM01141';
+
+ case 'CCSID01142':
+ case 'CP01142':
+ case 'EBCDIC-DK-277+EURO':
+ case 'EBCDIC-NO-277+EURO':
+ case 'IBM01142':
+ return 'IBM01142';
+
+ case 'CCSID01143':
+ case 'CP01143':
+ case 'EBCDIC-FI-278+EURO':
+ case 'EBCDIC-SE-278+EURO':
+ case 'IBM01143':
+ return 'IBM01143';
+
+ case 'CCSID01144':
+ case 'CP01144':
+ case 'EBCDIC-IT-280+EURO':
+ case 'IBM01144':
+ return 'IBM01144';
+
+ case 'CCSID01145':
+ case 'CP01145':
+ case 'EBCDIC-ES-284+EURO':
+ case 'IBM01145':
+ return 'IBM01145';
+
+ case 'CCSID01146':
+ case 'CP01146':
+ case 'EBCDIC-GB-285+EURO':
+ case 'IBM01146':
+ return 'IBM01146';
+
+ case 'CCSID01147':
+ case 'CP01147':
+ case 'EBCDIC-FR-297+EURO':
+ case 'IBM01147':
+ return 'IBM01147';
+
+ case 'CCSID01148':
+ case 'CP01148':
+ case 'EBCDIC-INTERNATIONAL-500+EURO':
+ case 'IBM01148':
+ return 'IBM01148';
+
+ case 'CCSID01149':
+ case 'CP01149':
+ case 'EBCDIC-IS-871+EURO':
+ case 'IBM01149':
+ return 'IBM01149';
+
+ case 'CP037':
+ case 'CSIBM037':
+ case 'EBCDIC-CP-CA':
+ case 'EBCDIC-CP-NL':
+ case 'EBCDIC-CP-US':
+ case 'EBCDIC-CP-WT':
+ case 'IBM037':
+ return 'IBM037';
+
+ case 'CP038':
+ case 'CSIBM038':
+ case 'EBCDIC-INT':
+ case 'IBM038':
+ return 'IBM038';
+
+ case 'CP1026':
+ case 'CSIBM1026':
+ case 'IBM1026':
+ return 'IBM1026';
+
+ case 'IBM-1047':
+ case 'IBM1047':
+ return 'IBM1047';
+
+ case 'CP273':
+ case 'CSIBM273':
+ case 'IBM273':
+ return 'IBM273';
+
+ case 'CP274':
+ case 'CSIBM274':
+ case 'EBCDIC-BE':
+ case 'IBM274':
+ return 'IBM274';
+
+ case 'CP275':
+ case 'CSIBM275':
+ case 'EBCDIC-BR':
+ case 'IBM275':
+ return 'IBM275';
+
+ case 'CSIBM277':
+ case 'EBCDIC-CP-DK':
+ case 'EBCDIC-CP-NO':
+ case 'IBM277':
+ return 'IBM277';
+
+ case 'CP278':
+ case 'CSIBM278':
+ case 'EBCDIC-CP-FI':
+ case 'EBCDIC-CP-SE':
+ case 'IBM278':
+ return 'IBM278';
+
+ case 'CP280':
+ case 'CSIBM280':
+ case 'EBCDIC-CP-IT':
+ case 'IBM280':
+ return 'IBM280';
+
+ case 'CP281':
+ case 'CSIBM281':
+ case 'EBCDIC-JP-E':
+ case 'IBM281':
+ return 'IBM281';
+
+ case 'CP284':
+ case 'CSIBM284':
+ case 'EBCDIC-CP-ES':
+ case 'IBM284':
+ return 'IBM284';
+
+ case 'CP285':
+ case 'CSIBM285':
+ case 'EBCDIC-CP-GB':
+ case 'IBM285':
+ return 'IBM285';
+
+ case 'CP290':
+ case 'CSIBM290':
+ case 'EBCDIC-JP-KANA':
+ case 'IBM290':
+ return 'IBM290';
+
+ case 'CP297':
+ case 'CSIBM297':
+ case 'EBCDIC-CP-FR':
+ case 'IBM297':
+ return 'IBM297';
+
+ case 'CP420':
+ case 'CSIBM420':
+ case 'EBCDIC-CP-AR1':
+ case 'IBM420':
+ return 'IBM420';
+
+ case 'CP423':
+ case 'CSIBM423':
+ case 'EBCDIC-CP-GR':
+ case 'IBM423':
+ return 'IBM423';
+
+ case 'CP424':
+ case 'CSIBM424':
+ case 'EBCDIC-CP-HE':
+ case 'IBM424':
+ return 'IBM424';
+
+ case '437':
+ case 'CP437':
+ case 'CSPC8CODEPAGE437':
+ case 'IBM437':
+ return 'IBM437';
+
+ case 'CP500':
+ case 'CSIBM500':
+ case 'EBCDIC-CP-BE':
+ case 'EBCDIC-CP-CH':
+ case 'IBM500':
+ return 'IBM500';
+
+ case 'CP775':
+ case 'CSPC775BALTIC':
+ case 'IBM775':
+ return 'IBM775';
+
+ case '850':
+ case 'CP850':
+ case 'CSPC850MULTILINGUAL':
+ case 'IBM850':
+ return 'IBM850';
+
+ case '851':
+ case 'CP851':
+ case 'CSIBM851':
+ case 'IBM851':
+ return 'IBM851';
+
+ case '852':
+ case 'CP852':
+ case 'CSPCP852':
+ case 'IBM852':
+ return 'IBM852';
+
+ case '855':
+ case 'CP855':
+ case 'CSIBM855':
+ case 'IBM855':
+ return 'IBM855';
+
+ case '857':
+ case 'CP857':
+ case 'CSIBM857':
+ case 'IBM857':
+ return 'IBM857';
+
+ case '860':
+ case 'CP860':
+ case 'CSIBM860':
+ case 'IBM860':
+ return 'IBM860';
+
+ case '861':
+ case 'CP-IS':
+ case 'CP861':
+ case 'CSIBM861':
+ case 'IBM861':
+ return 'IBM861';
+
+ case '862':
+ case 'CP862':
+ case 'CSPC862LATINHEBREW':
+ case 'IBM862':
+ return 'IBM862';
+
+ case '863':
+ case 'CP863':
+ case 'CSIBM863':
+ case 'IBM863':
+ return 'IBM863';
+
+ case 'CP864':
+ case 'CSIBM864':
+ case 'IBM864':
+ return 'IBM864';
+
+ case '865':
+ case 'CP865':
+ case 'CSIBM865':
+ case 'IBM865':
+ return 'IBM865';
+
+ case '866':
+ case 'CP866':
+ case 'CSIBM866':
+ case 'IBM866':
+ return 'IBM866';
+
+ case 'CP-AR':
+ case 'CP868':
+ case 'CSIBM868':
+ case 'IBM868':
+ return 'IBM868';
+
+ case '869':
+ case 'CP-GR':
+ case 'CP869':
+ case 'CSIBM869':
+ case 'IBM869':
+ return 'IBM869';
+
+ case 'CP870':
+ case 'CSIBM870':
+ case 'EBCDIC-CP-ROECE':
+ case 'EBCDIC-CP-YU':
+ case 'IBM870':
+ return 'IBM870';
+
+ case 'CP871':
+ case 'CSIBM871':
+ case 'EBCDIC-CP-IS':
+ case 'IBM871':
+ return 'IBM871';
+
+ case 'CP880':
+ case 'CSIBM880':
+ case 'EBCDIC-CYRILLIC':
+ case 'IBM880':
+ return 'IBM880';
+
+ case 'CP891':
+ case 'CSIBM891':
+ case 'IBM891':
+ return 'IBM891';
+
+ case 'CP903':
+ case 'CSIBM903':
+ case 'IBM903':
+ return 'IBM903';
+
+ case '904':
+ case 'CP904':
+ case 'CSIBBM904':
+ case 'IBM904':
+ return 'IBM904';
+
+ case 'CP905':
+ case 'CSIBM905':
+ case 'EBCDIC-CP-TR':
+ case 'IBM905':
+ return 'IBM905';
+
+ case 'CP918':
+ case 'CSIBM918':
+ case 'EBCDIC-CP-AR2':
+ case 'IBM918':
+ return 'IBM918';
+
+ case 'CSISO143IECP271':
+ case 'IEC_P27-1':
+ case 'ISO-IR-143':
+ return 'IEC_P27-1';
+
+ case 'CSISO49INIS':
+ case 'INIS':
+ case 'ISO-IR-49':
+ return 'INIS';
+
+ case 'CSISO50INIS8':
+ case 'INIS-8':
+ case 'ISO-IR-50':
+ return 'INIS-8';
+
+ case 'CSISO51INISCYRILLIC':
+ case 'INIS-CYRILLIC':
+ case 'ISO-IR-51':
+ return 'INIS-cyrillic';
+
+ case 'CSINVARIANT':
+ case 'INVARIANT':
+ return 'INVARIANT';
+
+ case 'ISO-10646-J-1':
+ return 'ISO-10646-J-1';
+
+ case 'CSUNICODE':
+ case 'ISO-10646-UCS-2':
+ return 'ISO-10646-UCS-2';
+
+ case 'CSUCS4':
+ case 'ISO-10646-UCS-4':
+ return 'ISO-10646-UCS-4';
+
+ case 'CSUNICODEASCII':
+ case 'ISO-10646-UCS-BASIC':
+ return 'ISO-10646-UCS-Basic';
+
+ case 'CSISO10646UTF1':
+ case 'ISO-10646-UTF-1':
+ return 'ISO-10646-UTF-1';
+
+ case 'CSUNICODELATIN1':
+ case 'ISO-10646':
+ case 'ISO-10646-UNICODE-LATIN1':
+ return 'ISO-10646-Unicode-Latin1';
+
+ case 'CSISO115481':
+ case 'ISO-11548-1':
+ case 'ISO_11548-1':
+ case 'ISO_TR_11548-1':
+ return 'ISO-11548-1';
+
+ case 'ISO-2022-CN':
+ return 'ISO-2022-CN';
+
+ case 'ISO-2022-CN-EXT':
+ return 'ISO-2022-CN-EXT';
+
+ case 'CSISO2022JP':
+ case 'ISO-2022-JP':
+ return 'ISO-2022-JP';
+
+ case 'CSISO2022JP2':
+ case 'ISO-2022-JP-2':
+ return 'ISO-2022-JP-2';
+
+ case 'CSISO2022KR':
+ case 'ISO-2022-KR':
+ return 'ISO-2022-KR';
+
+ case 'CSWINDOWS30LATIN1':
+ case 'ISO-8859-1-WINDOWS-3.0-LATIN-1':
+ return 'ISO-8859-1-Windows-3.0-Latin-1';
+
+ case 'CSWINDOWS31LATIN1':
+ case 'ISO-8859-1-WINDOWS-3.1-LATIN-1':
+ return 'ISO-8859-1-Windows-3.1-Latin-1';
+
+ case 'CSISOLATIN6':
+ case 'ISO-8859-10':
+ case 'ISO-IR-157':
+ case 'ISO_8859-10:1992':
+ case 'L6':
+ case 'LATIN6':
+ return 'ISO-8859-10';
+
+ case 'ISO-8859-13':
+ return 'ISO-8859-13';
+
+ case 'ISO-8859-14':
+ case 'ISO-CELTIC':
+ case 'ISO-IR-199':
+ case 'ISO_8859-14':
+ case 'ISO_8859-14:1998':
+ case 'L8':
+ case 'LATIN8':
+ return 'ISO-8859-14';
+
+ case 'ISO-8859-15':
+ case 'ISO_8859-15':
+ case 'LATIN-9':
+ return 'ISO-8859-15';
+
+ case 'ISO-8859-16':
+ case 'ISO-IR-226':
+ case 'ISO_8859-16':
+ case 'ISO_8859-16:2001':
+ case 'L10':
+ case 'LATIN10':
+ return 'ISO-8859-16';
+
+ case 'CSISOLATIN2':
+ case 'ISO-8859-2':
+ case 'ISO-IR-101':
+ case 'ISO_8859-2':
+ case 'ISO_8859-2:1987':
+ case 'L2':
+ case 'LATIN2':
+ return 'ISO-8859-2';
+
+ case 'CSWINDOWS31LATIN2':
+ case 'ISO-8859-2-WINDOWS-LATIN-2':
+ return 'ISO-8859-2-Windows-Latin-2';
+
+ case 'CSISOLATIN3':
+ case 'ISO-8859-3':
+ case 'ISO-IR-109':
+ case 'ISO_8859-3':
+ case 'ISO_8859-3:1988':
+ case 'L3':
+ case 'LATIN3':
+ return 'ISO-8859-3';
+
+ case 'CSISOLATIN4':
+ case 'ISO-8859-4':
+ case 'ISO-IR-110':
+ case 'ISO_8859-4':
+ case 'ISO_8859-4:1988':
+ case 'L4':
+ case 'LATIN4':
+ return 'ISO-8859-4';
+
+ case 'CSISOLATINCYRILLIC':
+ case 'CYRILLIC':
+ case 'ISO-8859-5':
+ case 'ISO-IR-144':
+ case 'ISO_8859-5':
+ case 'ISO_8859-5:1988':
+ return 'ISO-8859-5';
+
+ case 'ARABIC':
+ case 'ASMO-708':
+ case 'CSISOLATINARABIC':
+ case 'ECMA-114':
+ case 'ISO-8859-6':
+ case 'ISO-IR-127':
+ case 'ISO_8859-6':
+ case 'ISO_8859-6:1987':
+ return 'ISO-8859-6';
+
+ case 'CSISO88596E':
+ case 'ISO-8859-6-E':
+ case 'ISO_8859-6-E':
+ return 'ISO-8859-6-E';
+
+ case 'CSISO88596I':
+ case 'ISO-8859-6-I':
+ case 'ISO_8859-6-I':
+ return 'ISO-8859-6-I';
+
+ case 'CSISOLATINGREEK':
+ case 'ECMA-118':
+ case 'ELOT_928':
+ case 'GREEK':
+ case 'GREEK8':
+ case 'ISO-8859-7':
+ case 'ISO-IR-126':
+ case 'ISO_8859-7':
+ case 'ISO_8859-7:1987':
+ return 'ISO-8859-7';
+
+ case 'CSISOLATINHEBREW':
+ case 'HEBREW':
+ case 'ISO-8859-8':
+ case 'ISO-IR-138':
+ case 'ISO_8859-8':
+ case 'ISO_8859-8:1988':
+ return 'ISO-8859-8';
+
+ case 'CSISO88598E':
+ case 'ISO-8859-8-E':
+ case 'ISO_8859-8-E':
+ return 'ISO-8859-8-E';
+
+ case 'CSISO88598I':
+ case 'ISO-8859-8-I':
+ case 'ISO_8859-8-I':
+ return 'ISO-8859-8-I';
+
+ case 'CSISOLATIN5':
+ case 'ISO-8859-9':
+ case 'ISO-IR-148':
+ case 'ISO_8859-9':
+ case 'ISO_8859-9:1989':
+ case 'L5':
+ case 'LATIN5':
+ return 'ISO-8859-9';
+
+ case 'CSWINDOWS31LATIN5':
+ case 'ISO-8859-9-WINDOWS-LATIN-5':
+ return 'ISO-8859-9-Windows-Latin-5';
+
+ case 'CSUNICODEIBM1261':
+ case 'ISO-UNICODE-IBM-1261':
+ return 'ISO-Unicode-IBM-1261';
+
+ case 'CSUNICODEIBM1264':
+ case 'ISO-UNICODE-IBM-1264':
+ return 'ISO-Unicode-IBM-1264';
+
+ case 'CSUNICODEIBM1265':
+ case 'ISO-UNICODE-IBM-1265':
+ return 'ISO-Unicode-IBM-1265';
+
+ case 'CSUNICODEIBM1268':
+ case 'ISO-UNICODE-IBM-1268':
+ return 'ISO-Unicode-IBM-1268';
+
+ case 'CSUNICODEIBM1276':
+ case 'ISO-UNICODE-IBM-1276':
+ return 'ISO-Unicode-IBM-1276';
+
+ case 'CSISO10367BOX':
+ case 'ISO-IR-155':
+ case 'ISO_10367-BOX':
+ return 'ISO_10367-box';
+
+ case 'CSISO2033':
+ case 'E13B':
+ case 'ISO-IR-98':
+ case 'ISO_2033-1983':
+ return 'ISO_2033-1983';
+
+ case 'CSISO5427CYRILLIC':
+ case 'ISO-IR-37':
+ case 'ISO_5427':
+ return 'ISO_5427';
+
+ case 'ISO-IR-54':
+ case 'ISO5427CYRILLIC1981':
+ case 'ISO_5427:1981':
+ return 'ISO_5427:1981';
+
+ case 'CSISO5428GREEK':
+ case 'ISO-IR-55':
+ case 'ISO_5428:1980':
+ return 'ISO_5428:1980';
+
+ case 'CSISO646BASIC1983':
+ case 'ISO_646.BASIC:1983':
+ case 'REF':
+ return 'ISO_646.basic:1983';
+
+ case 'CSISO2INTLREFVERSION':
+ case 'IRV':
+ case 'ISO-IR-2':
+ case 'ISO_646.IRV:1983':
+ return 'ISO_646.irv:1983';
+
+ case 'CSISO6937ADD':
+ case 'ISO-IR-152':
+ case 'ISO_6937-2-25':
+ return 'ISO_6937-2-25';
+
+ case 'CSISOTEXTCOMM':
+ case 'ISO-IR-142':
+ case 'ISO_6937-2-ADD':
+ return 'ISO_6937-2-add';
+
+ case 'CSISO8859SUPP':
+ case 'ISO-IR-154':
+ case 'ISO_8859-SUPP':
+ case 'LATIN1-2-5':
+ return 'ISO_8859-supp';
+
+ case 'CSISO15ITALIAN':
+ case 'ISO-IR-15':
+ case 'ISO646-IT':
+ case 'IT':
+ return 'IT';
+
+ case 'CSISO13JISC6220JP':
+ case 'ISO-IR-13':
+ case 'JIS_C6220-1969':
+ case 'JIS_C6220-1969-JP':
+ case 'KATAKANA':
+ case 'X0201-7':
+ return 'JIS_C6220-1969-jp';
+
+ case 'CSISO14JISC6220RO':
+ case 'ISO-IR-14':
+ case 'ISO646-JP':
+ case 'JIS_C6220-1969-RO':
+ case 'JP':
+ return 'JIS_C6220-1969-ro';
+
+ case 'CSISO42JISC62261978':
+ case 'ISO-IR-42':
+ case 'JIS_C6226-1978':
+ return 'JIS_C6226-1978';
+
+ case 'CSISO87JISX0208':
+ case 'ISO-IR-87':
+ case 'JIS_C6226-1983':
+ case 'JIS_X0208-1983':
+ case 'X0208':
+ return 'JIS_C6226-1983';
+
+ case 'CSISO91JISC62291984A':
+ case 'ISO-IR-91':
+ case 'JIS_C6229-1984-A':
+ case 'JP-OCR-A':
+ return 'JIS_C6229-1984-a';
+
+ case 'CSISO92JISC62991984B':
+ case 'ISO-IR-92':
+ case 'ISO646-JP-OCR-B':
+ case 'JIS_C6229-1984-B':
+ case 'JP-OCR-B':
+ return 'JIS_C6229-1984-b';
+
+ case 'CSISO93JIS62291984BADD':
+ case 'ISO-IR-93':
+ case 'JIS_C6229-1984-B-ADD':
+ case 'JP-OCR-B-ADD':
+ return 'JIS_C6229-1984-b-add';
+
+ case 'CSISO94JIS62291984HAND':
+ case 'ISO-IR-94':
+ case 'JIS_C6229-1984-HAND':
+ case 'JP-OCR-HAND':
+ return 'JIS_C6229-1984-hand';
+
+ case 'CSISO95JIS62291984HANDADD':
+ case 'ISO-IR-95':
+ case 'JIS_C6229-1984-HAND-ADD':
+ case 'JP-OCR-HAND-ADD':
+ return 'JIS_C6229-1984-hand-add';
+
+ case 'CSISO96JISC62291984KANA':
+ case 'ISO-IR-96':
+ case 'JIS_C6229-1984-KANA':
+ return 'JIS_C6229-1984-kana';
+
+ case 'CSJISENCODING':
+ case 'JIS_ENCODING':
+ return 'JIS_Encoding';
+
+ case 'CSHALFWIDTHKATAKANA':
+ case 'JIS_X0201':
+ case 'X0201':
+ return 'JIS_X0201';
+
+ case 'CSISO159JISX02121990':
+ case 'ISO-IR-159':
+ case 'JIS_X0212-1990':
+ case 'X0212':
+ return 'JIS_X0212-1990';
+
+ case 'CSISO141JUSIB1002':
+ case 'ISO-IR-141':
+ case 'ISO646-YU':
+ case 'JS':
+ case 'JUS_I.B1.002':
+ case 'YU':
+ return 'JUS_I.B1.002';
+
+ case 'CSISO147MACEDONIAN':
+ case 'ISO-IR-147':
+ case 'JUS_I.B1.003-MAC':
+ case 'MACEDONIAN':
+ return 'JUS_I.B1.003-mac';
+
+ case 'CSISO146SERBIAN':
+ case 'ISO-IR-146':
+ case 'JUS_I.B1.003-SERB':
+ case 'SERBIAN':
+ return 'JUS_I.B1.003-serb';
+
+ case 'KOI7-SWITCHED':
+ return 'KOI7-switched';
+
+ case 'CSKOI8R':
+ case 'KOI8-R':
+ return 'KOI8-R';
+
+ case 'KOI8-U':
+ return 'KOI8-U';
+
+ case 'CSKSC5636':
+ case 'ISO646-KR':
+ case 'KSC5636':
+ return 'KSC5636';
+
+ case 'CSKSC56011987':
+ case 'ISO-IR-149':
+ case 'KOREAN':
+ case 'KSC_5601':
+ case 'KS_C_5601-1987':
+ case 'KS_C_5601-1989':
+ return 'KS_C_5601-1987';
+
+ case 'CSKZ1048':
+ case 'KZ-1048':
+ case 'RK1048':
+ case 'STRK1048-2002':
+ return 'KZ-1048';
+
+ case 'CSISO27LATINGREEK1':
+ case 'ISO-IR-27':
+ case 'LATIN-GREEK-1':
+ return 'Latin-greek-1';
+
+ case 'CSMNEM':
+ case 'MNEM':
+ return 'MNEM';
+
+ case 'CSMNEMONIC':
+ case 'MNEMONIC':
+ return 'MNEMONIC';
+
+ case 'CSISO86HUNGARIAN':
+ case 'HU':
+ case 'ISO-IR-86':
+ case 'ISO646-HU':
+ case 'MSZ_7795.3':
+ return 'MSZ_7795.3';
+
+ case 'CSMICROSOFTPUBLISHING':
+ case 'MICROSOFT-PUBLISHING':
+ return 'Microsoft-Publishing';
+
+ case 'CSNATSDANO':
+ case 'ISO-IR-9-1':
+ case 'NATS-DANO':
+ return 'NATS-DANO';
+
+ case 'CSNATSDANOADD':
+ case 'ISO-IR-9-2':
+ case 'NATS-DANO-ADD':
+ return 'NATS-DANO-ADD';
+
+ case 'CSNATSSEFI':
+ case 'ISO-IR-8-1':
+ case 'NATS-SEFI':
+ return 'NATS-SEFI';
+
+ case 'CSNATSSEFIADD':
+ case 'ISO-IR-8-2':
+ case 'NATS-SEFI-ADD':
+ return 'NATS-SEFI-ADD';
+
+ case 'CSISO151CUBA':
+ case 'CUBA':
+ case 'ISO-IR-151':
+ case 'ISO646-CU':
+ case 'NC_NC00-10:81':
+ return 'NC_NC00-10:81';
+
+ case 'CSISO69FRENCH':
+ case 'FR':
+ case 'ISO-IR-69':
+ case 'ISO646-FR':
+ case 'NF_Z_62-010':
+ return 'NF_Z_62-010';
+
+ case 'CSISO25FRENCH':
+ case 'ISO-IR-25':
+ case 'ISO646-FR1':
+ case 'NF_Z_62-010_(1973)':
+ return 'NF_Z_62-010_(1973)';
+
+ case 'CSISO60DANISHNORWEGIAN':
+ case 'CSISO60NORWEGIAN1':
+ case 'ISO-IR-60':
+ case 'ISO646-NO':
+ case 'NO':
+ case 'NS_4551-1':
+ return 'NS_4551-1';
+
+ case 'CSISO61NORWEGIAN2':
+ case 'ISO-IR-61':
+ case 'ISO646-NO2':
+ case 'NO2':
+ case 'NS_4551-2':
+ return 'NS_4551-2';
+
+ case 'OSD_EBCDIC_DF03_IRV':
+ return 'OSD_EBCDIC_DF03_IRV';
+
+ case 'OSD_EBCDIC_DF04_1':
+ return 'OSD_EBCDIC_DF04_1';
+
+ case 'OSD_EBCDIC_DF04_15':
+ return 'OSD_EBCDIC_DF04_15';
+
+ case 'CSPC8DANISHNORWEGIAN':
+ case 'PC8-DANISH-NORWEGIAN':
+ return 'PC8-Danish-Norwegian';
+
+ case 'CSPC8TURKISH':
+ case 'PC8-TURKISH':
+ return 'PC8-Turkish';
+
+ case 'CSISO16PORTUGUESE':
+ case 'ISO-IR-16':
+ case 'ISO646-PT':
+ case 'PT':
+ return 'PT';
+
+ case 'CSISO84PORTUGUESE2':
+ case 'ISO-IR-84':
+ case 'ISO646-PT2':
+ case 'PT2':
+ return 'PT2';
+
+ case 'CP154':
+ case 'CSPTCP154':
+ case 'CYRILLIC-ASIAN':
+ case 'PT154':
+ case 'PTCP154':
+ return 'PTCP154';
+
+ case 'SCSU':
+ return 'SCSU';
+
+ case 'CSISO10SWEDISH':
+ case 'FI':
+ case 'ISO-IR-10':
+ case 'ISO646-FI':
+ case 'ISO646-SE':
+ case 'SE':
+ case 'SEN_850200_B':
+ return 'SEN_850200_B';
+
+ case 'CSISO11SWEDISHFORNAMES':
+ case 'ISO-IR-11':
+ case 'ISO646-SE2':
+ case 'SE2':
+ case 'SEN_850200_C':
+ return 'SEN_850200_C';
+
+ case 'CSSHIFTJIS':
+ case 'MS_KANJI':
+ case 'SHIFT_JIS':
+ return 'Shift_JIS';
+
+ case 'CSISO128T101G2':
+ case 'ISO-IR-128':
+ case 'T.101-G2':
+ return 'T.101-G2';
+
+ case 'CSISO102T617BIT':
+ case 'ISO-IR-102':
+ case 'T.61-7BIT':
+ return 'T.61-7bit';
+
+ case 'CSISO103T618BIT':
+ case 'ISO-IR-103':
+ case 'T.61':
+ case 'T.61-8BIT':
+ return 'T.61-8bit';
+
+ case 'CSTSCII':
+ case 'TSCII':
+ return 'TSCII';
+
+ case 'CSUNICODE11':
+ case 'UNICODE-1-1':
+ return 'UNICODE-1-1';
+
+ case 'CSUNICODE11UTF7':
+ case 'UNICODE-1-1-UTF-7':
+ return 'UNICODE-1-1-UTF-7';
+
+ case 'CSUNKNOWN8BIT':
+ case 'UNKNOWN-8BIT':
+ return 'UNKNOWN-8BIT';
+
+ case 'ANSI':
+ case 'ANSI_X3.4-1968':
+ case 'ANSI_X3.4-1986':
+ case 'ASCII':
+ case 'CP367':
+ case 'CSASCII':
+ case 'IBM367':
+ case 'ISO-IR-6':
+ case 'ISO646-US':
+ case 'ISO_646.IRV:1991':
+ case 'US':
+ case 'US-ASCII':
+ return 'US-ASCII';
+
+ case 'UTF-16':
+ return 'UTF-16';
+
+ case 'UTF-16BE':
+ return 'UTF-16BE';
+
+ case 'UTF-16LE':
+ return 'UTF-16LE';
+
+ case 'UTF-32':
+ return 'UTF-32';
+
+ case 'UTF-32BE':
+ return 'UTF-32BE';
+
+ case 'UTF-32LE':
+ return 'UTF-32LE';
+
+ case 'UTF-7':
+ return 'UTF-7';
+
+ case 'UTF-8':
+ return 'UTF-8';
+
+ case 'CSVIQR':
+ case 'VIQR':
+ return 'VIQR';
+
+ case 'CSVISCII':
+ case 'VISCII':
+ return 'VISCII';
+
+ case 'CSVENTURAINTERNATIONAL':
+ case 'VENTURA-INTERNATIONAL':
+ return 'Ventura-International';
+
+ case 'CSVENTURAMATH':
+ case 'VENTURA-MATH':
+ return 'Ventura-Math';
+
+ case 'CSVENTURAUS':
+ case 'VENTURA-US':
+ return 'Ventura-US';
+
+ case 'CSWINDOWS31J':
+ case 'WINDOWS-31J':
+ return 'Windows-31J';
+
+ case 'CSDKUS':
+ case 'DK-US':
+ return 'dk-us';
+
+ case 'CSISO150':
+ case 'CSISO150GREEKCCITT':
+ case 'GREEK-CCITT':
+ case 'ISO-IR-150':
+ return 'greek-ccitt';
+
+ case 'CSISO88GREEK7':
+ case 'GREEK7':
+ case 'ISO-IR-88':
+ return 'greek7';
+
+ case 'CSISO18GREEK7OLD':
+ case 'GREEK7-OLD':
+ case 'ISO-IR-18':
+ return 'greek7-old';
+
+ case 'CSHPROMAN8':
+ case 'HP-ROMAN8':
+ case 'R8':
+ case 'ROMAN8':
+ return 'hp-roman8';
+
+ case 'CSISO90':
+ case 'ISO-IR-90':
+ return 'iso-ir-90';
+
+ case 'CSISO19LATINGREEK':
+ case 'ISO-IR-19':
+ case 'LATIN-GREEK':
+ return 'latin-greek';
+
+ case 'CSISO158LAP':
+ case 'ISO-IR-158':
+ case 'LAP':
+ case 'LATIN-LAP':
+ return 'latin-lap';
+
+ case 'CSMACINTOSH':
+ case 'MAC':
+ case 'MACINTOSH':
+ return 'macintosh';
+
+ case 'CSUSDK':
+ case 'US-DK':
+ return 'us-dk';
+
+ case 'CSISO70VIDEOTEXSUPP1':
+ case 'ISO-IR-70':
+ case 'VIDEOTEX-SUPPL':
+ return 'videotex-suppl';
+
+ case 'WINDOWS-1250':
+ return 'windows-1250';
+
+ case 'WINDOWS-1251':
+ return 'windows-1251';
+
+ case 'CP819':
+ case 'CSISOLATIN1':
+ case 'IBM819':
+ case 'ISO-8859-1':
+ case 'ISO-IR-100':
+ case 'ISO_8859-1':
+ case 'ISO_8859-1:1987':
+ case 'L1':
+ case 'LATIN1':
+ case 'WINDOWS-1252':
+ return 'windows-1252';
+
+ case 'WINDOWS-1253':
+ return 'windows-1253';
+
+ case 'WINDOWS-1254':
+ return 'windows-1254';
+
+ case 'WINDOWS-1255':
+ return 'windows-1255';
+
+ case 'WINDOWS-1256':
+ return 'windows-1256';
+
+ case 'WINDOWS-1257':
+ return 'windows-1257';
+
+ case 'WINDOWS-1258':
+ return 'windows-1258';
+
+ default:
+ return $encoding;
+ }
+ }
+
+ function get_curl_version()
+ {
+ if (is_array($curl = curl_version()))
+ {
+ $curl = $curl['version'];
+ }
+ elseif (substr($curl, 0, 5) == 'curl/')
+ {
+ $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5));
+ }
+ elseif (substr($curl, 0, 8) == 'libcurl/')
+ {
+ $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8));
+ }
+ else
+ {
+ $curl = 0;
+ }
+ return $curl;
+ }
+
+ function is_subclass_of($class1, $class2)
+ {
+ if (func_num_args() != 2)
+ {
+ trigger_error('Wrong parameter count for SimplePie_Misc::is_subclass_of()', E_USER_WARNING);
+ }
+ elseif (version_compare(PHP_VERSION, '5.0.3', '>=') || is_object($class1))
+ {
+ return is_subclass_of($class1, $class2);
+ }
+ elseif (is_string($class1) && is_string($class2))
+ {
+ if (class_exists($class1))
+ {
+ if (class_exists($class2))
+ {
+ $class2 = strtolower($class2);
+ while ($class1 = strtolower(get_parent_class($class1)))
+ {
+ if ($class1 == $class2)
+ {
+ return true;
+ }
+ }
+ }
+ }
+ else
+ {
+ trigger_error('Unknown class passed as parameter', E_USER_WARNNG);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Strip HTML comments
+ *
+ * @access public
+ * @param string $data Data to strip comments from
+ * @return string Comment stripped string
+ */
+ function strip_comments($data)
+ {
+ $output = '';
+ while (($start = strpos($data, '', $start)) !== false)
+ {
+ $data = substr_replace($data, '', 0, $end + 3);
+ }
+ else
+ {
+ $data = '';
+ }
+ }
+ return $output . $data;
+ }
+
+ function parse_date($dt)
+ {
+ $parser = SimplePie_Parse_Date::get();
+ return $parser->parse($dt);
+ }
+
+ /**
+ * Decode HTML entities
+ *
+ * @static
+ * @access public
+ * @param string $data Input data
+ * @return string Output data
+ */
+ function entities_decode($data)
+ {
+ $decoder = new SimplePie_Decode_HTML_Entities($data);
+ return $decoder->parse();
+ }
+
+ /**
+ * Remove RFC822 comments
+ *
+ * @access public
+ * @param string $data Data to strip comments from
+ * @return string Comment stripped string
+ */
+ function uncomment_rfc822($string)
+ {
+ $string = (string) $string;
+ $position = 0;
+ $length = strlen($string);
+ $depth = 0;
+
+ $output = '';
+
+ while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
+ {
+ $output .= substr($string, $position, $pos - $position);
+ $position = $pos + 1;
+ if ($string[$pos - 1] !== '\\')
+ {
+ $depth++;
+ while ($depth && $position < $length)
+ {
+ $position += strcspn($string, '()', $position);
+ if ($string[$position - 1] === '\\')
+ {
+ $position++;
+ continue;
+ }
+ elseif (isset($string[$position]))
+ {
+ switch ($string[$position])
+ {
+ case '(':
+ $depth++;
+ break;
+
+ case ')':
+ $depth--;
+ break;
+ }
+ $position++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ $output .= '(';
+ }
+ }
+ $output .= substr($string, $position);
+
+ return $output;
+ }
+
+ function parse_mime($mime)
+ {
+ if (($pos = strpos($mime, ';')) === false)
+ {
+ return trim($mime);
+ }
+ else
+ {
+ return trim(substr($mime, 0, $pos));
+ }
+ }
+
+ function htmlspecialchars_decode($string, $quote_style)
+ {
+ if (function_exists('htmlspecialchars_decode'))
+ {
+ return htmlspecialchars_decode($string, $quote_style);
+ }
+ else
+ {
+ return strtr($string, array_flip(get_html_translation_table(HTML_SPECIALCHARS, $quote_style)));
+ }
+ }
+
+ function atom_03_construct_type($attribs)
+ {
+ if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) == 'base64'))
+ {
+ $mode = SIMPLEPIE_CONSTRUCT_BASE64;
+ }
+ else
+ {
+ $mode = SIMPLEPIE_CONSTRUCT_NONE;
+ }
+ if (isset($attribs['']['type']))
+ {
+ switch (strtolower(trim($attribs['']['type'])))
+ {
+ case 'text':
+ case 'text/plain':
+ return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
+
+ case 'html':
+ case 'text/html':
+ return SIMPLEPIE_CONSTRUCT_HTML | $mode;
+
+ case 'xhtml':
+ case 'application/xhtml+xml':
+ return SIMPLEPIE_CONSTRUCT_XHTML | $mode;
+
+ default:
+ return SIMPLEPIE_CONSTRUCT_NONE | $mode;
+ }
+ }
+ else
+ {
+ return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
+ }
+ }
+
+ function atom_10_construct_type($attribs)
+ {
+ if (isset($attribs['']['type']))
+ {
+ switch (strtolower(trim($attribs['']['type'])))
+ {
+ case 'text':
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+
+ case 'html':
+ return SIMPLEPIE_CONSTRUCT_HTML;
+
+ case 'xhtml':
+ return SIMPLEPIE_CONSTRUCT_XHTML;
+
+ default:
+ return SIMPLEPIE_CONSTRUCT_NONE;
+ }
+ }
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+ }
+
+ function atom_10_content_construct_type($attribs)
+ {
+ if (isset($attribs['']['type']))
+ {
+ $type = strtolower(trim($attribs['']['type']));
+ switch ($type)
+ {
+ case 'text':
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+
+ case 'html':
+ return SIMPLEPIE_CONSTRUCT_HTML;
+
+ case 'xhtml':
+ return SIMPLEPIE_CONSTRUCT_XHTML;
+ }
+ if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) == 'text/')
+ {
+ return SIMPLEPIE_CONSTRUCT_NONE;
+ }
+ else
+ {
+ return SIMPLEPIE_CONSTRUCT_BASE64;
+ }
+ }
+ else
+ {
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+ }
+ }
+
+ function is_isegment_nz_nc($string)
+ {
+ 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);
+ }
+
+ function space_seperated_tokens($string)
+ {
+ $space_characters = "\x20\x09\x0A\x0B\x0C\x0D";
+ $string_length = strlen($string);
+
+ $position = strspn($string, $space_characters);
+ $tokens = array();
+
+ while ($position < $string_length)
+ {
+ $len = strcspn($string, $space_characters, $position);
+ $tokens[] = substr($string, $position, $len);
+ $position += $len;
+ $position += strspn($string, $space_characters, $position);
+ }
+
+ return $tokens;
+ }
+
+ function array_unique($array)
+ {
+ if (version_compare(PHP_VERSION, '5.2', '>='))
+ {
+ return array_unique($array);
+ }
+ else
+ {
+ $array = (array) $array;
+ $new_array = array();
+ $new_array_strings = array();
+ foreach ($array as $key => $value)
+ {
+ if (is_object($value))
+ {
+ if (method_exists($value, '__toString'))
+ {
+ $cmp = $value->__toString();
+ }
+ else
+ {
+ trigger_error('Object of class ' . get_class($value) . ' could not be converted to string', E_USER_ERROR);
+ }
+ }
+ elseif (is_array($value))
+ {
+ $cmp = (string) reset($value);
+ }
+ else
+ {
+ $cmp = (string) $value;
+ }
+ if (!in_array($cmp, $new_array_strings))
+ {
+ $new_array[$key] = $value;
+ $new_array_strings[] = $cmp;
+ }
+ }
+ return $new_array;
+ }
+ }
+
+ /**
+ * Converts a unicode codepoint to a UTF-8 character
+ *
+ * @static
+ * @access public
+ * @param int $codepoint Unicode codepoint
+ * @return string UTF-8 character
+ */
+ function codepoint_to_utf8($codepoint)
+ {
+ static $cache = array();
+ $codepoint = (int) $codepoint;
+ if (isset($cache[$codepoint]))
+ {
+ return $cache[$codepoint];
+ }
+ elseif ($codepoint < 0)
+ {
+ return $cache[$codepoint] = false;
+ }
+ else if ($codepoint <= 0x7f)
+ {
+ return $cache[$codepoint] = chr($codepoint);
+ }
+ else if ($codepoint <= 0x7ff)
+ {
+ return $cache[$codepoint] = chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f));
+ }
+ else if ($codepoint <= 0xffff)
+ {
+ return $cache[$codepoint] = chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
+ }
+ else if ($codepoint <= 0x10ffff)
+ {
+ return $cache[$codepoint] = chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
+ }
+ else
+ {
+ // U+FFFD REPLACEMENT CHARACTER
+ return $cache[$codepoint] = "\xEF\xBF\xBD";
+ }
+ }
+
+ /**
+ * Re-implementation of PHP 5's stripos()
+ *
+ * Returns the numeric position of the first occurrence of needle in the
+ * haystack string.
+ *
+ * @static
+ * @access string
+ * @param object $haystack
+ * @param string $needle Note that the needle may be a string of one or more
+ * characters. If needle is not a string, it is converted to an integer
+ * and applied as the ordinal value of a character.
+ * @param int $offset The optional offset parameter allows you to specify which
+ * character in haystack to start searching. The position returned is still
+ * relative to the beginning of haystack.
+ * @return bool If needle is not found, stripos() will return boolean false.
+ */
+ function stripos($haystack, $needle, $offset = 0)
+ {
+ if (function_exists('stripos'))
+ {
+ return stripos($haystack, $needle, $offset);
+ }
+ else
+ {
+ if (is_string($needle))
+ {
+ $needle = strtolower($needle);
+ }
+ elseif (is_int($needle) || is_bool($needle) || is_double($needle))
+ {
+ $needle = strtolower(chr($needle));
+ }
+ else
+ {
+ trigger_error('needle is not a string or an integer', E_USER_WARNING);
+ return false;
+ }
+
+ return strpos(strtolower($haystack), $needle, $offset);
+ }
+ }
+
+ /**
+ * Similar to parse_str()
+ *
+ * Returns an associative array of name/value pairs, where the value is an
+ * array of values that have used the same name
+ *
+ * @static
+ * @access string
+ * @param string $str The input string.
+ * @return array
+ */
+ function parse_str($str)
+ {
+ $return = array();
+ $str = explode('&', $str);
+
+ foreach ($str as $section)
+ {
+ if (strpos($section, '=') !== false)
+ {
+ list($name, $value) = explode('=', $section, 2);
+ $return[urldecode($name)][] = urldecode($value);
+ }
+ else
+ {
+ $return[urldecode($section)][] = null;
+ }
+ }
+
+ return $return;
+ }
+
+ /**
+ * Detect XML encoding, as per XML 1.0 Appendix F.1
+ *
+ * @todo Add support for EBCDIC
+ * @param string $data XML data
+ * @return array Possible encodings
+ */
+ function xml_encoding($data)
+ {
+ // UTF-32 Big Endian BOM
+ if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
+ {
+ $encoding[] = 'UTF-32BE';
+ }
+ // UTF-32 Little Endian BOM
+ elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
+ {
+ $encoding[] = 'UTF-32LE';
+ }
+ // UTF-16 Big Endian BOM
+ elseif (substr($data, 0, 2) === "\xFE\xFF")
+ {
+ $encoding[] = 'UTF-16BE';
+ }
+ // UTF-16 Little Endian BOM
+ elseif (substr($data, 0, 2) === "\xFF\xFE")
+ {
+ $encoding[] = 'UTF-16LE';
+ }
+ // UTF-8 BOM
+ elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
+ {
+ $encoding[] = 'UTF-8';
+ }
+ // UTF-32 Big Endian Without BOM
+ 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")
+ {
+ if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8'));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-32BE';
+ }
+ // UTF-32 Little Endian Without BOM
+ 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")
+ {
+ if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8'));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-32LE';
+ }
+ // UTF-16 Big Endian Without BOM
+ elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C")
+ {
+ if ($pos = strpos($data, "\x00\x3F\x00\x3E"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8'));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-16BE';
+ }
+ // UTF-16 Little Endian Without BOM
+ elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00")
+ {
+ if ($pos = strpos($data, "\x3F\x00\x3E\x00"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8'));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-16LE';
+ }
+ // US-ASCII (or superset)
+ elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C")
+ {
+ if ($pos = strpos($data, "\x3F\x3E"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-8';
+ }
+ // Fallback to UTF-8
+ else
+ {
+ $encoding[] = 'UTF-8';
+ }
+ return $encoding;
+ }
+}
+
+/**
+ * Decode HTML Entities
+ *
+ * This implements HTML5 as of revision 967 (2007-06-28)
+ *
+ * @package SimplePie
+ */
+class SimplePie_Decode_HTML_Entities
+{
+ /**
+ * Data to be parsed
+ *
+ * @access private
+ * @var string
+ */
+ var $data = '';
+
+ /**
+ * Currently consumed bytes
+ *
+ * @access private
+ * @var string
+ */
+ var $consumed = '';
+
+ /**
+ * Position of the current byte being parsed
+ *
+ * @access private
+ * @var int
+ */
+ var $position = 0;
+
+ /**
+ * Create an instance of the class with the input data
+ *
+ * @access public
+ * @param string $data Input data
+ */
+ function SimplePie_Decode_HTML_Entities($data)
+ {
+ $this->data = $data;
+ }
+
+ /**
+ * Parse the input data
+ *
+ * @access public
+ * @return string Output data
+ */
+ function parse()
+ {
+ while (($this->position = strpos($this->data, '&', $this->position)) !== false)
+ {
+ $this->consume();
+ $this->entity();
+ $this->consumed = '';
+ }
+ return $this->data;
+ }
+
+ /**
+ * Consume the next byte
+ *
+ * @access private
+ * @return mixed The next byte, or false, if there is no more data
+ */
+ function consume()
+ {
+ if (isset($this->data[$this->position]))
+ {
+ $this->consumed .= $this->data[$this->position];
+ return $this->data[$this->position++];
+ }
+ else
+ {
+ $this->consumed = false;
+ return false;
+ }
+ }
+
+ /**
+ * Consume a range of characters
+ *
+ * @access private
+ * @param string $chars Characters to consume
+ * @return mixed A series of characters that match the range, or false
+ */
+ function consume_range($chars)
+ {
+ if ($len = strspn($this->data, $chars, $this->position))
+ {
+ $data = substr($this->data, $this->position, $len);
+ $this->consumed .= $data;
+ $this->position += $len;
+ return $data;
+ }
+ else
+ {
+ $this->consumed = false;
+ return false;
+ }
+ }
+
+ /**
+ * Unconsume one byte
+ *
+ * @access private
+ */
+ function unconsume()
+ {
+ $this->consumed = substr($this->consumed, 0, -1);
+ $this->position--;
+ }
+
+ /**
+ * Decode an entity
+ *
+ * @access private
+ */
+ function entity()
+ {
+ switch ($this->consume())
+ {
+ case "\x09":
+ case "\x0A":
+ case "\x0B":
+ case "\x0B":
+ case "\x0C":
+ case "\x20":
+ case "\x3C":
+ case "\x26":
+ case false:
+ break;
+
+ case "\x23":
+ switch ($this->consume())
+ {
+ case "\x78":
+ case "\x58":
+ $range = '0123456789ABCDEFabcdef';
+ $hex = true;
+ break;
+
+ default:
+ $range = '0123456789';
+ $hex = false;
+ $this->unconsume();
+ break;
+ }
+
+ if ($codepoint = $this->consume_range($range))
+ {
+ 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");
+
+ if ($hex)
+ {
+ $codepoint = hexdec($codepoint);
+ }
+ else
+ {
+ $codepoint = intval($codepoint);
+ }
+
+ if (isset($windows_1252_specials[$codepoint]))
+ {
+ $replacement = $windows_1252_specials[$codepoint];
+ }
+ else
+ {
+ $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint);
+ }
+
+ if ($this->consume() != ';')
+ {
+ $this->unconsume();
+ }
+
+ $consumed_length = strlen($this->consumed);
+ $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length);
+ $this->position += strlen($replacement) - $consumed_length;
+ }
+ break;
+
+ default:
+ 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");
+
+ for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++)
+ {
+ $consumed = substr($this->consumed, 1);
+ if (isset($entities[$consumed]))
+ {
+ $match = $consumed;
+ }
+ }
+
+ if ($match !== null)
+ {
+ $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1);
+ $this->position += strlen($entities[$match]) - strlen($consumed) - 1;
+ }
+ break;
+ }
+ }
+}
+
+/**
+ * Date Parser
+ *
+ * @package SimplePie
+ */
+class SimplePie_Parse_Date
+{
+ /**
+ * Input data
+ *
+ * @access protected
+ * @var string
+ */
+ var $date;
+
+ /**
+ * List of days, calendar day name => ordinal day number in the week
+ *
+ * @access protected
+ * @var array
+ */
+ var $day = array(
+ // English
+ 'mon' => 1,
+ 'monday' => 1,
+ 'tue' => 2,
+ 'tuesday' => 2,
+ 'wed' => 3,
+ 'wednesday' => 3,
+ 'thu' => 4,
+ 'thursday' => 4,
+ 'fri' => 5,
+ 'friday' => 5,
+ 'sat' => 6,
+ 'saturday' => 6,
+ 'sun' => 7,
+ 'sunday' => 7,
+ // Dutch
+ 'maandag' => 1,
+ 'dinsdag' => 2,
+ 'woensdag' => 3,
+ 'donderdag' => 4,
+ 'vrijdag' => 5,
+ 'zaterdag' => 6,
+ 'zondag' => 7,
+ // French
+ 'lundi' => 1,
+ 'mardi' => 2,
+ 'mercredi' => 3,
+ 'jeudi' => 4,
+ 'vendredi' => 5,
+ 'samedi' => 6,
+ 'dimanche' => 7,
+ // German
+ 'montag' => 1,
+ 'dienstag' => 2,
+ 'mittwoch' => 3,
+ 'donnerstag' => 4,
+ 'freitag' => 5,
+ 'samstag' => 6,
+ 'sonnabend' => 6,
+ 'sonntag' => 7,
+ // Italian
+ 'lunedì' => 1,
+ 'martedì' => 2,
+ 'mercoledì' => 3,
+ 'giovedì' => 4,
+ 'venerdì' => 5,
+ 'sabato' => 6,
+ 'domenica' => 7,
+ // Spanish
+ 'lunes' => 1,
+ 'martes' => 2,
+ 'miércoles' => 3,
+ 'jueves' => 4,
+ 'viernes' => 5,
+ 'sábado' => 6,
+ 'domingo' => 7,
+ // Finnish
+ 'maanantai' => 1,
+ 'tiistai' => 2,
+ 'keskiviikko' => 3,
+ 'torstai' => 4,
+ 'perjantai' => 5,
+ 'lauantai' => 6,
+ 'sunnuntai' => 7,
+ // Hungarian
+ 'hétfő' => 1,
+ 'kedd' => 2,
+ 'szerda' => 3,
+ 'csütörtok' => 4,
+ 'péntek' => 5,
+ 'szombat' => 6,
+ 'vasárnap' => 7,
+ // Greek
+ 'Δευ' => 1,
+ 'Τρι' => 2,
+ 'Τετ' => 3,
+ 'Πεμ' => 4,
+ 'Παρ' => 5,
+ 'Σαβ' => 6,
+ 'Κυρ' => 7,
+ );
+
+ /**
+ * List of months, calendar month name => calendar month number
+ *
+ * @access protected
+ * @var array
+ */
+ var $month = array(
+ // English
+ 'jan' => 1,
+ 'january' => 1,
+ 'feb' => 2,
+ 'february' => 2,
+ 'mar' => 3,
+ 'march' => 3,
+ 'apr' => 4,
+ 'april' => 4,
+ 'may' => 5,
+ // No long form of May
+ 'jun' => 6,
+ 'june' => 6,
+ 'jul' => 7,
+ 'july' => 7,
+ 'aug' => 8,
+ 'august' => 8,
+ 'sep' => 9,
+ 'september' => 8,
+ 'oct' => 10,
+ 'october' => 10,
+ 'nov' => 11,
+ 'november' => 11,
+ 'dec' => 12,
+ 'december' => 12,
+ // Dutch
+ 'januari' => 1,
+ 'februari' => 2,
+ 'maart' => 3,
+ 'april' => 4,
+ 'mei' => 5,
+ 'juni' => 6,
+ 'juli' => 7,
+ 'augustus' => 8,
+ 'september' => 9,
+ 'oktober' => 10,
+ 'november' => 11,
+ 'december' => 12,
+ // French
+ 'janvier' => 1,
+ 'février' => 2,
+ 'mars' => 3,
+ 'avril' => 4,
+ 'mai' => 5,
+ 'juin' => 6,
+ 'juillet' => 7,
+ 'août' => 8,
+ 'septembre' => 9,
+ 'octobre' => 10,
+ 'novembre' => 11,
+ 'décembre' => 12,
+ // German
+ 'januar' => 1,
+ 'februar' => 2,
+ 'märz' => 3,
+ 'april' => 4,
+ 'mai' => 5,
+ 'juni' => 6,
+ 'juli' => 7,
+ 'august' => 8,
+ 'september' => 9,
+ 'oktober' => 10,
+ 'november' => 11,
+ 'dezember' => 12,
+ // Italian
+ 'gennaio' => 1,
+ 'febbraio' => 2,
+ 'marzo' => 3,
+ 'aprile' => 4,
+ 'maggio' => 5,
+ 'giugno' => 6,
+ 'luglio' => 7,
+ 'agosto' => 8,
+ 'settembre' => 9,
+ 'ottobre' => 10,
+ 'novembre' => 11,
+ 'dicembre' => 12,
+ // Spanish
+ 'enero' => 1,
+ 'febrero' => 2,
+ 'marzo' => 3,
+ 'abril' => 4,
+ 'mayo' => 5,
+ 'junio' => 6,
+ 'julio' => 7,
+ 'agosto' => 8,
+ 'septiembre' => 9,
+ 'setiembre' => 9,
+ 'octubre' => 10,
+ 'noviembre' => 11,
+ 'diciembre' => 12,
+ // Finnish
+ 'tammikuu' => 1,
+ 'helmikuu' => 2,
+ 'maaliskuu' => 3,
+ 'huhtikuu' => 4,
+ 'toukokuu' => 5,
+ 'kesäkuu' => 6,
+ 'heinäkuu' => 7,
+ 'elokuu' => 8,
+ 'suuskuu' => 9,
+ 'lokakuu' => 10,
+ 'marras' => 11,
+ 'joulukuu' => 12,
+ // Hungarian
+ 'január' => 1,
+ 'február' => 2,
+ 'március' => 3,
+ 'április' => 4,
+ 'május' => 5,
+ 'június' => 6,
+ 'július' => 7,
+ 'augusztus' => 8,
+ 'szeptember' => 9,
+ 'október' => 10,
+ 'november' => 11,
+ 'december' => 12,
+ // Greek
+ 'Ιαν' => 1,
+ 'Φεβ' => 2,
+ 'Μάώ' => 3,
+ 'Μαώ' => 3,
+ 'Απρ' => 4,
+ 'Μάι' => 5,
+ 'Μαϊ' => 5,
+ 'Μαι' => 5,
+ 'Ιούν' => 6,
+ 'Ιον' => 6,
+ 'Ιούλ' => 7,
+ 'Ιολ' => 7,
+ 'Αύγ' => 8,
+ 'Αυγ' => 8,
+ 'Σεπ' => 9,
+ 'Οκτ' => 10,
+ 'Νοέ' => 11,
+ 'Δεκ' => 12,
+ );
+
+ /**
+ * List of timezones, abbreviation => offset from UTC
+ *
+ * @access protected
+ * @var array
+ */
+ var $timezone = array(
+ 'ACDT' => 37800,
+ 'ACIT' => 28800,
+ 'ACST' => 34200,
+ 'ACT' => -18000,
+ 'ACWDT' => 35100,
+ 'ACWST' => 31500,
+ 'AEDT' => 39600,
+ 'AEST' => 36000,
+ 'AFT' => 16200,
+ 'AKDT' => -28800,
+ 'AKST' => -32400,
+ 'AMDT' => 18000,
+ 'AMT' => -14400,
+ 'ANAST' => 46800,
+ 'ANAT' => 43200,
+ 'ART' => -10800,
+ 'AZOST' => -3600,
+ 'AZST' => 18000,
+ 'AZT' => 14400,
+ 'BIOT' => 21600,
+ 'BIT' => -43200,
+ 'BOT' => -14400,
+ 'BRST' => -7200,
+ 'BRT' => -10800,
+ 'BST' => 3600,
+ 'BTT' => 21600,
+ 'CAST' => 18000,
+ 'CAT' => 7200,
+ 'CCT' => 23400,
+ 'CDT' => -18000,
+ 'CEDT' => 7200,
+ 'CET' => 3600,
+ 'CGST' => -7200,
+ 'CGT' => -10800,
+ 'CHADT' => 49500,
+ 'CHAST' => 45900,
+ 'CIST' => -28800,
+ 'CKT' => -36000,
+ 'CLDT' => -10800,
+ 'CLST' => -14400,
+ 'COT' => -18000,
+ 'CST' => -21600,
+ 'CVT' => -3600,
+ 'CXT' => 25200,
+ 'DAVT' => 25200,
+ 'DTAT' => 36000,
+ 'EADT' => -18000,
+ 'EAST' => -21600,
+ 'EAT' => 10800,
+ 'ECT' => -18000,
+ 'EDT' => -14400,
+ 'EEST' => 10800,
+ 'EET' => 7200,
+ 'EGT' => -3600,
+ 'EKST' => 21600,
+ 'EST' => -18000,
+ 'FJT' => 43200,
+ 'FKDT' => -10800,
+ 'FKST' => -14400,
+ 'FNT' => -7200,
+ 'GALT' => -21600,
+ 'GEDT' => 14400,
+ 'GEST' => 10800,
+ 'GFT' => -10800,
+ 'GILT' => 43200,
+ 'GIT' => -32400,
+ 'GST' => 14400,
+ 'GST' => -7200,
+ 'GYT' => -14400,
+ 'HAA' => -10800,
+ 'HAC' => -18000,
+ 'HADT' => -32400,
+ 'HAE' => -14400,
+ 'HAP' => -25200,
+ 'HAR' => -21600,
+ 'HAST' => -36000,
+ 'HAT' => -9000,
+ 'HAY' => -28800,
+ 'HKST' => 28800,
+ 'HMT' => 18000,
+ 'HNA' => -14400,
+ 'HNC' => -21600,
+ 'HNE' => -18000,
+ 'HNP' => -28800,
+ 'HNR' => -25200,
+ 'HNT' => -12600,
+ 'HNY' => -32400,
+ 'IRDT' => 16200,
+ 'IRKST' => 32400,
+ 'IRKT' => 28800,
+ 'IRST' => 12600,
+ 'JFDT' => -10800,
+ 'JFST' => -14400,
+ 'JST' => 32400,
+ 'KGST' => 21600,
+ 'KGT' => 18000,
+ 'KOST' => 39600,
+ 'KOVST' => 28800,
+ 'KOVT' => 25200,
+ 'KRAST' => 28800,
+ 'KRAT' => 25200,
+ 'KST' => 32400,
+ 'LHDT' => 39600,
+ 'LHST' => 37800,
+ 'LINT' => 50400,
+ 'LKT' => 21600,
+ 'MAGST' => 43200,
+ 'MAGT' => 39600,
+ 'MAWT' => 21600,
+ 'MDT' => -21600,
+ 'MESZ' => 7200,
+ 'MEZ' => 3600,
+ 'MHT' => 43200,
+ 'MIT' => -34200,
+ 'MNST' => 32400,
+ 'MSDT' => 14400,
+ 'MSST' => 10800,
+ 'MST' => -25200,
+ 'MUT' => 14400,
+ 'MVT' => 18000,
+ 'MYT' => 28800,
+ 'NCT' => 39600,
+ 'NDT' => -9000,
+ 'NFT' => 41400,
+ 'NMIT' => 36000,
+ 'NOVST' => 25200,
+ 'NOVT' => 21600,
+ 'NPT' => 20700,
+ 'NRT' => 43200,
+ 'NST' => -12600,
+ 'NUT' => -39600,
+ 'NZDT' => 46800,
+ 'NZST' => 43200,
+ 'OMSST' => 25200,
+ 'OMST' => 21600,
+ 'PDT' => -25200,
+ 'PET' => -18000,
+ 'PETST' => 46800,
+ 'PETT' => 43200,
+ 'PGT' => 36000,
+ 'PHOT' => 46800,
+ 'PHT' => 28800,
+ 'PKT' => 18000,
+ 'PMDT' => -7200,
+ 'PMST' => -10800,
+ 'PONT' => 39600,
+ 'PST' => -28800,
+ 'PWT' => 32400,
+ 'PYST' => -10800,
+ 'PYT' => -14400,
+ 'RET' => 14400,
+ 'ROTT' => -10800,
+ 'SAMST' => 18000,
+ 'SAMT' => 14400,
+ 'SAST' => 7200,
+ 'SBT' => 39600,
+ 'SCDT' => 46800,
+ 'SCST' => 43200,
+ 'SCT' => 14400,
+ 'SEST' => 3600,
+ 'SGT' => 28800,
+ 'SIT' => 28800,
+ 'SRT' => -10800,
+ 'SST' => -39600,
+ 'SYST' => 10800,
+ 'SYT' => 7200,
+ 'TFT' => 18000,
+ 'THAT' => -36000,
+ 'TJT' => 18000,
+ 'TKT' => -36000,
+ 'TMT' => 18000,
+ 'TOT' => 46800,
+ 'TPT' => 32400,
+ 'TRUT' => 36000,
+ 'TVT' => 43200,
+ 'TWT' => 28800,
+ 'UYST' => -7200,
+ 'UYT' => -10800,
+ 'UZT' => 18000,
+ 'VET' => -14400,
+ 'VLAST' => 39600,
+ 'VLAT' => 36000,
+ 'VOST' => 21600,
+ 'VUT' => 39600,
+ 'WAST' => 7200,
+ 'WAT' => 3600,
+ 'WDT' => 32400,
+ 'WEST' => 3600,
+ 'WFT' => 43200,
+ 'WIB' => 25200,
+ 'WIT' => 32400,
+ 'WITA' => 28800,
+ 'WKST' => 18000,
+ 'WST' => 28800,
+ 'YAKST' => 36000,
+ 'YAKT' => 32400,
+ 'YAPT' => 36000,
+ 'YEKST' => 21600,
+ 'YEKT' => 18000,
+ );
+
+ /**
+ * Cached PCRE for SimplePie_Parse_Date::$day
+ *
+ * @access protected
+ * @var string
+ */
+ var $day_pcre;
+
+ /**
+ * Cached PCRE for SimplePie_Parse_Date::$month
+ *
+ * @access protected
+ * @var string
+ */
+ var $month_pcre;
+
+ /**
+ * Array of user-added callback methods
+ *
+ * @access private
+ * @var array
+ */
+ var $built_in = array();
+
+ /**
+ * Array of user-added callback methods
+ *
+ * @access private
+ * @var array
+ */
+ var $user = array();
+
+ /**
+ * Create new SimplePie_Parse_Date object, and set self::day_pcre,
+ * self::month_pcre, and self::built_in
+ *
+ * @access private
+ */
+ function SimplePie_Parse_Date()
+ {
+ $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')';
+ $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')';
+
+ static $cache;
+ if (!isset($cache[get_class($this)]))
+ {
+ if (extension_loaded('Reflection'))
+ {
+ $class = new ReflectionClass(get_class($this));
+ $methods = $class->getMethods();
+ $all_methods = array();
+ foreach ($methods as $method)
+ {
+ $all_methods[] = $method->getName();
+ }
+ }
+ else
+ {
+ $all_methods = get_class_methods($this);
+ }
+
+ foreach ($all_methods as $method)
+ {
+ if (strtolower(substr($method, 0, 5)) === 'date_')
+ {
+ $cache[get_class($this)][] = $method;
+ }
+ }
+ }
+
+ foreach ($cache[get_class($this)] as $method)
+ {
+ $this->built_in[] = $method;
+ }
+ }
+
+ /**
+ * Get the object
+ *
+ * @access public
+ */
+ function get()
+ {
+ static $object;
+ if (!$object)
+ {
+ $object = new SimplePie_Parse_Date;
+ }
+ return $object;
+ }
+
+ /**
+ * Parse a date
+ *
+ * @final
+ * @access public
+ * @param string $date Date to parse
+ * @return int Timestamp corresponding to date string, or false on failure
+ */
+ function parse($date)
+ {
+ foreach ($this->user as $method)
+ {
+ if (($returned = call_user_func($method, $date)) !== false)
+ {
+ return $returned;
+ }
+ }
+
+ foreach ($this->built_in as $method)
+ {
+ if (($returned = call_user_func(array(&$this, $method), $date)) !== false)
+ {
+ return $returned;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Add a callback method to parse a date
+ *
+ * @final
+ * @access public
+ * @param callback $callback
+ */
+ function add_callback($callback)
+ {
+ if (is_callable($callback))
+ {
+ $this->user[] = $callback;
+ }
+ else
+ {
+ trigger_error('User-supplied function must be a valid callback', E_USER_WARNING);
+ }
+ }
+
+ /**
+ * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as
+ * well as allowing any of upper or lower case "T", horizontal tabs, or
+ * spaces to be used as the time seperator (including more than one))
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_w3cdtf($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $year = '([0-9]{4})';
+ $month = $day = $hour = $minute = $second = '([0-9]{2})';
+ $decimal = '([0-9]*)';
+ $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))';
+ $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/';
+ }
+ if (preg_match($pcre, $date, $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Year
+ 2: Month
+ 3: Day
+ 4: Hour
+ 5: Minute
+ 6: Second
+ 7: Decimal fraction of a second
+ 8: Zulu
+ 9: Timezone ±
+ 10: Timezone hours
+ 11: Timezone minutes
+ */
+
+ // Fill in empty matches
+ for ($i = count($match); $i <= 3; $i++)
+ {
+ $match[$i] = '1';
+ }
+
+ for ($i = count($match); $i <= 7; $i++)
+ {
+ $match[$i] = '0';
+ }
+
+ // Numeric timezone
+ if (isset($match[9]) && $match[9] !== '')
+ {
+ $timezone = $match[10] * 3600;
+ $timezone += $match[11] * 60;
+ if ($match[9] === '-')
+ {
+ $timezone = 0 - $timezone;
+ }
+ }
+ else
+ {
+ $timezone = 0;
+ }
+
+ // Convert the number of seconds to an integer, taking decimals into account
+ $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
+
+ return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Remove RFC822 comments
+ *
+ * @access protected
+ * @param string $data Data to strip comments from
+ * @return string Comment stripped string
+ */
+ function remove_rfc2822_comments($string)
+ {
+ $string = (string) $string;
+ $position = 0;
+ $length = strlen($string);
+ $depth = 0;
+
+ $output = '';
+
+ while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
+ {
+ $output .= substr($string, $position, $pos - $position);
+ $position = $pos + 1;
+ if ($string[$pos - 1] !== '\\')
+ {
+ $depth++;
+ while ($depth && $position < $length)
+ {
+ $position += strcspn($string, '()', $position);
+ if ($string[$position - 1] === '\\')
+ {
+ $position++;
+ continue;
+ }
+ elseif (isset($string[$position]))
+ {
+ switch ($string[$position])
+ {
+ case '(':
+ $depth++;
+ break;
+
+ case ')':
+ $depth--;
+ break;
+ }
+ $position++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ $output .= '(';
+ }
+ }
+ $output .= substr($string, $position);
+
+ return $output;
+ }
+
+ /**
+ * Parse RFC2822's date format
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_rfc2822($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $wsp = '[\x09\x20]';
+ $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)';
+ $optional_fws = $fws . '?';
+ $day_name = $this->day_pcre;
+ $month = $this->month_pcre;
+ $day = '([0-9]{1,2})';
+ $hour = $minute = $second = '([0-9]{2})';
+ $year = '([0-9]{2,4})';
+ $num_zone = '([+\-])([0-9]{2})([0-9]{2})';
+ $character_zone = '([A-Z]{1,5})';
+ $zone = '(?:' . $num_zone . '|' . $character_zone . ')';
+ $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';
+ }
+ if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Day name
+ 2: Day
+ 3: Month
+ 4: Year
+ 5: Hour
+ 6: Minute
+ 7: Second
+ 8: Timezone ±
+ 9: Timezone hours
+ 10: Timezone minutes
+ 11: Alphabetic timezone
+ */
+
+ // Find the month number
+ $month = $this->month[strtolower($match[3])];
+
+ // Numeric timezone
+ if ($match[8] !== '')
+ {
+ $timezone = $match[9] * 3600;
+ $timezone += $match[10] * 60;
+ if ($match[8] === '-')
+ {
+ $timezone = 0 - $timezone;
+ }
+ }
+ // Character timezone
+ elseif (isset($this->timezone[strtoupper($match[11])]))
+ {
+ $timezone = $this->timezone[strtoupper($match[11])];
+ }
+ // Assume everything else to be -0000
+ else
+ {
+ $timezone = 0;
+ }
+
+ // Deal with 2/3 digit years
+ if ($match[4] < 50)
+ {
+ $match[4] += 2000;
+ }
+ elseif ($match[4] < 1000)
+ {
+ $match[4] += 1900;
+ }
+
+ // Second is optional, if it is empty set it to zero
+ if ($match[7] !== '')
+ {
+ $second = $match[7];
+ }
+ else
+ {
+ $second = 0;
+ }
+
+ return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Parse RFC850's date format
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_rfc850($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $space = '[\x09\x20]+';
+ $day_name = $this->day_pcre;
+ $month = $this->month_pcre;
+ $day = '([0-9]{1,2})';
+ $year = $hour = $minute = $second = '([0-9]{2})';
+ $zone = '([A-Z]{1,5})';
+ $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i';
+ }
+ if (preg_match($pcre, $date, $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Day name
+ 2: Day
+ 3: Month
+ 4: Year
+ 5: Hour
+ 6: Minute
+ 7: Second
+ 8: Timezone
+ */
+
+ // Month
+ $month = $this->month[strtolower($match[3])];
+
+ // Character timezone
+ if (isset($this->timezone[strtoupper($match[8])]))
+ {
+ $timezone = $this->timezone[strtoupper($match[8])];
+ }
+ // Assume everything else to be -0000
+ else
+ {
+ $timezone = 0;
+ }
+
+ // Deal with 2 digit year
+ if ($match[4] < 50)
+ {
+ $match[4] += 2000;
+ }
+ else
+ {
+ $match[4] += 1900;
+ }
+
+ return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Parse C99's asctime()'s date format
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_asctime($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $space = '[\x09\x20]+';
+ $wday_name = $this->day_pcre;
+ $mon_name = $this->month_pcre;
+ $day = '([0-9]{1,2})';
+ $hour = $sec = $min = '([0-9]{2})';
+ $year = '([0-9]{4})';
+ $terminator = '\x0A?\x00?';
+ $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';
+ }
+ if (preg_match($pcre, $date, $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Day name
+ 2: Month
+ 3: Day
+ 4: Hour
+ 5: Minute
+ 6: Second
+ 7: Year
+ */
+
+ $month = $this->month[strtolower($match[2])];
+ return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Parse dates using strtotime()
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_strtotime($date)
+ {
+ $strtotime = strtotime($date);
+ if ($strtotime === -1 || $strtotime === false)
+ {
+ return false;
+ }
+ else
+ {
+ return $strtotime;
+ }
+ }
+}
+
+/**
+ * Content-type sniffing
+ *
+ * @package SimplePie
+ */
+class SimplePie_Content_Type_Sniffer
+{
+ /**
+ * File object
+ *
+ * @var SimplePie_File
+ * @access private
+ */
+ var $file;
+
+ /**
+ * Create an instance of the class with the input file
+ *
+ * @access public
+ * @param SimplePie_Content_Type_Sniffer $file Input file
+ */
+ function SimplePie_Content_Type_Sniffer($file)
+ {
+ $this->file = $file;
+ }
+
+ /**
+ * Get the Content-Type of the specified file
+ *
+ * @access public
+ * @return string Actual Content-Type
+ */
+ function get_type()
+ {
+ if (isset($this->file->headers['content-type']))
+ {
+ if (!isset($this->file->headers['content-encoding'])
+ && ($this->file->headers['content-type'] === 'text/plain'
+ || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1'
+ || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1'))
+ {
+ return $this->text_or_binary();
+ }
+
+ if (($pos = strpos($this->file->headers['content-type'], ';')) !== false)
+ {
+ $official = substr($this->file->headers['content-type'], 0, $pos);
+ }
+ else
+ {
+ $official = $this->file->headers['content-type'];
+ }
+ $official = strtolower($official);
+
+ if ($official === 'unknown/unknown'
+ || $official === 'application/unknown')
+ {
+ return $this->unknown();
+ }
+ elseif (substr($official, -4) === '+xml'
+ || $official === 'text/xml'
+ || $official === 'application/xml')
+ {
+ return $official;
+ }
+ elseif (substr($official, 0, 6) === 'image/')
+ {
+ if ($return = $this->image())
+ {
+ return $return;
+ }
+ else
+ {
+ return $official;
+ }
+ }
+ elseif ($official === 'text/html')
+ {
+ return $this->feed_or_html();
+ }
+ else
+ {
+ return $official;
+ }
+ }
+ else
+ {
+ return $this->unknown();
+ }
+ }
+
+ /**
+ * Sniff text or binary
+ *
+ * @access private
+ * @return string Actual Content-Type
+ */
+ function text_or_binary()
+ {
+ if (substr($this->file->body, 0, 2) === "\xFE\xFF"
+ || substr($this->file->body, 0, 2) === "\xFF\xFE"
+ || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF"
+ || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF")
+ {
+ return 'text/plain';
+ }
+ elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body))
+ {
+ return 'application/octect-stream';
+ }
+ else
+ {
+ return 'text/plain';
+ }
+ }
+
+ /**
+ * Sniff unknown
+ *
+ * @access private
+ * @return string Actual Content-Type
+ */
+ function unknown()
+ {
+ $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20");
+ if (strtolower(substr($this->file->body, $ws, 14)) === 'file->body, $ws, 5)) === 'file->body, $ws, 7)) === '';
+ $javascript_outputted = true;
+ }
+ }
+
+ // Odeo Feed MP3's
+ if ($handler == 'odeo')
+ {
+ if ($native)
+ {
+ $embed .= '';
+ }
+ else
+ {
+ $embed .= '';
+ }
+ }
+
+ // Flash
+ elseif ($handler == 'flash')
+ {
+ if ($native)
+ {
+ $embed .= "";
+ }
+ else
+ {
+ $embed .= "";
+ }
+ }
+
+ // Flash Media Player file types.
+ // Preferred handler for MP3 file types.
+ elseif ($handler == 'fmedia' || ($handler == 'mp3' && $mediaplayer != ''))
+ {
+ $height += 20;
+ if ($native)
+ {
+ $embed .= "";
+ }
+ else
+ {
+ $embed .= "";
+ }
+ }
+
+ // QuickTime 7 file types. Need to test with QuickTime 6.
+ // Only handle MP3's if the Flash Media Player is not present.
+ elseif ($handler == 'quicktime' || ($handler == 'mp3' && $mediaplayer == ''))
+ {
+ $height += 16;
+ if ($native)
+ {
+ if ($placeholder != ""){
+ $embed .= "";
+ }
+ else {
+ $embed .= "";
+ }
+ }
+ else
+ {
+ $embed .= "";
+ }
+ }
+
+ // Windows Media
+ elseif ($handler == 'wmedia')
+ {
+ $height += 45;
+ if ($native)
+ {
+ $embed .= "";
+ }
+ else
+ {
+ $embed .= "";
+ }
+ }
+
+ // Everything else
+ else $embed .= '' . $alt . '';
+
+ return $embed;
+ }
+
+ function get_real_type($find_handler = false)
+ {
+ // If it's Odeo, let's get it out of the way.
+ if (substr(strtolower($this->get_link()), 0, 15) == 'http://odeo.com')
+ {
+ return 'odeo';
+ }
+
+ // Mime-types by handler.
+ $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash
+ $types_fmedia = array('video/flv', 'video/x-flv'); // Flash Media Player
+ $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
+ $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
+ $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3
+
+ if ($this->get_type() !== null)
+ {
+ $type = strtolower($this->type);
+ }
+ else
+ {
+ $type = null;
+ }
+
+ // If we encounter an unsupported mime-type, check the file extension and guess intelligently.
+ if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3)))
+ {
+ switch (strtolower($this->get_extension()))
+ {
+ // Audio mime-types
+ case 'aac':
+ case 'adts':
+ $type = 'audio/acc';
+ break;
+
+ case 'aif':
+ case 'aifc':
+ case 'aiff':
+ case 'cdda':
+ $type = 'audio/aiff';
+ break;
+
+ case 'bwf':
+ $type = 'audio/wav';
+ break;
+
+ case 'kar':
+ case 'mid':
+ case 'midi':
+ case 'smf':
+ $type = 'audio/midi';
+ break;
+
+ case 'm4a':
+ $type = 'audio/x-m4a';
+ break;
+
+ case 'mp3':
+ case 'swa':
+ $type = 'audio/mp3';
+ break;
+
+ case 'wav':
+ $type = 'audio/wav';
+ break;
+
+ case 'wax':
+ $type = 'audio/x-ms-wax';
+ break;
+
+ case 'wma':
+ $type = 'audio/x-ms-wma';
+ break;
+
+ // Video mime-types
+ case '3gp':
+ case '3gpp':
+ $type = 'video/3gpp';
+ break;
+
+ case '3g2':
+ case '3gp2':
+ $type = 'video/3gpp2';
+ break;
+
+ case 'asf':
+ $type = 'video/x-ms-asf';
+ break;
+
+ case 'flv':
+ $type = 'video/x-flv';
+ break;
+
+ case 'm1a':
+ case 'm1s':
+ case 'm1v':
+ case 'm15':
+ case 'm75':
+ case 'mp2':
+ case 'mpa':
+ case 'mpeg':
+ case 'mpg':
+ case 'mpm':
+ case 'mpv':
+ $type = 'video/mpeg';
+ break;
+
+ case 'm4v':
+ $type = 'video/x-m4v';
+ break;
+
+ case 'mov':
+ case 'qt':
+ $type = 'video/quicktime';
+ break;
+
+ case 'mp4':
+ case 'mpg4':
+ $type = 'video/mp4';
+ break;
+
+ case 'sdv':
+ $type = 'video/sd-video';
+ break;
+
+ case 'wm':
+ $type = 'video/x-ms-wm';
+ break;
+
+ case 'wmv':
+ $type = 'video/x-ms-wmv';
+ break;
+
+ case 'wvx':
+ $type = 'video/x-ms-wvx';
+ break;
+
+ // Flash mime-types
+ case 'spl':
+ $type = 'application/futuresplash';
+ break;
+
+ case 'swf':
+ $type = 'application/x-shockwave-flash';
+ break;
+ }
+ }
+
+ if ($find_handler)
+ {
+ if (in_array($type, $types_flash))
+ {
+ return 'flash';
+ }
+ elseif (in_array($type, $types_fmedia))
+ {
+ return 'fmedia';
+ }
+ elseif (in_array($type, $types_quicktime))
+ {
+ return 'quicktime';
+ }
+ elseif (in_array($type, $types_wmedia))
+ {
+ return 'wmedia';
+ }
+ elseif (in_array($type, $types_mp3))
+ {
+ return 'mp3';
+ }
+ else
+ {
+ return null;
+ }
+ }
+ else
+ {
+ return $type;
+ }
+ }
+}
+
+class SimplePie_Caption
+{
+ var $type;
+ var $lang;
+ var $startTime;
+ var $endTime;
+ var $text;
+
+ // Constructor, used to input the data
+ function SimplePie_Caption($type = null, $lang = null, $startTime = null, $endTime = null, $text = null)
+ {
+ $this->type = $type;
+ $this->lang = $lang;
+ $this->startTime = $startTime;
+ $this->endTime = $endTime;
+ $this->text = $text;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_endtime()
+ {
+ if ($this->endTime !== null)
+ {
+ return $this->endTime;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_language()
+ {
+ if ($this->lang !== null)
+ {
+ return $this->lang;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_starttime()
+ {
+ if ($this->startTime !== null)
+ {
+ return $this->startTime;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_text()
+ {
+ if ($this->text !== null)
+ {
+ return $this->text;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_type()
+ {
+ if ($this->type !== null)
+ {
+ return $this->type;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Credit
+{
+ var $role;
+ var $scheme;
+ var $name;
+
+ // Constructor, used to input the data
+ function SimplePie_Credit($role = null, $scheme = null, $name = null)
+ {
+ $this->role = $role;
+ $this->scheme = $scheme;
+ $this->name = $name;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_role()
+ {
+ if ($this->role !== null)
+ {
+ return $this->role;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_scheme()
+ {
+ if ($this->scheme !== null)
+ {
+ return $this->scheme;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_name()
+ {
+ if ($this->name !== null)
+ {
+ return $this->name;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Copyright
+{
+ var $url;
+ var $label;
+
+ // Constructor, used to input the data
+ function SimplePie_Copyright($url = null, $label = null)
+ {
+ $this->url = $url;
+ $this->label = $label;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_url()
+ {
+ if ($this->url !== null)
+ {
+ return $this->url;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_attribution()
+ {
+ if ($this->label !== null)
+ {
+ return $this->label;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Rating
+{
+ var $scheme;
+ var $value;
+
+ // Constructor, used to input the data
+ function SimplePie_Rating($scheme = null, $value = null)
+ {
+ $this->scheme = $scheme;
+ $this->value = $value;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_scheme()
+ {
+ if ($this->scheme !== null)
+ {
+ return $this->scheme;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_value()
+ {
+ if ($this->value !== null)
+ {
+ return $this->value;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Restriction
+{
+ var $relationship;
+ var $type;
+ var $value;
+
+ // Constructor, used to input the data
+ function SimplePie_Restriction($relationship = null, $type = null, $value = null)
+ {
+ $this->relationship = $relationship;
+ $this->type = $type;
+ $this->value = $value;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_relationship()
+ {
+ if ($this->relationship !== null)
+ {
+ return $this->relationship;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_type()
+ {
+ if ($this->type !== null)
+ {
+ return $this->type;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_value()
+ {
+ if ($this->value !== null)
+ {
+ return $this->value;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+/**
+ * @todo Move to properly supporting RFC2616 (HTTP/1.1)
+ */
+class SimplePie_File
+{
+ var $url;
+ var $useragent;
+ var $success = true;
+ var $headers = array();
+ var $body;
+ var $status_code;
+ var $redirects = 0;
+ var $error;
+ var $method = SIMPLEPIE_FILE_SOURCE_NONE;
+
+ function SimplePie_File($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
+ {
+ if (class_exists('idna_convert'))
+ {
+ $idn =& new idna_convert;
+ $parsed = SimplePie_Misc::parse_url($url);
+ $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
+ }
+ $this->url = $url;
+ $this->useragent = $useragent;
+ if (preg_match('/^http(s)?:\/\//i', $url))
+ {
+ if ($useragent === null)
+ {
+ $useragent = ini_get('user_agent');
+ $this->useragent = $useragent;
+ }
+ if (!is_array($headers))
+ {
+ $headers = array();
+ }
+ if (!$force_fsockopen && function_exists('curl_exec'))
+ {
+ $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL;
+ $fp = curl_init();
+ $headers2 = array();
+ foreach ($headers as $key => $value)
+ {
+ $headers2[] = "$key: $value";
+ }
+ if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>='))
+ {
+ curl_setopt($fp, CURLOPT_ENCODING, '');
+ }
+ curl_setopt($fp, CURLOPT_URL, $url);
+ curl_setopt($fp, CURLOPT_HEADER, 1);
+ curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
+ curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
+ curl_setopt($fp, CURLOPT_REFERER, $url);
+ curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
+ curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
+ if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>='))
+ {
+ curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
+ curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);
+ }
+
+ $this->headers = curl_exec($fp);
+ if (curl_errno($fp) == 23 || curl_errno($fp) == 61)
+ {
+ curl_setopt($fp, CURLOPT_ENCODING, 'none');
+ $this->headers = curl_exec($fp);
+ }
+ if (curl_errno($fp))
+ {
+ $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);
+ $this->success = false;
+ }
+ else
+ {
+ $info = curl_getinfo($fp);
+ curl_close($fp);
+ $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1);
+ $this->headers = array_pop($this->headers);
+ $parser =& new SimplePie_HTTP_Parser($this->headers);
+ if ($parser->parse())
+ {
+ $this->headers = $parser->headers;
+ $this->body = $parser->body;
+ $this->status_code = $parser->status_code;
+ if (($this->status_code == 300 || $this->status_code == 301 || $this->status_code == 302 || $this->status_code == 303 || $this->status_code == 307 || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
+ {
+ $this->redirects++;
+ $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
+ return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
+ }
+ }
+ }
+ }
+ else
+ {
+ $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
+ $url_parts = parse_url($url);
+ if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) == 'https')
+ {
+ $url_parts['host'] = "ssl://$url_parts[host]";
+ $url_parts['port'] = 443;
+ }
+ if (!isset($url_parts['port']))
+ {
+ $url_parts['port'] = 80;
+ }
+ $fp = @fsockopen($url_parts['host'], $url_parts['port'], $errno, $errstr, $timeout);
+ if (!$fp)
+ {
+ $this->error = 'fsockopen error: ' . $errstr;
+ $this->success = false;
+ }
+ else
+ {
+ stream_set_timeout($fp, $timeout);
+ if (isset($url_parts['path']))
+ {
+ if (isset($url_parts['query']))
+ {
+ $get = "$url_parts[path]?$url_parts[query]";
+ }
+ else
+ {
+ $get = $url_parts['path'];
+ }
+ }
+ else
+ {
+ $get = '/';
+ }
+ $out = "GET $get HTTP/1.0\r\n";
+ $out .= "Host: $url_parts[host]\r\n";
+ $out .= "User-Agent: $useragent\r\n";
+ if (function_exists('gzinflate'))
+ {
+ $out .= "Accept-Encoding: gzip,deflate\r\n";
+ }
+
+ if (isset($url_parts['user']) && isset($url_parts['pass']))
+ {
+ $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n";
+ }
+ foreach ($headers as $key => $value)
+ {
+ $out .= "$key: $value\r\n";
+ }
+ $out .= "Connection: Close\r\n\r\n";
+ fwrite($fp, $out);
+
+ $info = stream_get_meta_data($fp);
+
+ $this->headers = '';
+ while (!$info['eof'] && !$info['timed_out'])
+ {
+ $this->headers .= fread($fp, 1160);
+ $info = stream_get_meta_data($fp);
+ }
+ if (!$info['timed_out'])
+ {
+ $parser =& new SimplePie_HTTP_Parser($this->headers);
+ if ($parser->parse())
+ {
+ $this->headers = $parser->headers;
+ $this->body = $parser->body;
+ $this->status_code = $parser->status_code;
+ if (($this->status_code == 300 || $this->status_code == 301 || $this->status_code == 302 || $this->status_code == 303 || $this->status_code == 307 || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
+ {
+ $this->redirects++;
+ $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
+ return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
+ }
+ if (isset($this->headers['content-encoding']) && ($this->headers['content-encoding'] == 'gzip' || $this->headers['content-encoding'] == 'deflate'))
+ {
+ if (substr($this->body, 0, 8) == "\x1f\x8b\x08\x00\x00\x00\x00\x00")
+ {
+ $this->body = substr($this->body, 10);
+ }
+ $this->body = gzinflate($this->body);
+ }
+ }
+ }
+ else
+ {
+ $this->error = 'fsocket timed out';
+ $this->success = false;
+ }
+ fclose($fp);
+ }
+ }
+ }
+ else
+ {
+ $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS;
+ if (!$this->body = file_get_contents($url))
+ {
+ $this->error = 'file_get_contents could not read the file';
+ $this->success = false;
+ }
+ }
+ }
+}
+
+/**
+ * HTTP Response Parser
+ *
+ * @package SimplePie
+ */
+class SimplePie_HTTP_Parser
+{
+ /**
+ * HTTP Version
+ *
+ * @access public
+ * @var float
+ */
+ var $http_version = 0.0;
+
+ /**
+ * Status code
+ *
+ * @access public
+ * @var int
+ */
+ var $status_code = 0;
+
+ /**
+ * Reason phrase
+ *
+ * @access public
+ * @var string
+ */
+ var $reason = '';
+
+ /**
+ * Key/value pairs of the headers
+ *
+ * @access public
+ * @var array
+ */
+ var $headers = array();
+
+ /**
+ * Body of the response
+ *
+ * @access public
+ * @var string
+ */
+ var $body = '';
+
+ /**
+ * Current state of the state machine
+ *
+ * @access private
+ * @var string
+ */
+ var $state = 'http_version';
+
+ /**
+ * Input data
+ *
+ * @access private
+ * @var string
+ */
+ var $data = '';
+
+ /**
+ * Input data length (to avoid calling strlen() everytime this is needed)
+ *
+ * @access private
+ * @var int
+ */
+ var $data_length = 0;
+
+ /**
+ * Current position of the pointer
+ *
+ * @var int
+ * @access private
+ */
+ var $position = 0;
+
+ /**
+ * Name of the hedaer currently being parsed
+ *
+ * @access private
+ * @var string
+ */
+ var $name = '';
+
+ /**
+ * Value of the hedaer currently being parsed
+ *
+ * @access private
+ * @var string
+ */
+ var $value = '';
+
+ /**
+ * Create an instance of the class with the input data
+ *
+ * @access public
+ * @param string $data Input data
+ */
+ function SimplePie_HTTP_Parser($data)
+ {
+ $this->data = $data;
+ $this->data_length = strlen($this->data);
+ }
+
+ /**
+ * Parse the input data
+ *
+ * @access public
+ * @return bool true on success, false on failure
+ */
+ function parse()
+ {
+ while ($this->state && $this->state !== 'emit' && $this->has_data())
+ {
+ $state = $this->state;
+ $this->$state();
+ }
+ $this->data = '';
+ if ($this->state === 'emit')
+ {
+ return true;
+ }
+ else
+ {
+ $this->http_version = '';
+ $this->status_code = '';
+ $this->reason = '';
+ $this->headers = array();
+ $this->body = '';
+ return false;
+ }
+ }
+
+ /**
+ * Check whether there is data beyond the pointer
+ *
+ * @access private
+ * @return bool true if there is further data, false if not
+ */
+ function has_data()
+ {
+ return (bool) ($this->position < $this->data_length);
+ }
+
+ /**
+ * See if the next character is LWS
+ *
+ * @access private
+ * @return bool true if the next character is LWS, false if not
+ */
+ function is_linear_whitespace()
+ {
+ return (bool) ($this->data[$this->position] === "\x09"
+ || $this->data[$this->position] === "\x20"
+ || ($this->data[$this->position] === "\x0A"
+ && isset($this->data[$this->position + 1])
+ && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20")));
+ }
+
+ /**
+ * Parse the HTTP version
+ *
+ * @access private
+ */
+ function http_version()
+ {
+ if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/')
+ {
+ $len = strspn($this->data, '0123456789.', 5);
+ $this->http_version = substr($this->data, 5, $len);
+ $this->position += 5 + $len;
+ if (substr_count($this->http_version, '.') <= 1)
+ {
+ $this->http_version = (float) $this->http_version;
+ $this->position += strspn($this->data, "\x09\x20", $this->position);
+ $this->state = 'status';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ /**
+ * Parse the status code
+ *
+ * @access private
+ */
+ function status()
+ {
+ if ($len = strspn($this->data, '0123456789', $this->position))
+ {
+ $this->status_code = (int) substr($this->data, $this->position, $len);
+ $this->position += $len;
+ $this->state = 'reason';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ /**
+ * Parse the reason phrase
+ *
+ * @access private
+ */
+ function reason()
+ {
+ $len = strcspn($this->data, "\x0A", $this->position);
+ $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20");
+ $this->position += $len + 1;
+ $this->state = 'new_line';
+ }
+
+ /**
+ * Deal with a new line, shifting data around as needed
+ *
+ * @access private
+ */
+ function new_line()
+ {
+ $this->value = trim($this->value, "\x0D\x20");
+ if ($this->name !== '' && $this->value !== '')
+ {
+ $this->name = strtolower($this->name);
+ if (isset($this->headers[$this->name]))
+ {
+ $this->headers[$this->name] .= ', ' . $this->value;
+ }
+ else
+ {
+ $this->headers[$this->name] = $this->value;
+ }
+ }
+ $this->name = '';
+ $this->value = '';
+ if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A")
+ {
+ $this->position += 2;
+ $this->state = 'body';
+ }
+ elseif ($this->data[$this->position] === "\x0A")
+ {
+ $this->position++;
+ $this->state = 'body';
+ }
+ else
+ {
+ $this->state = 'name';
+ }
+ }
+
+ /**
+ * Parse a header name
+ *
+ * @access private
+ */
+ function name()
+ {
+ $len = strcspn($this->data, "\x0A:", $this->position);
+ if (isset($this->data[$this->position + $len]))
+ {
+ if ($this->data[$this->position + $len] === "\x0A")
+ {
+ $this->position += $len;
+ $this->state = 'new_line';
+ }
+ else
+ {
+ $this->name = substr($this->data, $this->position, $len);
+ $this->position += $len + 1;
+ $this->state = 'value';
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ /**
+ * Parse LWS, replacing consecutive LWS characters with a single space
+ *
+ * @access private
+ */
+ function linear_whitespace()
+ {
+ do
+ {
+ if (substr($this->data, $this->position, 2) === "\x0D\x0A")
+ {
+ $this->position += 2;
+ }
+ elseif ($this->data[$this->position] === "\x0A")
+ {
+ $this->position++;
+ }
+ $this->position += strspn($this->data, "\x09\x20", $this->position);
+ } while ($this->has_data() && $this->is_linear_whitespace());
+ $this->value .= "\x20";
+ }
+
+ /**
+ * See what state to move to while within non-quoted header values
+ *
+ * @access private
+ */
+ function value()
+ {
+ if ($this->is_linear_whitespace())
+ {
+ $this->linear_whitespace();
+ }
+ else
+ {
+ switch ($this->data[$this->position])
+ {
+ case '"':
+ $this->position++;
+ $this->state = 'quote';
+ break;
+
+ case "\x0A":
+ $this->position++;
+ $this->state = 'new_line';
+ break;
+
+ default:
+ $this->state = 'value_char';
+ break;
+ }
+ }
+ }
+
+ /**
+ * Parse a header value while outside quotes
+ *
+ * @access private
+ */
+ function value_char()
+ {
+ $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position);
+ $this->value .= substr($this->data, $this->position, $len);
+ $this->position += $len;
+ $this->state = 'value';
+ }
+
+ /**
+ * See what state to move to while within quoted header values
+ *
+ * @access private
+ */
+ function quote()
+ {
+ if ($this->is_linear_whitespace())
+ {
+ $this->linear_whitespace();
+ }
+ else
+ {
+ switch ($this->data[$this->position])
+ {
+ case '"':
+ $this->position++;
+ $this->state = 'value';
+ break;
+
+ case "\x0A":
+ $this->position++;
+ $this->state = 'new_line';
+ break;
+
+ case '\\':
+ $this->position++;
+ $this->state = 'quote_escaped';
+ break;
+
+ default:
+ $this->state = 'quote_char';
+ break;
+ }
+ }
+ }
+
+ /**
+ * Parse a header value while within quotes
+ *
+ * @access private
+ */
+ function quote_char()
+ {
+ $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position);
+ $this->value .= substr($this->data, $this->position, $len);
+ $this->position += $len;
+ $this->state = 'value';
+ }
+
+ /**
+ * Parse an escaped character within quotes
+ *
+ * @access private
+ */
+ function quote_escaped()
+ {
+ $this->value .= $this->data[$this->position];
+ $this->position++;
+ $this->state = 'quote';
+ }
+
+ /**
+ * Parse the body
+ *
+ * @access private
+ */
+ function body()
+ {
+ $this->body = substr($this->data, $this->position);
+ $this->state = 'emit';
+ }
+}
+
+class SimplePie_Cache
+{
+ /**
+ * Don't call the constructor. Please.
+ *
+ * @access private
+ */
+ function SimplePie_Cache()
+ {
+ trigger_error('Please call SimplePie_Cache::create() instead of the constructor', E_USER_ERROR);
+ }
+
+ /**
+ * Create a new SimplePie_Cache object
+ *
+ * @static
+ * @access public
+ */
+ function create($location, $filename, $extension)
+ {
+ return new SimplePie_Cache_File($location, $filename, $extension);
+ }
+}
+
+class SimplePie_Cache_File
+{
+ var $location;
+ var $filename;
+ var $extension;
+ var $name;
+
+ function SimplePie_Cache_File($location, $filename, $extension)
+ {
+ $this->location = $location;
+ $this->filename = rawurlencode($filename);
+ $this->extension = rawurlencode($extension);
+ $this->name = "$location/$this->filename.$this->extension";
+ }
+
+ function save($data)
+ {
+ if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location))
+ {
+ if (is_a($data, 'SimplePie'))
+ {
+ $data = $data->data;
+ }
+
+ $data = serialize($data);
+
+ if (function_exists('file_put_contents'))
+ {
+ return (bool) file_put_contents($this->name, $data);
+ }
+ else
+ {
+ $fp = fopen($this->name, 'wb');
+ if ($fp)
+ {
+ fwrite($fp, $data);
+ fclose($fp);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ function load()
+ {
+ if (file_exists($this->name) && is_readable($this->name))
+ {
+ return unserialize(file_get_contents($this->name));
+ }
+ return false;
+ }
+
+ function mtime()
+ {
+ if (file_exists($this->name))
+ {
+ return filemtime($this->name);
+ }
+ return false;
+ }
+
+ function touch()
+ {
+ if (file_exists($this->name))
+ {
+ return touch($this->name);
+ }
+ return false;
+ }
+
+ function unlink()
+ {
+ if (file_exists($this->name))
+ {
+ return unlink($this->name);
+ }
+ return false;
+ }
+}
+
+class SimplePie_Misc
+{
+ function time_hms($seconds)
+ {
+ $time = '';
+
+ $hours = floor($seconds / 3600);
+ $remainder = $seconds % 3600;
+ if ($hours > 0)
+ {
+ $time .= $hours.':';
+ }
+
+ $minutes = floor($remainder / 60);
+ $seconds = $remainder % 60;
+ if ($minutes < 10 && $hours > 0)
+ {
+ $minutes = '0' . $minutes;
+ }
+ if ($seconds < 10)
+ {
+ $seconds = '0' . $seconds;
+ }
+
+ $time .= $minutes.':';
+ $time .= $seconds;
+
+ return $time;
+ }
+
+ function absolutize_url($relative, $base)
+ {
+ if ($relative !== '')
+ {
+ $relative = SimplePie_Misc::parse_url($relative);
+ if ($relative['scheme'] !== '')
+ {
+ $target = $relative;
+ }
+ elseif ($base !== '')
+ {
+ $base = SimplePie_Misc::parse_url($base);
+ $target = SimplePie_Misc::parse_url('');
+ if ($relative['authority'] !== '')
+ {
+ $target = $relative;
+ $target['scheme'] = $base['scheme'];
+ }
+ else
+ {
+ $target['scheme'] = $base['scheme'];
+ $target['authority'] = $base['authority'];
+ if ($relative['path'] !== '')
+ {
+ if (strpos($relative['path'], '/') === 0)
+ {
+ $target['path'] = $relative['path'];
+ }
+ elseif ($base['authority'] !== '' && $base['path'] === '')
+ {
+ $target['path'] = '/' . $relative['path'];
+ }
+ elseif (($last_segment = strrpos($base['path'], '/')) !== false)
+ {
+ $target['path'] = substr($base['path'], 0, $last_segment + 1) . $relative['path'];
+ }
+ else
+ {
+ $target['path'] = $relative['path'];
+ }
+ $target['query'] = $relative['query'];
+ }
+ else
+ {
+ $target['path'] = $base['path'];
+ if ($relative['query'] !== '')
+ {
+ $target['query'] = $relative['query'];
+ }
+ elseif ($base['query'] !== '')
+ {
+ $target['query'] = $base['query'];
+ }
+ }
+ }
+ $target['fragment'] = $relative['fragment'];
+ }
+ else
+ {
+ // No base URL, just return the relative URL
+ $target = $relative;
+ }
+ $return = SimplePie_Misc::compress_parse_url($target['scheme'], $target['authority'], $target['path'], $target['query'], $target['fragment']);
+ }
+ else
+ {
+ $return = $base;
+ }
+ $return = SimplePie_Misc::normalize_url($return);
+ return $return;
+ }
+
+ function remove_dot_segments($input)
+ {
+ $output = '';
+ while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input == '.' || $input == '..')
+ {
+ // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise,
+ if (strpos($input, '../') === 0)
+ {
+ $input = substr($input, 3);
+ }
+ elseif (strpos($input, './') === 0)
+ {
+ $input = substr($input, 2);
+ }
+ // 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,
+ elseif (strpos($input, '/./') === 0)
+ {
+ $input = substr_replace($input, '/', 0, 3);
+ }
+ elseif ($input == '/.')
+ {
+ $input = '/';
+ }
+ // 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,
+ elseif (strpos($input, '/../') === 0)
+ {
+ $input = substr_replace($input, '/', 0, 4);
+ $output = substr_replace($output, '', strrpos($output, '/'));
+ }
+ elseif ($input == '/..')
+ {
+ $input = '/';
+ $output = substr_replace($output, '', strrpos($output, '/'));
+ }
+ // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise,
+ elseif ($input == '.' || $input == '..')
+ {
+ $input = '';
+ }
+ // 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
+ elseif (($pos = strpos($input, '/', 1)) !== false)
+ {
+ $output .= substr($input, 0, $pos);
+ $input = substr_replace($input, '', 0, $pos);
+ }
+ else
+ {
+ $output .= $input;
+ $input = '';
+ }
+ }
+ return $output . $input;
+ }
+
+ function get_element($realname, $string)
+ {
+ $return = array();
+ $name = preg_quote($realname, '/');
+ if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE))
+ {
+ for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++)
+ {
+ $return[$i]['tag'] = $realname;
+ $return[$i]['full'] = $matches[$i][0][0];
+ $return[$i]['offset'] = $matches[$i][0][1];
+ if (strlen($matches[$i][3][0]) <= 2)
+ {
+ $return[$i]['self_closing'] = true;
+ }
+ else
+ {
+ $return[$i]['self_closing'] = false;
+ $return[$i]['content'] = $matches[$i][4][0];
+ }
+ $return[$i]['attribs'] = array();
+ 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))
+ {
+ for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++)
+ {
+ if (count($attribs[$j]) == 2)
+ {
+ $attribs[$j][2] = $attribs[$j][1];
+ }
+ $return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j]), 'UTF-8');
+ }
+ }
+ }
+ }
+ return $return;
+ }
+
+ function element_implode($element)
+ {
+ $full = "<$element[tag]";
+ foreach ($element['attribs'] as $key => $value)
+ {
+ $key = strtolower($key);
+ $full .= " $key=\"" . htmlspecialchars($value['data']) . '"';
+ }
+ if ($element['self_closing'])
+ {
+ $full .= ' />';
+ }
+ else
+ {
+ $full .= ">$element[content]$element[tag]>";
+ }
+ return $full;
+ }
+
+ function error($message, $level, $file, $line)
+ {
+ switch ($level)
+ {
+ case E_USER_ERROR:
+ $note = 'PHP Error';
+ break;
+ case E_USER_WARNING:
+ $note = 'PHP Warning';
+ break;
+ case E_USER_NOTICE:
+ $note = 'PHP Notice';
+ break;
+ default:
+ $note = 'Unknown Error';
+ break;
+ }
+ error_log("$note: $message in $file on line $line", 0);
+ return $message;
+ }
+
+ /**
+ * If a file has been cached, retrieve and display it.
+ *
+ * This is most useful for caching images (get_favicon(), etc.),
+ * however it works for all cached files. This WILL NOT display ANY
+ * file/image/page/whatever, but rather only display what has already
+ * been cached by SimplePie.
+ *
+ * @access public
+ * @see SimplePie::get_favicon()
+ * @param str $identifier_url URL that is used to identify the content.
+ * This may or may not be the actual URL of the live content.
+ * @param str $cache_location Location of SimplePie's cache. Defaults
+ * to './cache'.
+ * @param str $cache_extension The file extension that the file was
+ * cached with. Defaults to 'spc'.
+ * @param str $cache_class Name of the cache-handling class being used
+ * in SimplePie. Defaults to 'SimplePie_Cache', and should be left
+ * as-is unless you've overloaded the class.
+ * @param str $cache_name_function Obsolete. Exists for backwards
+ * compatibility reasons only.
+ */
+ function display_cached_file($identifier_url, $cache_location = './cache', $cache_extension = 'spc', $cache_class = 'SimplePie_Cache', $cache_name_function = 'md5')
+ {
+ $cache = call_user_func(array($cache_class, 'create'), $cache_location, $identifier_url, $cache_extension);
+
+ if ($file = $cache->load())
+ {
+ if (isset($file['headers']['content-type']))
+ {
+ header('Content-type:' . $file['headers']['content-type']);
+ }
+ else
+ {
+ header('Content-type: application/octet-stream');
+ }
+ header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
+ echo $file['body'];
+ exit;
+ }
+
+ die('Cached file for ' . $identifier_url . ' cannot be found.');
+ }
+
+ function fix_protocol($url, $http = 1)
+ {
+ $url = SimplePie_Misc::normalize_url($url);
+ $parsed = SimplePie_Misc::parse_url($url);
+ if ($parsed['scheme'] !== '' && $parsed['scheme'] != 'http' && $parsed['scheme'] != 'https')
+ {
+ return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http);
+ }
+
+ if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url))
+ {
+ return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http);
+ }
+
+ if ($http == 2 && $parsed['scheme'] !== '')
+ {
+ return "feed:$url";
+ }
+ elseif ($http == 3 && strtolower($parsed['scheme']) == 'http')
+ {
+ return substr_replace($url, 'podcast', 0, 4);
+ }
+ elseif ($http == 4 && strtolower($parsed['scheme']) == 'http')
+ {
+ return substr_replace($url, 'itpc', 0, 4);
+ }
+ else
+ {
+ return $url;
+ }
+ }
+
+ function parse_url($url)
+ {
+ static $cache = array();
+ if (isset($cache[$url]))
+ {
+ return $cache[$url];
+ }
+ elseif (preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/', $url, $match))
+ {
+ for ($i = count($match); $i <= 9; $i++)
+ {
+ $match[$i] = '';
+ }
+ return $cache[$url] = array('scheme' => $match[2], 'authority' => $match[4], 'path' => $match[5], 'query' => $match[7], 'fragment' => $match[9]);
+ }
+ else
+ {
+ return $cache[$url] = array('scheme' => '', 'authority' => '', 'path' => '', 'query' => '', 'fragment' => '');
+ }
+ }
+
+ function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '')
+ {
+ $return = '';
+ if ($scheme !== '')
+ {
+ $return .= "$scheme:";
+ }
+ if ($authority !== '')
+ {
+ $return .= "//$authority";
+ }
+ if ($path !== '')
+ {
+ $return .= $path;
+ }
+ if ($query !== '')
+ {
+ $return .= "?$query";
+ }
+ if ($fragment !== '')
+ {
+ $return .= "#$fragment";
+ }
+ return $return;
+ }
+
+ function normalize_url($url)
+ {
+ $url = preg_replace_callback('/%([0-9A-Fa-f]{2})/', array('SimplePie_Misc', 'percent_encoding_normalization'), $url);
+ $url = SimplePie_Misc::parse_url($url);
+ $url['scheme'] = strtolower($url['scheme']);
+ if ($url['authority'] !== '')
+ {
+ $url['authority'] = strtolower($url['authority']);
+ $url['path'] = SimplePie_Misc::remove_dot_segments($url['path']);
+ }
+ return SimplePie_Misc::compress_parse_url($url['scheme'], $url['authority'], $url['path'], $url['query'], $url['fragment']);
+ }
+
+ function percent_encoding_normalization($match)
+ {
+ $integer = hexdec($match[1]);
+ if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer == 0x2D || $integer == 0x2E || $integer == 0x5F || $integer == 0x7E)
+ {
+ return chr($integer);
+ }
+ else
+ {
+ return strtoupper($match[0]);
+ }
+ }
+
+ /**
+ * Remove bad UTF-8 bytes
+ *
+ * PCRE Pattern to locate bad bytes in a UTF-8 string comes from W3C
+ * FAQ: Multilingual Forms (modified to include full ASCII range)
+ *
+ * @author Geoffrey Sneddon
+ * @see http://www.w3.org/International/questions/qa-forms-utf-8
+ * @param string $str String to remove bad UTF-8 bytes from
+ * @return string UTF-8 string
+ */
+ function utf8_bad_replace($str)
+ {
+ if (function_exists('iconv') && ($return = @iconv('UTF-8', 'UTF-8//IGNORE', $str)))
+ {
+ return $return;
+ }
+ elseif (function_exists('mb_convert_encoding') && ($return = @mb_convert_encoding($str, 'UTF-8', 'UTF-8')))
+ {
+ return $return;
+ }
+ 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))
+ {
+ return implode("\xEF\xBF\xBD", $matches[0]);
+ }
+ elseif ($str !== '')
+ {
+ return "\xEF\xBF\xBD";
+ }
+ else
+ {
+ return '';
+ }
+ }
+
+ /**
+ * Converts a Windows-1252 encoded string to a UTF-8 encoded string
+ *
+ * @static
+ * @access public
+ * @param string $string Windows-1252 encoded string
+ * @return string UTF-8 encoded string
+ */
+ function windows_1252_to_utf8($string)
+ {
+ 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");
+
+ return strtr($string, $convert_table);
+ }
+
+ function change_encoding($data, $input, $output)
+ {
+ $input = SimplePie_Misc::encoding($input);
+ $output = SimplePie_Misc::encoding($output);
+
+ // We fail to fail on non US-ASCII bytes
+ if ($input === 'US-ASCII')
+ {
+ static $non_ascii_octects = '';
+ if (!$non_ascii_octects)
+ {
+ for ($i = 0x80; $i <= 0xFF; $i++)
+ {
+ $non_ascii_octects .= chr($i);
+ }
+ }
+ $data = substr($data, 0, strcspn($data, $non_ascii_octects));
+ }
+
+ if (function_exists('iconv') && ($return = @iconv($input, $output, $data)))
+ {
+ return $return;
+ }
+ elseif (function_exists('mb_convert_encoding') && ($return = @mb_convert_encoding($data, $output, $input)))
+ {
+ return $return;
+ }
+ elseif ($input == 'windows-1252' && $output == 'UTF-8')
+ {
+ return SimplePie_Misc::windows_1252_to_utf8($data);
+ }
+ elseif ($input == 'UTF-8' && $output == 'windows-1252')
+ {
+ return utf8_decode($data);
+ }
+ return $data;
+ }
+
+ function encoding($encoding)
+ {
+ // Character sets are case-insensitive (though we'll return them in the form given in their registration)
+ switch (strtoupper($encoding))
+ {
+ case 'ANSI_X3.110-1983':
+ case 'CSA_T500-1983':
+ case 'CSISO99NAPLPS':
+ case 'ISO-IR-99':
+ case 'NAPLPS':
+ return 'ANSI_X3.110-1983';
+
+ case 'ARABIC7':
+ case 'ASMO_449':
+ case 'CSISO89ASMO449':
+ case 'ISO-IR-89':
+ case 'ISO_9036':
+ return 'ASMO_449';
+
+ case 'ADOBE-STANDARD-ENCODING':
+ case 'CSADOBESTANDARDENCODING':
+ return 'Adobe-Standard-Encoding';
+
+ case 'ADOBE-SYMBOL-ENCODING':
+ case 'CSHPPSMATH':
+ return 'Adobe-Symbol-Encoding';
+
+ case 'AMI-1251':
+ case 'AMI1251':
+ case 'AMIGA-1251':
+ case 'AMIGA1251':
+ return 'Amiga-1251';
+
+ case 'BOCU-1':
+ case 'CSBOCU-1':
+ return 'BOCU-1';
+
+ case 'BRF':
+ case 'CSBRF':
+ return 'BRF';
+
+ case 'BS_4730':
+ case 'CSISO4UNITEDKINGDOM':
+ case 'GB':
+ case 'ISO-IR-4':
+ case 'ISO646-GB':
+ case 'UK':
+ return 'BS_4730';
+
+ case 'BS_VIEWDATA':
+ case 'CSISO47BSVIEWDATA':
+ case 'ISO-IR-47':
+ return 'BS_viewdata';
+
+ case 'BIG5':
+ case 'CSBIG5':
+ return 'Big5';
+
+ case 'BIG5-HKSCS':
+ return 'Big5-HKSCS';
+
+ case 'CESU-8':
+ case 'CSCESU-8':
+ return 'CESU-8';
+
+ case 'CA':
+ case 'CSA7-1':
+ case 'CSA_Z243.4-1985-1':
+ case 'CSISO121CANADIAN1':
+ case 'ISO-IR-121':
+ case 'ISO646-CA':
+ return 'CSA_Z243.4-1985-1';
+
+ case 'CSA7-2':
+ case 'CSA_Z243.4-1985-2':
+ case 'CSISO122CANADIAN2':
+ case 'ISO-IR-122':
+ case 'ISO646-CA2':
+ return 'CSA_Z243.4-1985-2';
+
+ case 'CSA_Z243.4-1985-GR':
+ case 'CSISO123CSAZ24341985GR':
+ case 'ISO-IR-123':
+ return 'CSA_Z243.4-1985-gr';
+
+ case 'CSISO139CSN369103':
+ case 'CSN_369103':
+ case 'ISO-IR-139':
+ return 'CSN_369103';
+
+ case 'CSDECMCS':
+ case 'DEC':
+ case 'DEC-MCS':
+ return 'DEC-MCS';
+
+ case 'CSISO21GERMAN':
+ case 'DE':
+ case 'DIN_66003':
+ case 'ISO-IR-21':
+ case 'ISO646-DE':
+ return 'DIN_66003';
+
+ case 'CSISO646DANISH':
+ case 'DK':
+ case 'DS2089':
+ case 'DS_2089':
+ case 'ISO646-DK':
+ return 'DS_2089';
+
+ case 'CSIBMEBCDICATDE':
+ case 'EBCDIC-AT-DE':
+ return 'EBCDIC-AT-DE';
+
+ case 'CSEBCDICATDEA':
+ case 'EBCDIC-AT-DE-A':
+ return 'EBCDIC-AT-DE-A';
+
+ case 'CSEBCDICCAFR':
+ case 'EBCDIC-CA-FR':
+ return 'EBCDIC-CA-FR';
+
+ case 'CSEBCDICDKNO':
+ case 'EBCDIC-DK-NO':
+ return 'EBCDIC-DK-NO';
+
+ case 'CSEBCDICDKNOA':
+ case 'EBCDIC-DK-NO-A':
+ return 'EBCDIC-DK-NO-A';
+
+ case 'CSEBCDICES':
+ case 'EBCDIC-ES':
+ return 'EBCDIC-ES';
+
+ case 'CSEBCDICESA':
+ case 'EBCDIC-ES-A':
+ return 'EBCDIC-ES-A';
+
+ case 'CSEBCDICESS':
+ case 'EBCDIC-ES-S':
+ return 'EBCDIC-ES-S';
+
+ case 'CSEBCDICFISE':
+ case 'EBCDIC-FI-SE':
+ return 'EBCDIC-FI-SE';
+
+ case 'CSEBCDICFISEA':
+ case 'EBCDIC-FI-SE-A':
+ return 'EBCDIC-FI-SE-A';
+
+ case 'CSEBCDICFR':
+ case 'EBCDIC-FR':
+ return 'EBCDIC-FR';
+
+ case 'CSEBCDICIT':
+ case 'EBCDIC-IT':
+ return 'EBCDIC-IT';
+
+ case 'CSEBCDICPT':
+ case 'EBCDIC-PT':
+ return 'EBCDIC-PT';
+
+ case 'CSEBCDICUK':
+ case 'EBCDIC-UK':
+ return 'EBCDIC-UK';
+
+ case 'CSEBCDICUS':
+ case 'EBCDIC-US':
+ return 'EBCDIC-US';
+
+ case 'CSISO111ECMACYRILLIC':
+ case 'ECMA-CYRILLIC':
+ case 'ISO-IR-111':
+ case 'KOI8-E':
+ return 'ECMA-cyrillic';
+
+ case 'CSISO17SPANISH':
+ case 'ES':
+ case 'ISO-IR-17':
+ case 'ISO646-ES':
+ return 'ES';
+
+ case 'CSISO85SPANISH2':
+ case 'ES2':
+ case 'ISO-IR-85':
+ case 'ISO646-ES2':
+ return 'ES2';
+
+ case 'CSEUCPKDFMTJAPANESE':
+ case 'EUC-JP':
+ case 'EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE':
+ return 'EUC-JP';
+
+ case 'CSEUCKR':
+ case 'EUC-KR':
+ return 'EUC-KR';
+
+ case 'CSEUCFIXWIDJAPANESE':
+ case 'EXTENDED_UNIX_CODE_FIXED_WIDTH_FOR_JAPANESE':
+ return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
+
+ case 'GB18030':
+ return 'GB18030';
+
+ case 'CSGB2312':
+ case 'GB2312':
+ return 'GB2312';
+
+ case 'CP936':
+ case 'GBK':
+ case 'MS936':
+ case 'WINDOWS-936':
+ return 'GBK';
+
+ case 'CN':
+ case 'CSISO57GB1988':
+ case 'GB_1988-80':
+ case 'ISO-IR-57':
+ case 'ISO646-CN':
+ return 'GB_1988-80';
+
+ case 'CHINESE':
+ case 'CSISO58GB231280':
+ case 'GB_2312-80':
+ case 'ISO-IR-58':
+ return 'GB_2312-80';
+
+ case 'CSISO153GOST1976874':
+ case 'GOST_19768-74':
+ case 'ISO-IR-153':
+ case 'ST_SEV_358-88':
+ return 'GOST_19768-74';
+
+ case 'CSHPDESKTOP':
+ case 'HP-DESKTOP':
+ return 'HP-DeskTop';
+
+ case 'CSHPLEGAL':
+ case 'HP-LEGAL':
+ return 'HP-Legal';
+
+ case 'CSHPMATH8':
+ case 'HP-MATH8':
+ return 'HP-Math8';
+
+ case 'CSHPPIFONT':
+ case 'HP-PI-FONT':
+ return 'HP-Pi-font';
+
+ case 'HZ-GB-2312':
+ return 'HZ-GB-2312';
+
+ case 'CSIBMSYMBOLS':
+ case 'IBM-SYMBOLS':
+ return 'IBM-Symbols';
+
+ case 'CSIBMTHAI':
+ case 'IBM-THAI':
+ return 'IBM-Thai';
+
+ case 'CCSID00858':
+ case 'CP00858':
+ case 'IBM00858':
+ case 'PC-MULTILINGUAL-850+EURO':
+ return 'IBM00858';
+
+ case 'CCSID00924':
+ case 'CP00924':
+ case 'EBCDIC-LATIN9--EURO':
+ case 'IBM00924':
+ return 'IBM00924';
+
+ case 'CCSID01140':
+ case 'CP01140':
+ case 'EBCDIC-US-37+EURO':
+ case 'IBM01140':
+ return 'IBM01140';
+
+ case 'CCSID01141':
+ case 'CP01141':
+ case 'EBCDIC-DE-273+EURO':
+ case 'IBM01141':
+ return 'IBM01141';
+
+ case 'CCSID01142':
+ case 'CP01142':
+ case 'EBCDIC-DK-277+EURO':
+ case 'EBCDIC-NO-277+EURO':
+ case 'IBM01142':
+ return 'IBM01142';
+
+ case 'CCSID01143':
+ case 'CP01143':
+ case 'EBCDIC-FI-278+EURO':
+ case 'EBCDIC-SE-278+EURO':
+ case 'IBM01143':
+ return 'IBM01143';
+
+ case 'CCSID01144':
+ case 'CP01144':
+ case 'EBCDIC-IT-280+EURO':
+ case 'IBM01144':
+ return 'IBM01144';
+
+ case 'CCSID01145':
+ case 'CP01145':
+ case 'EBCDIC-ES-284+EURO':
+ case 'IBM01145':
+ return 'IBM01145';
+
+ case 'CCSID01146':
+ case 'CP01146':
+ case 'EBCDIC-GB-285+EURO':
+ case 'IBM01146':
+ return 'IBM01146';
+
+ case 'CCSID01147':
+ case 'CP01147':
+ case 'EBCDIC-FR-297+EURO':
+ case 'IBM01147':
+ return 'IBM01147';
+
+ case 'CCSID01148':
+ case 'CP01148':
+ case 'EBCDIC-INTERNATIONAL-500+EURO':
+ case 'IBM01148':
+ return 'IBM01148';
+
+ case 'CCSID01149':
+ case 'CP01149':
+ case 'EBCDIC-IS-871+EURO':
+ case 'IBM01149':
+ return 'IBM01149';
+
+ case 'CP037':
+ case 'CSIBM037':
+ case 'EBCDIC-CP-CA':
+ case 'EBCDIC-CP-NL':
+ case 'EBCDIC-CP-US':
+ case 'EBCDIC-CP-WT':
+ case 'IBM037':
+ return 'IBM037';
+
+ case 'CP038':
+ case 'CSIBM038':
+ case 'EBCDIC-INT':
+ case 'IBM038':
+ return 'IBM038';
+
+ case 'CP1026':
+ case 'CSIBM1026':
+ case 'IBM1026':
+ return 'IBM1026';
+
+ case 'IBM-1047':
+ case 'IBM1047':
+ return 'IBM1047';
+
+ case 'CP273':
+ case 'CSIBM273':
+ case 'IBM273':
+ return 'IBM273';
+
+ case 'CP274':
+ case 'CSIBM274':
+ case 'EBCDIC-BE':
+ case 'IBM274':
+ return 'IBM274';
+
+ case 'CP275':
+ case 'CSIBM275':
+ case 'EBCDIC-BR':
+ case 'IBM275':
+ return 'IBM275';
+
+ case 'CSIBM277':
+ case 'EBCDIC-CP-DK':
+ case 'EBCDIC-CP-NO':
+ case 'IBM277':
+ return 'IBM277';
+
+ case 'CP278':
+ case 'CSIBM278':
+ case 'EBCDIC-CP-FI':
+ case 'EBCDIC-CP-SE':
+ case 'IBM278':
+ return 'IBM278';
+
+ case 'CP280':
+ case 'CSIBM280':
+ case 'EBCDIC-CP-IT':
+ case 'IBM280':
+ return 'IBM280';
+
+ case 'CP281':
+ case 'CSIBM281':
+ case 'EBCDIC-JP-E':
+ case 'IBM281':
+ return 'IBM281';
+
+ case 'CP284':
+ case 'CSIBM284':
+ case 'EBCDIC-CP-ES':
+ case 'IBM284':
+ return 'IBM284';
+
+ case 'CP285':
+ case 'CSIBM285':
+ case 'EBCDIC-CP-GB':
+ case 'IBM285':
+ return 'IBM285';
+
+ case 'CP290':
+ case 'CSIBM290':
+ case 'EBCDIC-JP-KANA':
+ case 'IBM290':
+ return 'IBM290';
+
+ case 'CP297':
+ case 'CSIBM297':
+ case 'EBCDIC-CP-FR':
+ case 'IBM297':
+ return 'IBM297';
+
+ case 'CP420':
+ case 'CSIBM420':
+ case 'EBCDIC-CP-AR1':
+ case 'IBM420':
+ return 'IBM420';
+
+ case 'CP423':
+ case 'CSIBM423':
+ case 'EBCDIC-CP-GR':
+ case 'IBM423':
+ return 'IBM423';
+
+ case 'CP424':
+ case 'CSIBM424':
+ case 'EBCDIC-CP-HE':
+ case 'IBM424':
+ return 'IBM424';
+
+ case '437':
+ case 'CP437':
+ case 'CSPC8CODEPAGE437':
+ case 'IBM437':
+ return 'IBM437';
+
+ case 'CP500':
+ case 'CSIBM500':
+ case 'EBCDIC-CP-BE':
+ case 'EBCDIC-CP-CH':
+ case 'IBM500':
+ return 'IBM500';
+
+ case 'CP775':
+ case 'CSPC775BALTIC':
+ case 'IBM775':
+ return 'IBM775';
+
+ case '850':
+ case 'CP850':
+ case 'CSPC850MULTILINGUAL':
+ case 'IBM850':
+ return 'IBM850';
+
+ case '851':
+ case 'CP851':
+ case 'CSIBM851':
+ case 'IBM851':
+ return 'IBM851';
+
+ case '852':
+ case 'CP852':
+ case 'CSPCP852':
+ case 'IBM852':
+ return 'IBM852';
+
+ case '855':
+ case 'CP855':
+ case 'CSIBM855':
+ case 'IBM855':
+ return 'IBM855';
+
+ case '857':
+ case 'CP857':
+ case 'CSIBM857':
+ case 'IBM857':
+ return 'IBM857';
+
+ case '860':
+ case 'CP860':
+ case 'CSIBM860':
+ case 'IBM860':
+ return 'IBM860';
+
+ case '861':
+ case 'CP-IS':
+ case 'CP861':
+ case 'CSIBM861':
+ case 'IBM861':
+ return 'IBM861';
+
+ case '862':
+ case 'CP862':
+ case 'CSPC862LATINHEBREW':
+ case 'IBM862':
+ return 'IBM862';
+
+ case '863':
+ case 'CP863':
+ case 'CSIBM863':
+ case 'IBM863':
+ return 'IBM863';
+
+ case 'CP864':
+ case 'CSIBM864':
+ case 'IBM864':
+ return 'IBM864';
+
+ case '865':
+ case 'CP865':
+ case 'CSIBM865':
+ case 'IBM865':
+ return 'IBM865';
+
+ case '866':
+ case 'CP866':
+ case 'CSIBM866':
+ case 'IBM866':
+ return 'IBM866';
+
+ case 'CP-AR':
+ case 'CP868':
+ case 'CSIBM868':
+ case 'IBM868':
+ return 'IBM868';
+
+ case '869':
+ case 'CP-GR':
+ case 'CP869':
+ case 'CSIBM869':
+ case 'IBM869':
+ return 'IBM869';
+
+ case 'CP870':
+ case 'CSIBM870':
+ case 'EBCDIC-CP-ROECE':
+ case 'EBCDIC-CP-YU':
+ case 'IBM870':
+ return 'IBM870';
+
+ case 'CP871':
+ case 'CSIBM871':
+ case 'EBCDIC-CP-IS':
+ case 'IBM871':
+ return 'IBM871';
+
+ case 'CP880':
+ case 'CSIBM880':
+ case 'EBCDIC-CYRILLIC':
+ case 'IBM880':
+ return 'IBM880';
+
+ case 'CP891':
+ case 'CSIBM891':
+ case 'IBM891':
+ return 'IBM891';
+
+ case 'CP903':
+ case 'CSIBM903':
+ case 'IBM903':
+ return 'IBM903';
+
+ case '904':
+ case 'CP904':
+ case 'CSIBBM904':
+ case 'IBM904':
+ return 'IBM904';
+
+ case 'CP905':
+ case 'CSIBM905':
+ case 'EBCDIC-CP-TR':
+ case 'IBM905':
+ return 'IBM905';
+
+ case 'CP918':
+ case 'CSIBM918':
+ case 'EBCDIC-CP-AR2':
+ case 'IBM918':
+ return 'IBM918';
+
+ case 'CSISO143IECP271':
+ case 'IEC_P27-1':
+ case 'ISO-IR-143':
+ return 'IEC_P27-1';
+
+ case 'CSISO49INIS':
+ case 'INIS':
+ case 'ISO-IR-49':
+ return 'INIS';
+
+ case 'CSISO50INIS8':
+ case 'INIS-8':
+ case 'ISO-IR-50':
+ return 'INIS-8';
+
+ case 'CSISO51INISCYRILLIC':
+ case 'INIS-CYRILLIC':
+ case 'ISO-IR-51':
+ return 'INIS-cyrillic';
+
+ case 'CSINVARIANT':
+ case 'INVARIANT':
+ return 'INVARIANT';
+
+ case 'ISO-10646-J-1':
+ return 'ISO-10646-J-1';
+
+ case 'CSUNICODE':
+ case 'ISO-10646-UCS-2':
+ return 'ISO-10646-UCS-2';
+
+ case 'CSUCS4':
+ case 'ISO-10646-UCS-4':
+ return 'ISO-10646-UCS-4';
+
+ case 'CSUNICODEASCII':
+ case 'ISO-10646-UCS-BASIC':
+ return 'ISO-10646-UCS-Basic';
+
+ case 'CSISO10646UTF1':
+ case 'ISO-10646-UTF-1':
+ return 'ISO-10646-UTF-1';
+
+ case 'CSUNICODELATIN1':
+ case 'ISO-10646':
+ case 'ISO-10646-UNICODE-LATIN1':
+ return 'ISO-10646-Unicode-Latin1';
+
+ case 'CSISO115481':
+ case 'ISO-11548-1':
+ case 'ISO_11548-1':
+ case 'ISO_TR_11548-1':
+ return 'ISO-11548-1';
+
+ case 'ISO-2022-CN':
+ return 'ISO-2022-CN';
+
+ case 'ISO-2022-CN-EXT':
+ return 'ISO-2022-CN-EXT';
+
+ case 'CSISO2022JP':
+ case 'ISO-2022-JP':
+ return 'ISO-2022-JP';
+
+ case 'CSISO2022JP2':
+ case 'ISO-2022-JP-2':
+ return 'ISO-2022-JP-2';
+
+ case 'CSISO2022KR':
+ case 'ISO-2022-KR':
+ return 'ISO-2022-KR';
+
+ case 'CSWINDOWS30LATIN1':
+ case 'ISO-8859-1-WINDOWS-3.0-LATIN-1':
+ return 'ISO-8859-1-Windows-3.0-Latin-1';
+
+ case 'CSWINDOWS31LATIN1':
+ case 'ISO-8859-1-WINDOWS-3.1-LATIN-1':
+ return 'ISO-8859-1-Windows-3.1-Latin-1';
+
+ case 'CSISOLATIN6':
+ case 'ISO-8859-10':
+ case 'ISO-IR-157':
+ case 'ISO_8859-10:1992':
+ case 'L6':
+ case 'LATIN6':
+ return 'ISO-8859-10';
+
+ case 'ISO-8859-13':
+ return 'ISO-8859-13';
+
+ case 'ISO-8859-14':
+ case 'ISO-CELTIC':
+ case 'ISO-IR-199':
+ case 'ISO_8859-14':
+ case 'ISO_8859-14:1998':
+ case 'L8':
+ case 'LATIN8':
+ return 'ISO-8859-14';
+
+ case 'ISO-8859-15':
+ case 'ISO_8859-15':
+ case 'LATIN-9':
+ return 'ISO-8859-15';
+
+ case 'ISO-8859-16':
+ case 'ISO-IR-226':
+ case 'ISO_8859-16':
+ case 'ISO_8859-16:2001':
+ case 'L10':
+ case 'LATIN10':
+ return 'ISO-8859-16';
+
+ case 'CSISOLATIN2':
+ case 'ISO-8859-2':
+ case 'ISO-IR-101':
+ case 'ISO_8859-2':
+ case 'ISO_8859-2:1987':
+ case 'L2':
+ case 'LATIN2':
+ return 'ISO-8859-2';
+
+ case 'CSWINDOWS31LATIN2':
+ case 'ISO-8859-2-WINDOWS-LATIN-2':
+ return 'ISO-8859-2-Windows-Latin-2';
+
+ case 'CSISOLATIN3':
+ case 'ISO-8859-3':
+ case 'ISO-IR-109':
+ case 'ISO_8859-3':
+ case 'ISO_8859-3:1988':
+ case 'L3':
+ case 'LATIN3':
+ return 'ISO-8859-3';
+
+ case 'CSISOLATIN4':
+ case 'ISO-8859-4':
+ case 'ISO-IR-110':
+ case 'ISO_8859-4':
+ case 'ISO_8859-4:1988':
+ case 'L4':
+ case 'LATIN4':
+ return 'ISO-8859-4';
+
+ case 'CSISOLATINCYRILLIC':
+ case 'CYRILLIC':
+ case 'ISO-8859-5':
+ case 'ISO-IR-144':
+ case 'ISO_8859-5':
+ case 'ISO_8859-5:1988':
+ return 'ISO-8859-5';
+
+ case 'ARABIC':
+ case 'ASMO-708':
+ case 'CSISOLATINARABIC':
+ case 'ECMA-114':
+ case 'ISO-8859-6':
+ case 'ISO-IR-127':
+ case 'ISO_8859-6':
+ case 'ISO_8859-6:1987':
+ return 'ISO-8859-6';
+
+ case 'CSISO88596E':
+ case 'ISO-8859-6-E':
+ case 'ISO_8859-6-E':
+ return 'ISO-8859-6-E';
+
+ case 'CSISO88596I':
+ case 'ISO-8859-6-I':
+ case 'ISO_8859-6-I':
+ return 'ISO-8859-6-I';
+
+ case 'CSISOLATINGREEK':
+ case 'ECMA-118':
+ case 'ELOT_928':
+ case 'GREEK':
+ case 'GREEK8':
+ case 'ISO-8859-7':
+ case 'ISO-IR-126':
+ case 'ISO_8859-7':
+ case 'ISO_8859-7:1987':
+ return 'ISO-8859-7';
+
+ case 'CSISOLATINHEBREW':
+ case 'HEBREW':
+ case 'ISO-8859-8':
+ case 'ISO-IR-138':
+ case 'ISO_8859-8':
+ case 'ISO_8859-8:1988':
+ return 'ISO-8859-8';
+
+ case 'CSISO88598E':
+ case 'ISO-8859-8-E':
+ case 'ISO_8859-8-E':
+ return 'ISO-8859-8-E';
+
+ case 'CSISO88598I':
+ case 'ISO-8859-8-I':
+ case 'ISO_8859-8-I':
+ return 'ISO-8859-8-I';
+
+ case 'CSISOLATIN5':
+ case 'ISO-8859-9':
+ case 'ISO-IR-148':
+ case 'ISO_8859-9':
+ case 'ISO_8859-9:1989':
+ case 'L5':
+ case 'LATIN5':
+ return 'ISO-8859-9';
+
+ case 'CSWINDOWS31LATIN5':
+ case 'ISO-8859-9-WINDOWS-LATIN-5':
+ return 'ISO-8859-9-Windows-Latin-5';
+
+ case 'CSUNICODEIBM1261':
+ case 'ISO-UNICODE-IBM-1261':
+ return 'ISO-Unicode-IBM-1261';
+
+ case 'CSUNICODEIBM1264':
+ case 'ISO-UNICODE-IBM-1264':
+ return 'ISO-Unicode-IBM-1264';
+
+ case 'CSUNICODEIBM1265':
+ case 'ISO-UNICODE-IBM-1265':
+ return 'ISO-Unicode-IBM-1265';
+
+ case 'CSUNICODEIBM1268':
+ case 'ISO-UNICODE-IBM-1268':
+ return 'ISO-Unicode-IBM-1268';
+
+ case 'CSUNICODEIBM1276':
+ case 'ISO-UNICODE-IBM-1276':
+ return 'ISO-Unicode-IBM-1276';
+
+ case 'CSISO10367BOX':
+ case 'ISO-IR-155':
+ case 'ISO_10367-BOX':
+ return 'ISO_10367-box';
+
+ case 'CSISO2033':
+ case 'E13B':
+ case 'ISO-IR-98':
+ case 'ISO_2033-1983':
+ return 'ISO_2033-1983';
+
+ case 'CSISO5427CYRILLIC':
+ case 'ISO-IR-37':
+ case 'ISO_5427':
+ return 'ISO_5427';
+
+ case 'ISO-IR-54':
+ case 'ISO5427CYRILLIC1981':
+ case 'ISO_5427:1981':
+ return 'ISO_5427:1981';
+
+ case 'CSISO5428GREEK':
+ case 'ISO-IR-55':
+ case 'ISO_5428:1980':
+ return 'ISO_5428:1980';
+
+ case 'CSISO646BASIC1983':
+ case 'ISO_646.BASIC:1983':
+ case 'REF':
+ return 'ISO_646.basic:1983';
+
+ case 'CSISO2INTLREFVERSION':
+ case 'IRV':
+ case 'ISO-IR-2':
+ case 'ISO_646.IRV:1983':
+ return 'ISO_646.irv:1983';
+
+ case 'CSISO6937ADD':
+ case 'ISO-IR-152':
+ case 'ISO_6937-2-25':
+ return 'ISO_6937-2-25';
+
+ case 'CSISOTEXTCOMM':
+ case 'ISO-IR-142':
+ case 'ISO_6937-2-ADD':
+ return 'ISO_6937-2-add';
+
+ case 'CSISO8859SUPP':
+ case 'ISO-IR-154':
+ case 'ISO_8859-SUPP':
+ case 'LATIN1-2-5':
+ return 'ISO_8859-supp';
+
+ case 'CSISO15ITALIAN':
+ case 'ISO-IR-15':
+ case 'ISO646-IT':
+ case 'IT':
+ return 'IT';
+
+ case 'CSISO13JISC6220JP':
+ case 'ISO-IR-13':
+ case 'JIS_C6220-1969':
+ case 'JIS_C6220-1969-JP':
+ case 'KATAKANA':
+ case 'X0201-7':
+ return 'JIS_C6220-1969-jp';
+
+ case 'CSISO14JISC6220RO':
+ case 'ISO-IR-14':
+ case 'ISO646-JP':
+ case 'JIS_C6220-1969-RO':
+ case 'JP':
+ return 'JIS_C6220-1969-ro';
+
+ case 'CSISO42JISC62261978':
+ case 'ISO-IR-42':
+ case 'JIS_C6226-1978':
+ return 'JIS_C6226-1978';
+
+ case 'CSISO87JISX0208':
+ case 'ISO-IR-87':
+ case 'JIS_C6226-1983':
+ case 'JIS_X0208-1983':
+ case 'X0208':
+ return 'JIS_C6226-1983';
+
+ case 'CSISO91JISC62291984A':
+ case 'ISO-IR-91':
+ case 'JIS_C6229-1984-A':
+ case 'JP-OCR-A':
+ return 'JIS_C6229-1984-a';
+
+ case 'CSISO92JISC62991984B':
+ case 'ISO-IR-92':
+ case 'ISO646-JP-OCR-B':
+ case 'JIS_C6229-1984-B':
+ case 'JP-OCR-B':
+ return 'JIS_C6229-1984-b';
+
+ case 'CSISO93JIS62291984BADD':
+ case 'ISO-IR-93':
+ case 'JIS_C6229-1984-B-ADD':
+ case 'JP-OCR-B-ADD':
+ return 'JIS_C6229-1984-b-add';
+
+ case 'CSISO94JIS62291984HAND':
+ case 'ISO-IR-94':
+ case 'JIS_C6229-1984-HAND':
+ case 'JP-OCR-HAND':
+ return 'JIS_C6229-1984-hand';
+
+ case 'CSISO95JIS62291984HANDADD':
+ case 'ISO-IR-95':
+ case 'JIS_C6229-1984-HAND-ADD':
+ case 'JP-OCR-HAND-ADD':
+ return 'JIS_C6229-1984-hand-add';
+
+ case 'CSISO96JISC62291984KANA':
+ case 'ISO-IR-96':
+ case 'JIS_C6229-1984-KANA':
+ return 'JIS_C6229-1984-kana';
+
+ case 'CSJISENCODING':
+ case 'JIS_ENCODING':
+ return 'JIS_Encoding';
+
+ case 'CSHALFWIDTHKATAKANA':
+ case 'JIS_X0201':
+ case 'X0201':
+ return 'JIS_X0201';
+
+ case 'CSISO159JISX02121990':
+ case 'ISO-IR-159':
+ case 'JIS_X0212-1990':
+ case 'X0212':
+ return 'JIS_X0212-1990';
+
+ case 'CSISO141JUSIB1002':
+ case 'ISO-IR-141':
+ case 'ISO646-YU':
+ case 'JS':
+ case 'JUS_I.B1.002':
+ case 'YU':
+ return 'JUS_I.B1.002';
+
+ case 'CSISO147MACEDONIAN':
+ case 'ISO-IR-147':
+ case 'JUS_I.B1.003-MAC':
+ case 'MACEDONIAN':
+ return 'JUS_I.B1.003-mac';
+
+ case 'CSISO146SERBIAN':
+ case 'ISO-IR-146':
+ case 'JUS_I.B1.003-SERB':
+ case 'SERBIAN':
+ return 'JUS_I.B1.003-serb';
+
+ case 'KOI7-SWITCHED':
+ return 'KOI7-switched';
+
+ case 'CSKOI8R':
+ case 'KOI8-R':
+ return 'KOI8-R';
+
+ case 'KOI8-U':
+ return 'KOI8-U';
+
+ case 'CSKSC5636':
+ case 'ISO646-KR':
+ case 'KSC5636':
+ return 'KSC5636';
+
+ case 'CSKSC56011987':
+ case 'ISO-IR-149':
+ case 'KOREAN':
+ case 'KSC_5601':
+ case 'KS_C_5601-1987':
+ case 'KS_C_5601-1989':
+ return 'KS_C_5601-1987';
+
+ case 'CSKZ1048':
+ case 'KZ-1048':
+ case 'RK1048':
+ case 'STRK1048-2002':
+ return 'KZ-1048';
+
+ case 'CSISO27LATINGREEK1':
+ case 'ISO-IR-27':
+ case 'LATIN-GREEK-1':
+ return 'Latin-greek-1';
+
+ case 'CSMNEM':
+ case 'MNEM':
+ return 'MNEM';
+
+ case 'CSMNEMONIC':
+ case 'MNEMONIC':
+ return 'MNEMONIC';
+
+ case 'CSISO86HUNGARIAN':
+ case 'HU':
+ case 'ISO-IR-86':
+ case 'ISO646-HU':
+ case 'MSZ_7795.3':
+ return 'MSZ_7795.3';
+
+ case 'CSMICROSOFTPUBLISHING':
+ case 'MICROSOFT-PUBLISHING':
+ return 'Microsoft-Publishing';
+
+ case 'CSNATSDANO':
+ case 'ISO-IR-9-1':
+ case 'NATS-DANO':
+ return 'NATS-DANO';
+
+ case 'CSNATSDANOADD':
+ case 'ISO-IR-9-2':
+ case 'NATS-DANO-ADD':
+ return 'NATS-DANO-ADD';
+
+ case 'CSNATSSEFI':
+ case 'ISO-IR-8-1':
+ case 'NATS-SEFI':
+ return 'NATS-SEFI';
+
+ case 'CSNATSSEFIADD':
+ case 'ISO-IR-8-2':
+ case 'NATS-SEFI-ADD':
+ return 'NATS-SEFI-ADD';
+
+ case 'CSISO151CUBA':
+ case 'CUBA':
+ case 'ISO-IR-151':
+ case 'ISO646-CU':
+ case 'NC_NC00-10:81':
+ return 'NC_NC00-10:81';
+
+ case 'CSISO69FRENCH':
+ case 'FR':
+ case 'ISO-IR-69':
+ case 'ISO646-FR':
+ case 'NF_Z_62-010':
+ return 'NF_Z_62-010';
+
+ case 'CSISO25FRENCH':
+ case 'ISO-IR-25':
+ case 'ISO646-FR1':
+ case 'NF_Z_62-010_(1973)':
+ return 'NF_Z_62-010_(1973)';
+
+ case 'CSISO60DANISHNORWEGIAN':
+ case 'CSISO60NORWEGIAN1':
+ case 'ISO-IR-60':
+ case 'ISO646-NO':
+ case 'NO':
+ case 'NS_4551-1':
+ return 'NS_4551-1';
+
+ case 'CSISO61NORWEGIAN2':
+ case 'ISO-IR-61':
+ case 'ISO646-NO2':
+ case 'NO2':
+ case 'NS_4551-2':
+ return 'NS_4551-2';
+
+ case 'OSD_EBCDIC_DF03_IRV':
+ return 'OSD_EBCDIC_DF03_IRV';
+
+ case 'OSD_EBCDIC_DF04_1':
+ return 'OSD_EBCDIC_DF04_1';
+
+ case 'OSD_EBCDIC_DF04_15':
+ return 'OSD_EBCDIC_DF04_15';
+
+ case 'CSPC8DANISHNORWEGIAN':
+ case 'PC8-DANISH-NORWEGIAN':
+ return 'PC8-Danish-Norwegian';
+
+ case 'CSPC8TURKISH':
+ case 'PC8-TURKISH':
+ return 'PC8-Turkish';
+
+ case 'CSISO16PORTUGUESE':
+ case 'ISO-IR-16':
+ case 'ISO646-PT':
+ case 'PT':
+ return 'PT';
+
+ case 'CSISO84PORTUGUESE2':
+ case 'ISO-IR-84':
+ case 'ISO646-PT2':
+ case 'PT2':
+ return 'PT2';
+
+ case 'CP154':
+ case 'CSPTCP154':
+ case 'CYRILLIC-ASIAN':
+ case 'PT154':
+ case 'PTCP154':
+ return 'PTCP154';
+
+ case 'SCSU':
+ return 'SCSU';
+
+ case 'CSISO10SWEDISH':
+ case 'FI':
+ case 'ISO-IR-10':
+ case 'ISO646-FI':
+ case 'ISO646-SE':
+ case 'SE':
+ case 'SEN_850200_B':
+ return 'SEN_850200_B';
+
+ case 'CSISO11SWEDISHFORNAMES':
+ case 'ISO-IR-11':
+ case 'ISO646-SE2':
+ case 'SE2':
+ case 'SEN_850200_C':
+ return 'SEN_850200_C';
+
+ case 'CSSHIFTJIS':
+ case 'MS_KANJI':
+ case 'SHIFT_JIS':
+ return 'Shift_JIS';
+
+ case 'CSISO128T101G2':
+ case 'ISO-IR-128':
+ case 'T.101-G2':
+ return 'T.101-G2';
+
+ case 'CSISO102T617BIT':
+ case 'ISO-IR-102':
+ case 'T.61-7BIT':
+ return 'T.61-7bit';
+
+ case 'CSISO103T618BIT':
+ case 'ISO-IR-103':
+ case 'T.61':
+ case 'T.61-8BIT':
+ return 'T.61-8bit';
+
+ case 'CSTSCII':
+ case 'TSCII':
+ return 'TSCII';
+
+ case 'CSUNICODE11':
+ case 'UNICODE-1-1':
+ return 'UNICODE-1-1';
+
+ case 'CSUNICODE11UTF7':
+ case 'UNICODE-1-1-UTF-7':
+ return 'UNICODE-1-1-UTF-7';
+
+ case 'CSUNKNOWN8BIT':
+ case 'UNKNOWN-8BIT':
+ return 'UNKNOWN-8BIT';
+
+ case 'ANSI':
+ case 'ANSI_X3.4-1968':
+ case 'ANSI_X3.4-1986':
+ case 'ASCII':
+ case 'CP367':
+ case 'CSASCII':
+ case 'IBM367':
+ case 'ISO-IR-6':
+ case 'ISO646-US':
+ case 'ISO_646.IRV:1991':
+ case 'US':
+ case 'US-ASCII':
+ return 'US-ASCII';
+
+ case 'UTF-16':
+ return 'UTF-16';
+
+ case 'UTF-16BE':
+ return 'UTF-16BE';
+
+ case 'UTF-16LE':
+ return 'UTF-16LE';
+
+ case 'UTF-32':
+ return 'UTF-32';
+
+ case 'UTF-32BE':
+ return 'UTF-32BE';
+
+ case 'UTF-32LE':
+ return 'UTF-32LE';
+
+ case 'UTF-7':
+ return 'UTF-7';
+
+ case 'UTF-8':
+ return 'UTF-8';
+
+ case 'CSVIQR':
+ case 'VIQR':
+ return 'VIQR';
+
+ case 'CSVISCII':
+ case 'VISCII':
+ return 'VISCII';
+
+ case 'CSVENTURAINTERNATIONAL':
+ case 'VENTURA-INTERNATIONAL':
+ return 'Ventura-International';
+
+ case 'CSVENTURAMATH':
+ case 'VENTURA-MATH':
+ return 'Ventura-Math';
+
+ case 'CSVENTURAUS':
+ case 'VENTURA-US':
+ return 'Ventura-US';
+
+ case 'CSWINDOWS31J':
+ case 'WINDOWS-31J':
+ return 'Windows-31J';
+
+ case 'CSDKUS':
+ case 'DK-US':
+ return 'dk-us';
+
+ case 'CSISO150':
+ case 'CSISO150GREEKCCITT':
+ case 'GREEK-CCITT':
+ case 'ISO-IR-150':
+ return 'greek-ccitt';
+
+ case 'CSISO88GREEK7':
+ case 'GREEK7':
+ case 'ISO-IR-88':
+ return 'greek7';
+
+ case 'CSISO18GREEK7OLD':
+ case 'GREEK7-OLD':
+ case 'ISO-IR-18':
+ return 'greek7-old';
+
+ case 'CSHPROMAN8':
+ case 'HP-ROMAN8':
+ case 'R8':
+ case 'ROMAN8':
+ return 'hp-roman8';
+
+ case 'CSISO90':
+ case 'ISO-IR-90':
+ return 'iso-ir-90';
+
+ case 'CSISO19LATINGREEK':
+ case 'ISO-IR-19':
+ case 'LATIN-GREEK':
+ return 'latin-greek';
+
+ case 'CSISO158LAP':
+ case 'ISO-IR-158':
+ case 'LAP':
+ case 'LATIN-LAP':
+ return 'latin-lap';
+
+ case 'CSMACINTOSH':
+ case 'MAC':
+ case 'MACINTOSH':
+ return 'macintosh';
+
+ case 'CSUSDK':
+ case 'US-DK':
+ return 'us-dk';
+
+ case 'CSISO70VIDEOTEXSUPP1':
+ case 'ISO-IR-70':
+ case 'VIDEOTEX-SUPPL':
+ return 'videotex-suppl';
+
+ case 'WINDOWS-1250':
+ return 'windows-1250';
+
+ case 'WINDOWS-1251':
+ return 'windows-1251';
+
+ case 'CP819':
+ case 'CSISOLATIN1':
+ case 'IBM819':
+ case 'ISO-8859-1':
+ case 'ISO-IR-100':
+ case 'ISO_8859-1':
+ case 'ISO_8859-1:1987':
+ case 'L1':
+ case 'LATIN1':
+ case 'WINDOWS-1252':
+ return 'windows-1252';
+
+ case 'WINDOWS-1253':
+ return 'windows-1253';
+
+ case 'WINDOWS-1254':
+ return 'windows-1254';
+
+ case 'WINDOWS-1255':
+ return 'windows-1255';
+
+ case 'WINDOWS-1256':
+ return 'windows-1256';
+
+ case 'WINDOWS-1257':
+ return 'windows-1257';
+
+ case 'WINDOWS-1258':
+ return 'windows-1258';
+
+ default:
+ return $encoding;
+ }
+ }
+
+ function get_curl_version()
+ {
+ if (is_array($curl = curl_version()))
+ {
+ $curl = $curl['version'];
+ }
+ elseif (substr($curl, 0, 5) == 'curl/')
+ {
+ $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5));
+ }
+ elseif (substr($curl, 0, 8) == 'libcurl/')
+ {
+ $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8));
+ }
+ else
+ {
+ $curl = 0;
+ }
+ return $curl;
+ }
+
+ function is_subclass_of($class1, $class2)
+ {
+ if (func_num_args() != 2)
+ {
+ trigger_error('Wrong parameter count for SimplePie_Misc::is_subclass_of()', E_USER_WARNING);
+ }
+ elseif (version_compare(PHP_VERSION, '5.0.3', '>=') || is_object($class1))
+ {
+ return is_subclass_of($class1, $class2);
+ }
+ elseif (is_string($class1) && is_string($class2))
+ {
+ if (class_exists($class1))
+ {
+ if (class_exists($class2))
+ {
+ $class2 = strtolower($class2);
+ while ($class1 = strtolower(get_parent_class($class1)))
+ {
+ if ($class1 == $class2)
+ {
+ return true;
+ }
+ }
+ }
+ }
+ else
+ {
+ trigger_error('Unknown class passed as parameter', E_USER_WARNNG);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Strip HTML comments
+ *
+ * @access public
+ * @param string $data Data to strip comments from
+ * @return string Comment stripped string
+ */
+ function strip_comments($data)
+ {
+ $output = '';
+ while (($start = strpos($data, '', $start)) !== false)
+ {
+ $data = substr_replace($data, '', 0, $end + 3);
+ }
+ else
+ {
+ $data = '';
+ }
+ }
+ return $output . $data;
+ }
+
+ function parse_date($dt)
+ {
+ $parser = SimplePie_Parse_Date::get();
+ return $parser->parse($dt);
+ }
+
+ /**
+ * Decode HTML entities
+ *
+ * @static
+ * @access public
+ * @param string $data Input data
+ * @return string Output data
+ */
+ function entities_decode($data)
+ {
+ $decoder = new SimplePie_Decode_HTML_Entities($data);
+ return $decoder->parse();
+ }
+
+ /**
+ * Remove RFC822 comments
+ *
+ * @access public
+ * @param string $data Data to strip comments from
+ * @return string Comment stripped string
+ */
+ function uncomment_rfc822($string)
+ {
+ $string = (string) $string;
+ $position = 0;
+ $length = strlen($string);
+ $depth = 0;
+
+ $output = '';
+
+ while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
+ {
+ $output .= substr($string, $position, $pos - $position);
+ $position = $pos + 1;
+ if ($string[$pos - 1] !== '\\')
+ {
+ $depth++;
+ while ($depth && $position < $length)
+ {
+ $position += strcspn($string, '()', $position);
+ if ($string[$position - 1] === '\\')
+ {
+ $position++;
+ continue;
+ }
+ elseif (isset($string[$position]))
+ {
+ switch ($string[$position])
+ {
+ case '(':
+ $depth++;
+ break;
+
+ case ')':
+ $depth--;
+ break;
+ }
+ $position++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ $output .= '(';
+ }
+ }
+ $output .= substr($string, $position);
+
+ return $output;
+ }
+
+ function parse_mime($mime)
+ {
+ if (($pos = strpos($mime, ';')) === false)
+ {
+ return trim($mime);
+ }
+ else
+ {
+ return trim(substr($mime, 0, $pos));
+ }
+ }
+
+ function htmlspecialchars_decode($string, $quote_style)
+ {
+ if (function_exists('htmlspecialchars_decode'))
+ {
+ return htmlspecialchars_decode($string, $quote_style);
+ }
+ else
+ {
+ return strtr($string, array_flip(get_html_translation_table(HTML_SPECIALCHARS, $quote_style)));
+ }
+ }
+
+ function atom_03_construct_type($attribs)
+ {
+ if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) == 'base64'))
+ {
+ $mode = SIMPLEPIE_CONSTRUCT_BASE64;
+ }
+ else
+ {
+ $mode = SIMPLEPIE_CONSTRUCT_NONE;
+ }
+ if (isset($attribs['']['type']))
+ {
+ switch (strtolower(trim($attribs['']['type'])))
+ {
+ case 'text':
+ case 'text/plain':
+ return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
+
+ case 'html':
+ case 'text/html':
+ return SIMPLEPIE_CONSTRUCT_HTML | $mode;
+
+ case 'xhtml':
+ case 'application/xhtml+xml':
+ return SIMPLEPIE_CONSTRUCT_XHTML | $mode;
+
+ default:
+ return SIMPLEPIE_CONSTRUCT_NONE | $mode;
+ }
+ }
+ else
+ {
+ return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
+ }
+ }
+
+ function atom_10_construct_type($attribs)
+ {
+ if (isset($attribs['']['type']))
+ {
+ switch (strtolower(trim($attribs['']['type'])))
+ {
+ case 'text':
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+
+ case 'html':
+ return SIMPLEPIE_CONSTRUCT_HTML;
+
+ case 'xhtml':
+ return SIMPLEPIE_CONSTRUCT_XHTML;
+
+ default:
+ return SIMPLEPIE_CONSTRUCT_NONE;
+ }
+ }
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+ }
+
+ function atom_10_content_construct_type($attribs)
+ {
+ if (isset($attribs['']['type']))
+ {
+ $type = strtolower(trim($attribs['']['type']));
+ switch ($type)
+ {
+ case 'text':
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+
+ case 'html':
+ return SIMPLEPIE_CONSTRUCT_HTML;
+
+ case 'xhtml':
+ return SIMPLEPIE_CONSTRUCT_XHTML;
+ }
+ if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) == 'text/')
+ {
+ return SIMPLEPIE_CONSTRUCT_NONE;
+ }
+ else
+ {
+ return SIMPLEPIE_CONSTRUCT_BASE64;
+ }
+ }
+ else
+ {
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+ }
+ }
+
+ function is_isegment_nz_nc($string)
+ {
+ 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);
+ }
+
+ function space_seperated_tokens($string)
+ {
+ $space_characters = "\x20\x09\x0A\x0B\x0C\x0D";
+ $string_length = strlen($string);
+
+ $position = strspn($string, $space_characters);
+ $tokens = array();
+
+ while ($position < $string_length)
+ {
+ $len = strcspn($string, $space_characters, $position);
+ $tokens[] = substr($string, $position, $len);
+ $position += $len;
+ $position += strspn($string, $space_characters, $position);
+ }
+
+ return $tokens;
+ }
+
+ function array_unique($array)
+ {
+ if (version_compare(PHP_VERSION, '5.2', '>='))
+ {
+ return array_unique($array);
+ }
+ else
+ {
+ $array = (array) $array;
+ $new_array = array();
+ $new_array_strings = array();
+ foreach ($array as $key => $value)
+ {
+ if (is_object($value))
+ {
+ if (method_exists($value, '__toString'))
+ {
+ $cmp = $value->__toString();
+ }
+ else
+ {
+ trigger_error('Object of class ' . get_class($value) . ' could not be converted to string', E_USER_ERROR);
+ }
+ }
+ elseif (is_array($value))
+ {
+ $cmp = (string) reset($value);
+ }
+ else
+ {
+ $cmp = (string) $value;
+ }
+ if (!in_array($cmp, $new_array_strings))
+ {
+ $new_array[$key] = $value;
+ $new_array_strings[] = $cmp;
+ }
+ }
+ return $new_array;
+ }
+ }
+
+ /**
+ * Converts a unicode codepoint to a UTF-8 character
+ *
+ * @static
+ * @access public
+ * @param int $codepoint Unicode codepoint
+ * @return string UTF-8 character
+ */
+ function codepoint_to_utf8($codepoint)
+ {
+ static $cache = array();
+ $codepoint = (int) $codepoint;
+ if (isset($cache[$codepoint]))
+ {
+ return $cache[$codepoint];
+ }
+ elseif ($codepoint < 0)
+ {
+ return $cache[$codepoint] = false;
+ }
+ else if ($codepoint <= 0x7f)
+ {
+ return $cache[$codepoint] = chr($codepoint);
+ }
+ else if ($codepoint <= 0x7ff)
+ {
+ return $cache[$codepoint] = chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f));
+ }
+ else if ($codepoint <= 0xffff)
+ {
+ return $cache[$codepoint] = chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
+ }
+ else if ($codepoint <= 0x10ffff)
+ {
+ return $cache[$codepoint] = chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
+ }
+ else
+ {
+ // U+FFFD REPLACEMENT CHARACTER
+ return $cache[$codepoint] = "\xEF\xBF\xBD";
+ }
+ }
+
+ /**
+ * Re-implementation of PHP 5's stripos()
+ *
+ * Returns the numeric position of the first occurrence of needle in the
+ * haystack string.
+ *
+ * @static
+ * @access string
+ * @param object $haystack
+ * @param string $needle Note that the needle may be a string of one or more
+ * characters. If needle is not a string, it is converted to an integer
+ * and applied as the ordinal value of a character.
+ * @param int $offset The optional offset parameter allows you to specify which
+ * character in haystack to start searching. The position returned is still
+ * relative to the beginning of haystack.
+ * @return bool If needle is not found, stripos() will return boolean false.
+ */
+ function stripos($haystack, $needle, $offset = 0)
+ {
+ if (function_exists('stripos'))
+ {
+ return stripos($haystack, $needle, $offset);
+ }
+ else
+ {
+ if (is_string($needle))
+ {
+ $needle = strtolower($needle);
+ }
+ elseif (is_int($needle) || is_bool($needle) || is_double($needle))
+ {
+ $needle = strtolower(chr($needle));
+ }
+ else
+ {
+ trigger_error('needle is not a string or an integer', E_USER_WARNING);
+ return false;
+ }
+
+ return strpos(strtolower($haystack), $needle, $offset);
+ }
+ }
+
+ /**
+ * Similar to parse_str()
+ *
+ * Returns an associative array of name/value pairs, where the value is an
+ * array of values that have used the same name
+ *
+ * @static
+ * @access string
+ * @param string $str The input string.
+ * @return array
+ */
+ function parse_str($str)
+ {
+ $return = array();
+ $str = explode('&', $str);
+
+ foreach ($str as $section)
+ {
+ if (strpos($section, '=') !== false)
+ {
+ list($name, $value) = explode('=', $section, 2);
+ $return[urldecode($name)][] = urldecode($value);
+ }
+ else
+ {
+ $return[urldecode($section)][] = null;
+ }
+ }
+
+ return $return;
+ }
+
+ /**
+ * Detect XML encoding, as per XML 1.0 Appendix F.1
+ *
+ * @todo Add support for EBCDIC
+ * @param string $data XML data
+ * @return array Possible encodings
+ */
+ function xml_encoding($data)
+ {
+ // UTF-32 Big Endian BOM
+ if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
+ {
+ $encoding[] = 'UTF-32BE';
+ }
+ // UTF-32 Little Endian BOM
+ elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
+ {
+ $encoding[] = 'UTF-32LE';
+ }
+ // UTF-16 Big Endian BOM
+ elseif (substr($data, 0, 2) === "\xFE\xFF")
+ {
+ $encoding[] = 'UTF-16BE';
+ }
+ // UTF-16 Little Endian BOM
+ elseif (substr($data, 0, 2) === "\xFF\xFE")
+ {
+ $encoding[] = 'UTF-16LE';
+ }
+ // UTF-8 BOM
+ elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
+ {
+ $encoding[] = 'UTF-8';
+ }
+ // UTF-32 Big Endian Without BOM
+ 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")
+ {
+ if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8'));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-32BE';
+ }
+ // UTF-32 Little Endian Without BOM
+ 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")
+ {
+ if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8'));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-32LE';
+ }
+ // UTF-16 Big Endian Without BOM
+ elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C")
+ {
+ if ($pos = strpos($data, "\x00\x3F\x00\x3E"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8'));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-16BE';
+ }
+ // UTF-16 Little Endian Without BOM
+ elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00")
+ {
+ if ($pos = strpos($data, "\x3F\x00\x3E\x00"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8'));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-16LE';
+ }
+ // US-ASCII (or superset)
+ elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C")
+ {
+ if ($pos = strpos($data, "\x3F\x3E"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-8';
+ }
+ // Fallback to UTF-8
+ else
+ {
+ $encoding[] = 'UTF-8';
+ }
+ return $encoding;
+ }
+}
+
+/**
+ * Decode HTML Entities
+ *
+ * This implements HTML5 as of revision 967 (2007-06-28)
+ *
+ * @package SimplePie
+ */
+class SimplePie_Decode_HTML_Entities
+{
+ /**
+ * Data to be parsed
+ *
+ * @access private
+ * @var string
+ */
+ var $data = '';
+
+ /**
+ * Currently consumed bytes
+ *
+ * @access private
+ * @var string
+ */
+ var $consumed = '';
+
+ /**
+ * Position of the current byte being parsed
+ *
+ * @access private
+ * @var int
+ */
+ var $position = 0;
+
+ /**
+ * Create an instance of the class with the input data
+ *
+ * @access public
+ * @param string $data Input data
+ */
+ function SimplePie_Decode_HTML_Entities($data)
+ {
+ $this->data = $data;
+ }
+
+ /**
+ * Parse the input data
+ *
+ * @access public
+ * @return string Output data
+ */
+ function parse()
+ {
+ while (($this->position = strpos($this->data, '&', $this->position)) !== false)
+ {
+ $this->consume();
+ $this->entity();
+ $this->consumed = '';
+ }
+ return $this->data;
+ }
+
+ /**
+ * Consume the next byte
+ *
+ * @access private
+ * @return mixed The next byte, or false, if there is no more data
+ */
+ function consume()
+ {
+ if (isset($this->data[$this->position]))
+ {
+ $this->consumed .= $this->data[$this->position];
+ return $this->data[$this->position++];
+ }
+ else
+ {
+ $this->consumed = false;
+ return false;
+ }
+ }
+
+ /**
+ * Consume a range of characters
+ *
+ * @access private
+ * @param string $chars Characters to consume
+ * @return mixed A series of characters that match the range, or false
+ */
+ function consume_range($chars)
+ {
+ if ($len = strspn($this->data, $chars, $this->position))
+ {
+ $data = substr($this->data, $this->position, $len);
+ $this->consumed .= $data;
+ $this->position += $len;
+ return $data;
+ }
+ else
+ {
+ $this->consumed = false;
+ return false;
+ }
+ }
+
+ /**
+ * Unconsume one byte
+ *
+ * @access private
+ */
+ function unconsume()
+ {
+ $this->consumed = substr($this->consumed, 0, -1);
+ $this->position--;
+ }
+
+ /**
+ * Decode an entity
+ *
+ * @access private
+ */
+ function entity()
+ {
+ switch ($this->consume())
+ {
+ case "\x09":
+ case "\x0A":
+ case "\x0B":
+ case "\x0B":
+ case "\x0C":
+ case "\x20":
+ case "\x3C":
+ case "\x26":
+ case false:
+ break;
+
+ case "\x23":
+ switch ($this->consume())
+ {
+ case "\x78":
+ case "\x58":
+ $range = '0123456789ABCDEFabcdef';
+ $hex = true;
+ break;
+
+ default:
+ $range = '0123456789';
+ $hex = false;
+ $this->unconsume();
+ break;
+ }
+
+ if ($codepoint = $this->consume_range($range))
+ {
+ 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");
+
+ if ($hex)
+ {
+ $codepoint = hexdec($codepoint);
+ }
+ else
+ {
+ $codepoint = intval($codepoint);
+ }
+
+ if (isset($windows_1252_specials[$codepoint]))
+ {
+ $replacement = $windows_1252_specials[$codepoint];
+ }
+ else
+ {
+ $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint);
+ }
+
+ if ($this->consume() != ';')
+ {
+ $this->unconsume();
+ }
+
+ $consumed_length = strlen($this->consumed);
+ $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length);
+ $this->position += strlen($replacement) - $consumed_length;
+ }
+ break;
+
+ default:
+ 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");
+
+ for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++)
+ {
+ $consumed = substr($this->consumed, 1);
+ if (isset($entities[$consumed]))
+ {
+ $match = $consumed;
+ }
+ }
+
+ if ($match !== null)
+ {
+ $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1);
+ $this->position += strlen($entities[$match]) - strlen($consumed) - 1;
+ }
+ break;
+ }
+ }
+}
+
+/**
+ * Date Parser
+ *
+ * @package SimplePie
+ */
+class SimplePie_Parse_Date
+{
+ /**
+ * Input data
+ *
+ * @access protected
+ * @var string
+ */
+ var $date;
+
+ /**
+ * List of days, calendar day name => ordinal day number in the week
+ *
+ * @access protected
+ * @var array
+ */
+ var $day = array(
+ // English
+ 'mon' => 1,
+ 'monday' => 1,
+ 'tue' => 2,
+ 'tuesday' => 2,
+ 'wed' => 3,
+ 'wednesday' => 3,
+ 'thu' => 4,
+ 'thursday' => 4,
+ 'fri' => 5,
+ 'friday' => 5,
+ 'sat' => 6,
+ 'saturday' => 6,
+ 'sun' => 7,
+ 'sunday' => 7,
+ // Dutch
+ 'maandag' => 1,
+ 'dinsdag' => 2,
+ 'woensdag' => 3,
+ 'donderdag' => 4,
+ 'vrijdag' => 5,
+ 'zaterdag' => 6,
+ 'zondag' => 7,
+ // French
+ 'lundi' => 1,
+ 'mardi' => 2,
+ 'mercredi' => 3,
+ 'jeudi' => 4,
+ 'vendredi' => 5,
+ 'samedi' => 6,
+ 'dimanche' => 7,
+ // German
+ 'montag' => 1,
+ 'dienstag' => 2,
+ 'mittwoch' => 3,
+ 'donnerstag' => 4,
+ 'freitag' => 5,
+ 'samstag' => 6,
+ 'sonnabend' => 6,
+ 'sonntag' => 7,
+ // Italian
+ 'lunedì' => 1,
+ 'martedì' => 2,
+ 'mercoledì' => 3,
+ 'giovedì' => 4,
+ 'venerdì' => 5,
+ 'sabato' => 6,
+ 'domenica' => 7,
+ // Spanish
+ 'lunes' => 1,
+ 'martes' => 2,
+ 'miércoles' => 3,
+ 'jueves' => 4,
+ 'viernes' => 5,
+ 'sábado' => 6,
+ 'domingo' => 7,
+ // Finnish
+ 'maanantai' => 1,
+ 'tiistai' => 2,
+ 'keskiviikko' => 3,
+ 'torstai' => 4,
+ 'perjantai' => 5,
+ 'lauantai' => 6,
+ 'sunnuntai' => 7,
+ // Hungarian
+ 'hétfő' => 1,
+ 'kedd' => 2,
+ 'szerda' => 3,
+ 'csütörtok' => 4,
+ 'péntek' => 5,
+ 'szombat' => 6,
+ 'vasárnap' => 7,
+ // Greek
+ 'Δευ' => 1,
+ 'Τρι' => 2,
+ 'Τετ' => 3,
+ 'Πεμ' => 4,
+ 'Παρ' => 5,
+ 'Σαβ' => 6,
+ 'Κυρ' => 7,
+ );
+
+ /**
+ * List of months, calendar month name => calendar month number
+ *
+ * @access protected
+ * @var array
+ */
+ var $month = array(
+ // English
+ 'jan' => 1,
+ 'january' => 1,
+ 'feb' => 2,
+ 'february' => 2,
+ 'mar' => 3,
+ 'march' => 3,
+ 'apr' => 4,
+ 'april' => 4,
+ 'may' => 5,
+ // No long form of May
+ 'jun' => 6,
+ 'june' => 6,
+ 'jul' => 7,
+ 'july' => 7,
+ 'aug' => 8,
+ 'august' => 8,
+ 'sep' => 9,
+ 'september' => 8,
+ 'oct' => 10,
+ 'october' => 10,
+ 'nov' => 11,
+ 'november' => 11,
+ 'dec' => 12,
+ 'december' => 12,
+ // Dutch
+ 'januari' => 1,
+ 'februari' => 2,
+ 'maart' => 3,
+ 'april' => 4,
+ 'mei' => 5,
+ 'juni' => 6,
+ 'juli' => 7,
+ 'augustus' => 8,
+ 'september' => 9,
+ 'oktober' => 10,
+ 'november' => 11,
+ 'december' => 12,
+ // French
+ 'janvier' => 1,
+ 'février' => 2,
+ 'mars' => 3,
+ 'avril' => 4,
+ 'mai' => 5,
+ 'juin' => 6,
+ 'juillet' => 7,
+ 'août' => 8,
+ 'septembre' => 9,
+ 'octobre' => 10,
+ 'novembre' => 11,
+ 'décembre' => 12,
+ // German
+ 'januar' => 1,
+ 'februar' => 2,
+ 'märz' => 3,
+ 'april' => 4,
+ 'mai' => 5,
+ 'juni' => 6,
+ 'juli' => 7,
+ 'august' => 8,
+ 'september' => 9,
+ 'oktober' => 10,
+ 'november' => 11,
+ 'dezember' => 12,
+ // Italian
+ 'gennaio' => 1,
+ 'febbraio' => 2,
+ 'marzo' => 3,
+ 'aprile' => 4,
+ 'maggio' => 5,
+ 'giugno' => 6,
+ 'luglio' => 7,
+ 'agosto' => 8,
+ 'settembre' => 9,
+ 'ottobre' => 10,
+ 'novembre' => 11,
+ 'dicembre' => 12,
+ // Spanish
+ 'enero' => 1,
+ 'febrero' => 2,
+ 'marzo' => 3,
+ 'abril' => 4,
+ 'mayo' => 5,
+ 'junio' => 6,
+ 'julio' => 7,
+ 'agosto' => 8,
+ 'septiembre' => 9,
+ 'setiembre' => 9,
+ 'octubre' => 10,
+ 'noviembre' => 11,
+ 'diciembre' => 12,
+ // Finnish
+ 'tammikuu' => 1,
+ 'helmikuu' => 2,
+ 'maaliskuu' => 3,
+ 'huhtikuu' => 4,
+ 'toukokuu' => 5,
+ 'kesäkuu' => 6,
+ 'heinäkuu' => 7,
+ 'elokuu' => 8,
+ 'suuskuu' => 9,
+ 'lokakuu' => 10,
+ 'marras' => 11,
+ 'joulukuu' => 12,
+ // Hungarian
+ 'január' => 1,
+ 'február' => 2,
+ 'március' => 3,
+ 'április' => 4,
+ 'május' => 5,
+ 'június' => 6,
+ 'július' => 7,
+ 'augusztus' => 8,
+ 'szeptember' => 9,
+ 'október' => 10,
+ 'november' => 11,
+ 'december' => 12,
+ // Greek
+ 'Ιαν' => 1,
+ 'Φεβ' => 2,
+ 'Μάώ' => 3,
+ 'Μαώ' => 3,
+ 'Απρ' => 4,
+ 'Μάι' => 5,
+ 'Μαϊ' => 5,
+ 'Μαι' => 5,
+ 'Ιούν' => 6,
+ 'Ιον' => 6,
+ 'Ιούλ' => 7,
+ 'Ιολ' => 7,
+ 'Αύγ' => 8,
+ 'Αυγ' => 8,
+ 'Σεπ' => 9,
+ 'Οκτ' => 10,
+ 'Νοέ' => 11,
+ 'Δεκ' => 12,
+ );
+
+ /**
+ * List of timezones, abbreviation => offset from UTC
+ *
+ * @access protected
+ * @var array
+ */
+ var $timezone = array(
+ 'ACDT' => 37800,
+ 'ACIT' => 28800,
+ 'ACST' => 34200,
+ 'ACT' => -18000,
+ 'ACWDT' => 35100,
+ 'ACWST' => 31500,
+ 'AEDT' => 39600,
+ 'AEST' => 36000,
+ 'AFT' => 16200,
+ 'AKDT' => -28800,
+ 'AKST' => -32400,
+ 'AMDT' => 18000,
+ 'AMT' => -14400,
+ 'ANAST' => 46800,
+ 'ANAT' => 43200,
+ 'ART' => -10800,
+ 'AZOST' => -3600,
+ 'AZST' => 18000,
+ 'AZT' => 14400,
+ 'BIOT' => 21600,
+ 'BIT' => -43200,
+ 'BOT' => -14400,
+ 'BRST' => -7200,
+ 'BRT' => -10800,
+ 'BST' => 3600,
+ 'BTT' => 21600,
+ 'CAST' => 18000,
+ 'CAT' => 7200,
+ 'CCT' => 23400,
+ 'CDT' => -18000,
+ 'CEDT' => 7200,
+ 'CET' => 3600,
+ 'CGST' => -7200,
+ 'CGT' => -10800,
+ 'CHADT' => 49500,
+ 'CHAST' => 45900,
+ 'CIST' => -28800,
+ 'CKT' => -36000,
+ 'CLDT' => -10800,
+ 'CLST' => -14400,
+ 'COT' => -18000,
+ 'CST' => -21600,
+ 'CVT' => -3600,
+ 'CXT' => 25200,
+ 'DAVT' => 25200,
+ 'DTAT' => 36000,
+ 'EADT' => -18000,
+ 'EAST' => -21600,
+ 'EAT' => 10800,
+ 'ECT' => -18000,
+ 'EDT' => -14400,
+ 'EEST' => 10800,
+ 'EET' => 7200,
+ 'EGT' => -3600,
+ 'EKST' => 21600,
+ 'EST' => -18000,
+ 'FJT' => 43200,
+ 'FKDT' => -10800,
+ 'FKST' => -14400,
+ 'FNT' => -7200,
+ 'GALT' => -21600,
+ 'GEDT' => 14400,
+ 'GEST' => 10800,
+ 'GFT' => -10800,
+ 'GILT' => 43200,
+ 'GIT' => -32400,
+ 'GST' => 14400,
+ 'GST' => -7200,
+ 'GYT' => -14400,
+ 'HAA' => -10800,
+ 'HAC' => -18000,
+ 'HADT' => -32400,
+ 'HAE' => -14400,
+ 'HAP' => -25200,
+ 'HAR' => -21600,
+ 'HAST' => -36000,
+ 'HAT' => -9000,
+ 'HAY' => -28800,
+ 'HKST' => 28800,
+ 'HMT' => 18000,
+ 'HNA' => -14400,
+ 'HNC' => -21600,
+ 'HNE' => -18000,
+ 'HNP' => -28800,
+ 'HNR' => -25200,
+ 'HNT' => -12600,
+ 'HNY' => -32400,
+ 'IRDT' => 16200,
+ 'IRKST' => 32400,
+ 'IRKT' => 28800,
+ 'IRST' => 12600,
+ 'JFDT' => -10800,
+ 'JFST' => -14400,
+ 'JST' => 32400,
+ 'KGST' => 21600,
+ 'KGT' => 18000,
+ 'KOST' => 39600,
+ 'KOVST' => 28800,
+ 'KOVT' => 25200,
+ 'KRAST' => 28800,
+ 'KRAT' => 25200,
+ 'KST' => 32400,
+ 'LHDT' => 39600,
+ 'LHST' => 37800,
+ 'LINT' => 50400,
+ 'LKT' => 21600,
+ 'MAGST' => 43200,
+ 'MAGT' => 39600,
+ 'MAWT' => 21600,
+ 'MDT' => -21600,
+ 'MESZ' => 7200,
+ 'MEZ' => 3600,
+ 'MHT' => 43200,
+ 'MIT' => -34200,
+ 'MNST' => 32400,
+ 'MSDT' => 14400,
+ 'MSST' => 10800,
+ 'MST' => -25200,
+ 'MUT' => 14400,
+ 'MVT' => 18000,
+ 'MYT' => 28800,
+ 'NCT' => 39600,
+ 'NDT' => -9000,
+ 'NFT' => 41400,
+ 'NMIT' => 36000,
+ 'NOVST' => 25200,
+ 'NOVT' => 21600,
+ 'NPT' => 20700,
+ 'NRT' => 43200,
+ 'NST' => -12600,
+ 'NUT' => -39600,
+ 'NZDT' => 46800,
+ 'NZST' => 43200,
+ 'OMSST' => 25200,
+ 'OMST' => 21600,
+ 'PDT' => -25200,
+ 'PET' => -18000,
+ 'PETST' => 46800,
+ 'PETT' => 43200,
+ 'PGT' => 36000,
+ 'PHOT' => 46800,
+ 'PHT' => 28800,
+ 'PKT' => 18000,
+ 'PMDT' => -7200,
+ 'PMST' => -10800,
+ 'PONT' => 39600,
+ 'PST' => -28800,
+ 'PWT' => 32400,
+ 'PYST' => -10800,
+ 'PYT' => -14400,
+ 'RET' => 14400,
+ 'ROTT' => -10800,
+ 'SAMST' => 18000,
+ 'SAMT' => 14400,
+ 'SAST' => 7200,
+ 'SBT' => 39600,
+ 'SCDT' => 46800,
+ 'SCST' => 43200,
+ 'SCT' => 14400,
+ 'SEST' => 3600,
+ 'SGT' => 28800,
+ 'SIT' => 28800,
+ 'SRT' => -10800,
+ 'SST' => -39600,
+ 'SYST' => 10800,
+ 'SYT' => 7200,
+ 'TFT' => 18000,
+ 'THAT' => -36000,
+ 'TJT' => 18000,
+ 'TKT' => -36000,
+ 'TMT' => 18000,
+ 'TOT' => 46800,
+ 'TPT' => 32400,
+ 'TRUT' => 36000,
+ 'TVT' => 43200,
+ 'TWT' => 28800,
+ 'UYST' => -7200,
+ 'UYT' => -10800,
+ 'UZT' => 18000,
+ 'VET' => -14400,
+ 'VLAST' => 39600,
+ 'VLAT' => 36000,
+ 'VOST' => 21600,
+ 'VUT' => 39600,
+ 'WAST' => 7200,
+ 'WAT' => 3600,
+ 'WDT' => 32400,
+ 'WEST' => 3600,
+ 'WFT' => 43200,
+ 'WIB' => 25200,
+ 'WIT' => 32400,
+ 'WITA' => 28800,
+ 'WKST' => 18000,
+ 'WST' => 28800,
+ 'YAKST' => 36000,
+ 'YAKT' => 32400,
+ 'YAPT' => 36000,
+ 'YEKST' => 21600,
+ 'YEKT' => 18000,
+ );
+
+ /**
+ * Cached PCRE for SimplePie_Parse_Date::$day
+ *
+ * @access protected
+ * @var string
+ */
+ var $day_pcre;
+
+ /**
+ * Cached PCRE for SimplePie_Parse_Date::$month
+ *
+ * @access protected
+ * @var string
+ */
+ var $month_pcre;
+
+ /**
+ * Array of user-added callback methods
+ *
+ * @access private
+ * @var array
+ */
+ var $built_in = array();
+
+ /**
+ * Array of user-added callback methods
+ *
+ * @access private
+ * @var array
+ */
+ var $user = array();
+
+ /**
+ * Create new SimplePie_Parse_Date object, and set self::day_pcre,
+ * self::month_pcre, and self::built_in
+ *
+ * @access private
+ */
+ function SimplePie_Parse_Date()
+ {
+ $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')';
+ $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')';
+
+ static $cache;
+ if (!isset($cache[get_class($this)]))
+ {
+ if (extension_loaded('Reflection'))
+ {
+ $class = new ReflectionClass(get_class($this));
+ $methods = $class->getMethods();
+ $all_methods = array();
+ foreach ($methods as $method)
+ {
+ $all_methods[] = $method->getName();
+ }
+ }
+ else
+ {
+ $all_methods = get_class_methods($this);
+ }
+
+ foreach ($all_methods as $method)
+ {
+ if (strtolower(substr($method, 0, 5)) === 'date_')
+ {
+ $cache[get_class($this)][] = $method;
+ }
+ }
+ }
+
+ foreach ($cache[get_class($this)] as $method)
+ {
+ $this->built_in[] = $method;
+ }
+ }
+
+ /**
+ * Get the object
+ *
+ * @access public
+ */
+ function get()
+ {
+ static $object;
+ if (!$object)
+ {
+ $object = new SimplePie_Parse_Date;
+ }
+ return $object;
+ }
+
+ /**
+ * Parse a date
+ *
+ * @final
+ * @access public
+ * @param string $date Date to parse
+ * @return int Timestamp corresponding to date string, or false on failure
+ */
+ function parse($date)
+ {
+ foreach ($this->user as $method)
+ {
+ if (($returned = call_user_func($method, $date)) !== false)
+ {
+ return $returned;
+ }
+ }
+
+ foreach ($this->built_in as $method)
+ {
+ if (($returned = call_user_func(array(&$this, $method), $date)) !== false)
+ {
+ return $returned;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Add a callback method to parse a date
+ *
+ * @final
+ * @access public
+ * @param callback $callback
+ */
+ function add_callback($callback)
+ {
+ if (is_callable($callback))
+ {
+ $this->user[] = $callback;
+ }
+ else
+ {
+ trigger_error('User-supplied function must be a valid callback', E_USER_WARNING);
+ }
+ }
+
+ /**
+ * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as
+ * well as allowing any of upper or lower case "T", horizontal tabs, or
+ * spaces to be used as the time seperator (including more than one))
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_w3cdtf($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $year = '([0-9]{4})';
+ $month = $day = $hour = $minute = $second = '([0-9]{2})';
+ $decimal = '([0-9]*)';
+ $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))';
+ $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/';
+ }
+ if (preg_match($pcre, $date, $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Year
+ 2: Month
+ 3: Day
+ 4: Hour
+ 5: Minute
+ 6: Second
+ 7: Decimal fraction of a second
+ 8: Zulu
+ 9: Timezone ±
+ 10: Timezone hours
+ 11: Timezone minutes
+ */
+
+ // Fill in empty matches
+ for ($i = count($match); $i <= 3; $i++)
+ {
+ $match[$i] = '1';
+ }
+
+ for ($i = count($match); $i <= 7; $i++)
+ {
+ $match[$i] = '0';
+ }
+
+ // Numeric timezone
+ if (isset($match[9]) && $match[9] !== '')
+ {
+ $timezone = $match[10] * 3600;
+ $timezone += $match[11] * 60;
+ if ($match[9] === '-')
+ {
+ $timezone = 0 - $timezone;
+ }
+ }
+ else
+ {
+ $timezone = 0;
+ }
+
+ // Convert the number of seconds to an integer, taking decimals into account
+ $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
+
+ return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Remove RFC822 comments
+ *
+ * @access protected
+ * @param string $data Data to strip comments from
+ * @return string Comment stripped string
+ */
+ function remove_rfc2822_comments($string)
+ {
+ $string = (string) $string;
+ $position = 0;
+ $length = strlen($string);
+ $depth = 0;
+
+ $output = '';
+
+ while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
+ {
+ $output .= substr($string, $position, $pos - $position);
+ $position = $pos + 1;
+ if ($string[$pos - 1] !== '\\')
+ {
+ $depth++;
+ while ($depth && $position < $length)
+ {
+ $position += strcspn($string, '()', $position);
+ if ($string[$position - 1] === '\\')
+ {
+ $position++;
+ continue;
+ }
+ elseif (isset($string[$position]))
+ {
+ switch ($string[$position])
+ {
+ case '(':
+ $depth++;
+ break;
+
+ case ')':
+ $depth--;
+ break;
+ }
+ $position++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ $output .= '(';
+ }
+ }
+ $output .= substr($string, $position);
+
+ return $output;
+ }
+
+ /**
+ * Parse RFC2822's date format
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_rfc2822($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $wsp = '[\x09\x20]';
+ $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)';
+ $optional_fws = $fws . '?';
+ $day_name = $this->day_pcre;
+ $month = $this->month_pcre;
+ $day = '([0-9]{1,2})';
+ $hour = $minute = $second = '([0-9]{2})';
+ $year = '([0-9]{2,4})';
+ $num_zone = '([+\-])([0-9]{2})([0-9]{2})';
+ $character_zone = '([A-Z]{1,5})';
+ $zone = '(?:' . $num_zone . '|' . $character_zone . ')';
+ $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';
+ }
+ if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Day name
+ 2: Day
+ 3: Month
+ 4: Year
+ 5: Hour
+ 6: Minute
+ 7: Second
+ 8: Timezone ±
+ 9: Timezone hours
+ 10: Timezone minutes
+ 11: Alphabetic timezone
+ */
+
+ // Find the month number
+ $month = $this->month[strtolower($match[3])];
+
+ // Numeric timezone
+ if ($match[8] !== '')
+ {
+ $timezone = $match[9] * 3600;
+ $timezone += $match[10] * 60;
+ if ($match[8] === '-')
+ {
+ $timezone = 0 - $timezone;
+ }
+ }
+ // Character timezone
+ elseif (isset($this->timezone[strtoupper($match[11])]))
+ {
+ $timezone = $this->timezone[strtoupper($match[11])];
+ }
+ // Assume everything else to be -0000
+ else
+ {
+ $timezone = 0;
+ }
+
+ // Deal with 2/3 digit years
+ if ($match[4] < 50)
+ {
+ $match[4] += 2000;
+ }
+ elseif ($match[4] < 1000)
+ {
+ $match[4] += 1900;
+ }
+
+ // Second is optional, if it is empty set it to zero
+ if ($match[7] !== '')
+ {
+ $second = $match[7];
+ }
+ else
+ {
+ $second = 0;
+ }
+
+ return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Parse RFC850's date format
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_rfc850($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $space = '[\x09\x20]+';
+ $day_name = $this->day_pcre;
+ $month = $this->month_pcre;
+ $day = '([0-9]{1,2})';
+ $year = $hour = $minute = $second = '([0-9]{2})';
+ $zone = '([A-Z]{1,5})';
+ $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i';
+ }
+ if (preg_match($pcre, $date, $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Day name
+ 2: Day
+ 3: Month
+ 4: Year
+ 5: Hour
+ 6: Minute
+ 7: Second
+ 8: Timezone
+ */
+
+ // Month
+ $month = $this->month[strtolower($match[3])];
+
+ // Character timezone
+ if (isset($this->timezone[strtoupper($match[8])]))
+ {
+ $timezone = $this->timezone[strtoupper($match[8])];
+ }
+ // Assume everything else to be -0000
+ else
+ {
+ $timezone = 0;
+ }
+
+ // Deal with 2 digit year
+ if ($match[4] < 50)
+ {
+ $match[4] += 2000;
+ }
+ else
+ {
+ $match[4] += 1900;
+ }
+
+ return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Parse C99's asctime()'s date format
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_asctime($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $space = '[\x09\x20]+';
+ $wday_name = $this->day_pcre;
+ $mon_name = $this->month_pcre;
+ $day = '([0-9]{1,2})';
+ $hour = $sec = $min = '([0-9]{2})';
+ $year = '([0-9]{4})';
+ $terminator = '\x0A?\x00?';
+ $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';
+ }
+ if (preg_match($pcre, $date, $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Day name
+ 2: Month
+ 3: Day
+ 4: Hour
+ 5: Minute
+ 6: Second
+ 7: Year
+ */
+
+ $month = $this->month[strtolower($match[2])];
+ return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Parse dates using strtotime()
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_strtotime($date)
+ {
+ $strtotime = strtotime($date);
+ if ($strtotime === -1 || $strtotime === false)
+ {
+ return false;
+ }
+ else
+ {
+ return $strtotime;
+ }
+ }
+}
+
+/**
+ * Content-type sniffing
+ *
+ * @package SimplePie
+ */
+class SimplePie_Content_Type_Sniffer
+{
+ /**
+ * File object
+ *
+ * @var SimplePie_File
+ * @access private
+ */
+ var $file;
+
+ /**
+ * Create an instance of the class with the input file
+ *
+ * @access public
+ * @param SimplePie_Content_Type_Sniffer $file Input file
+ */
+ function SimplePie_Content_Type_Sniffer($file)
+ {
+ $this->file = $file;
+ }
+
+ /**
+ * Get the Content-Type of the specified file
+ *
+ * @access public
+ * @return string Actual Content-Type
+ */
+ function get_type()
+ {
+ if (isset($this->file->headers['content-type']))
+ {
+ if (!isset($this->file->headers['content-encoding'])
+ && ($this->file->headers['content-type'] === 'text/plain'
+ || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1'
+ || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1'))
+ {
+ return $this->text_or_binary();
+ }
+
+ if (($pos = strpos($this->file->headers['content-type'], ';')) !== false)
+ {
+ $official = substr($this->file->headers['content-type'], 0, $pos);
+ }
+ else
+ {
+ $official = $this->file->headers['content-type'];
+ }
+ $official = strtolower($official);
+
+ if ($official === 'unknown/unknown'
+ || $official === 'application/unknown')
+ {
+ return $this->unknown();
+ }
+ elseif (substr($official, -4) === '+xml'
+ || $official === 'text/xml'
+ || $official === 'application/xml')
+ {
+ return $official;
+ }
+ elseif (substr($official, 0, 6) === 'image/')
+ {
+ if ($return = $this->image())
+ {
+ return $return;
+ }
+ else
+ {
+ return $official;
+ }
+ }
+ elseif ($official === 'text/html')
+ {
+ return $this->feed_or_html();
+ }
+ else
+ {
+ return $official;
+ }
+ }
+ else
+ {
+ return $this->unknown();
+ }
+ }
+
+ /**
+ * Sniff text or binary
+ *
+ * @access private
+ * @return string Actual Content-Type
+ */
+ function text_or_binary()
+ {
+ if (substr($this->file->body, 0, 2) === "\xFE\xFF"
+ || substr($this->file->body, 0, 2) === "\xFF\xFE"
+ || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF"
+ || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF")
+ {
+ return 'text/plain';
+ }
+ elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body))
+ {
+ return 'application/octect-stream';
+ }
+ else
+ {
+ return 'text/plain';
+ }
+ }
+
+ /**
+ * Sniff unknown
+ *
+ * @access private
+ * @return string Actual Content-Type
+ */
+ function unknown()
+ {
+ $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20");
+ if (strtolower(substr($this->file->body, $ws, 14)) === 'file->body, $ws, 5)) === 'file->body, $ws, 7)) === '
+
+
+
+
+
+
+
+
+ auth)): ?>
+ Welcome to Sweetcron
+ Installation - Step 1 of 1
+ auth->is_logged()): ?>
+ config->item('lifestream_title')?>
+ Logged in as data->user->user_login?> | logout?
+
+ Welcome to Sweetcron
+ Please log in
+
+
+
+auth)): ?>
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/.svn/text-base/dashboard.php.svn-base b/system/application/views/admin/.svn/text-base/dashboard.php.svn-base
new file mode 100644
index 0000000..d0327a7
--- /dev/null
+++ b/system/application/views/admin/.svn/text-base/dashboard.php.svn-base
@@ -0,0 +1,40 @@
+
+
+
+
+load->view('admin/_activity_list')?>
+
+
+
+You have no items :/
+
+
+
+
+
+
+
+
+Hello there!
Looks like it's your first time here. Why not start by adding some feeds?
+
+
+
+Greetings!
This page shows the last 5 public items in your lifestream.
+
+Your Sweetcron Stats
+
+ - Public Items:
+ - Feeds:
+ - Last Fetch: config->item('last_fetch'))?> ago
+
+
+Useful Links
+
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/.svn/text-base/feed_add.php.svn-base b/system/application/views/admin/.svn/text-base/feed_add.php.svn-base
new file mode 100644
index 0000000..5c729a9
--- /dev/null
+++ b/system/application/views/admin/.svn/text-base/feed_add.php.svn-base
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+Not sure how to find a feed?
Try simply putting the url of a webpage in the input box
(e.g. http://twitter.com/yongfook) — it works 90% of the time!
+
\ No newline at end of file
diff --git a/system/application/views/admin/.svn/text-base/feeds.php.svn-base b/system/application/views/admin/.svn/text-base/feeds.php.svn-base
new file mode 100644
index 0000000..e6562fd
--- /dev/null
+++ b/system/application/views/admin/.svn/text-base/feeds.php.svn-base
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+-
+
+ - x
+
+ feed_title?>
+
+
+ item_count?> items
+
+
+
+
+
+
+
+You have no feeds :/
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/.svn/text-base/forgot.php.svn-base b/system/application/views/admin/.svn/text-base/forgot.php.svn-base
new file mode 100644
index 0000000..177d88e
--- /dev/null
+++ b/system/application/views/admin/.svn/text-base/forgot.php.svn-base
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+ =$errors?>
+
+
+
+
+
+ Instructions have been sent to your email acount.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/.svn/text-base/install.php.svn-base b/system/application/views/admin/.svn/text-base/install.php.svn-base
new file mode 100644
index 0000000..4ad2857
--- /dev/null
+++ b/system/application/views/admin/.svn/text-base/install.php.svn-base
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+ Installation Successful! Your login details are below:
+
+ Username: validation->username?>
+ Password:
+
+ You can now Log In »
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/.svn/text-base/items.php.svn-base b/system/application/views/admin/.svn/text-base/items.php.svn-base
new file mode 100644
index 0000000..1b7c5ea
--- /dev/null
+++ b/system/application/views/admin/.svn/text-base/items.php.svn-base
@@ -0,0 +1,97 @@
+
+
+
+You have no items :/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+load->view('admin/_activity_list')?>
+
+
+
+
+
+Search
+
+
+Your Feeds
+
+ -
+
+ Sweetcron
+
+ Sweetcron
+
+
+
+ -
+ feed_domain): ?>
+ feed_domain?>
+
+ feed_domain?>
+
+
+
+
+
+Tags
+
+
+
+ -
+ slug): ?>
+ name?>
+
+ name?>
+
+
+
+
+
+
+
+ -
+ slug): ?>
+ name?>
+
+ name?>
+
+
+
+
+
+
+No tags
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/.svn/text-base/login.php.svn-base b/system/application/views/admin/.svn/text-base/login.php.svn-base
new file mode 100644
index 0000000..296804b
--- /dev/null
+++ b/system/application/views/admin/.svn/text-base/login.php.svn-base
@@ -0,0 +1,31 @@
+
+
+config->item('last_fetch')): ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Forgot Password?
Reset my password »
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/.svn/text-base/options.php.svn-base b/system/application/views/admin/.svn/text-base/options.php.svn-base
new file mode 100644
index 0000000..59d82f7
--- /dev/null
+++ b/system/application/views/admin/.svn/text-base/options.php.svn-base
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+Remember!
After you change any options, click the "Save Options" button at the bottom of the page.
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/.svn/text-base/write.php.svn-base b/system/application/views/admin/.svn/text-base/write.php.svn-base
new file mode 100644
index 0000000..e01efaa
--- /dev/null
+++ b/system/application/views/admin/.svn/text-base/write.php.svn-base
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Shorthand
The blog post content area supports the Markdown method of shorthand markup.
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/_activity_list.php b/system/application/views/admin/_activity_list.php
new file mode 100644
index 0000000..88dacfd
--- /dev/null
+++ b/system/application/views/admin/_activity_list.php
@@ -0,0 +1,38 @@
+
+
+-
+
+
+
get_feed_domain()?> — get_human_date()?>
+
+ get_title()?>
+ has_original_permalink()): ?>
+
+
+ get_content()?>
+ has_image()): ?>
+
+
+
+ has_video()): ?>
+ get_video()?>
+
+
+ has_tags()): ?>
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/_footer.php b/system/application/views/admin/_footer.php
new file mode 100644
index 0000000..db80c75
--- /dev/null
+++ b/system/application/views/admin/_footer.php
@@ -0,0 +1,9 @@
+
+config)):?>
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/_header.php b/system/application/views/admin/_header.php
new file mode 100644
index 0000000..5656c96
--- /dev/null
+++ b/system/application/views/admin/_header.php
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+ › Sweetcron Admin Panel
+
+
+
+
+
+
+
+
+
+
+
+ auth)): ?>
+ Welcome to Sweetcron
+ Installation - Step 1 of 1
+ auth->is_logged()): ?>
+ config->item('lifestream_title')?>
+ Logged in as data->user->user_login?> | logout?
+
+ Welcome to Sweetcron
+ Please log in
+
+
+
+auth)): ?>
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/dashboard.php b/system/application/views/admin/dashboard.php
new file mode 100644
index 0000000..d0327a7
--- /dev/null
+++ b/system/application/views/admin/dashboard.php
@@ -0,0 +1,40 @@
+
+
+
+
+load->view('admin/_activity_list')?>
+
+
+
+You have no items :/
+
+
+
+
+
+
+
+
+Hello there!
Looks like it's your first time here. Why not start by adding some feeds?
+
+
+
+Greetings!
This page shows the last 5 public items in your lifestream.
+
+Your Sweetcron Stats
+
+ - Public Items:
+ - Feeds:
+ - Last Fetch: config->item('last_fetch'))?> ago
+
+
+Useful Links
+
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/feed_add.php b/system/application/views/admin/feed_add.php
new file mode 100644
index 0000000..5c729a9
--- /dev/null
+++ b/system/application/views/admin/feed_add.php
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+Not sure how to find a feed?
Try simply putting the url of a webpage in the input box
(e.g. http://twitter.com/yongfook) — it works 90% of the time!
+
\ No newline at end of file
diff --git a/system/application/views/admin/feeds.php b/system/application/views/admin/feeds.php
new file mode 100644
index 0000000..e6562fd
--- /dev/null
+++ b/system/application/views/admin/feeds.php
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+-
+
+ - x
+
+ feed_title?>
+
+
+ item_count?> items
+
+
+
+
+
+
+
+You have no feeds :/
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/forgot.php b/system/application/views/admin/forgot.php
new file mode 100644
index 0000000..177d88e
--- /dev/null
+++ b/system/application/views/admin/forgot.php
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+ =$errors?>
+
+
+
+
+
+ Instructions have been sent to your email acount.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/install.php b/system/application/views/admin/install.php
new file mode 100644
index 0000000..4ad2857
--- /dev/null
+++ b/system/application/views/admin/install.php
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+ Installation Successful! Your login details are below:
+
+ Username: validation->username?>
+ Password:
+
+ You can now Log In »
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/items.php b/system/application/views/admin/items.php
new file mode 100644
index 0000000..1b7c5ea
--- /dev/null
+++ b/system/application/views/admin/items.php
@@ -0,0 +1,97 @@
+
+
+
+You have no items :/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+load->view('admin/_activity_list')?>
+
+
+
+
+
+Search
+
+
+Your Feeds
+
+ -
+
+ Sweetcron
+
+ Sweetcron
+
+
+
+ -
+ feed_domain): ?>
+ feed_domain?>
+
+ feed_domain?>
+
+
+
+
+
+Tags
+
+
+
+ -
+ slug): ?>
+ name?>
+
+ name?>
+
+
+
+
+
+
+
+ -
+ slug): ?>
+ name?>
+
+ name?>
+
+
+
+
+
+
+No tags
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/login.php b/system/application/views/admin/login.php
new file mode 100644
index 0000000..296804b
--- /dev/null
+++ b/system/application/views/admin/login.php
@@ -0,0 +1,31 @@
+
+
+config->item('last_fetch')): ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Forgot Password?
Reset my password »
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/options.php b/system/application/views/admin/options.php
new file mode 100644
index 0000000..59d82f7
--- /dev/null
+++ b/system/application/views/admin/options.php
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+Remember!
After you change any options, click the "Save Options" button at the bottom of the page.
+
+
\ No newline at end of file
diff --git a/system/application/views/admin/write.php b/system/application/views/admin/write.php
new file mode 100644
index 0000000..e01efaa
--- /dev/null
+++ b/system/application/views/admin/write.php
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Shorthand
The blog post content area supports the Markdown method of shorthand markup.
+
+
\ No newline at end of file
diff --git a/system/application/views/index.html b/system/application/views/index.html
new file mode 100755
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/application/views/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+403 Forbidden
+
+
+
+
+
+Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/themes/.svn/all-wcprops b/system/application/views/themes/.svn/all-wcprops
new file mode 100644
index 0000000..9786d14
--- /dev/null
+++ b/system/application/views/themes/.svn/all-wcprops
@@ -0,0 +1,11 @@
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/!svn/ver/122/trunk/system/application/views/themes
+END
+index.html
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/!svn/ver/119/trunk/system/application/views/themes/index.html
+END
diff --git a/system/application/views/themes/.svn/entries b/system/application/views/themes/.svn/entries
new file mode 100644
index 0000000..93eb251
--- /dev/null
+++ b/system/application/views/themes/.svn/entries
@@ -0,0 +1,68 @@
+10
+
+dir
+124
+http://sweetcron.googlecode.com/svn/trunk/system/application/views/themes
+http://sweetcron.googlecode.com/svn
+
+
+
+2008-11-30T08:10:34.779286Z
+122
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+51b50d7d-0b4b-0410-974b-f188aa86c7d9
+
+boxy
+dir
+
+index.html
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+dd54539243bb14cf4e88be902741435d
+2008-11-13T12:07:45.088871Z
+119
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+135
+
+sandbox
+dir
+
diff --git a/system/application/views/themes/.svn/text-base/index.html.svn-base b/system/application/views/themes/.svn/text-base/index.html.svn-base
new file mode 100644
index 0000000..233ae63
--- /dev/null
+++ b/system/application/views/themes/.svn/text-base/index.html.svn-base
@@ -0,0 +1,15 @@
+
+
+
+
+403 Forbidden
+
+
+
+
+
+Directory access is forbidden.
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/.svn/all-wcprops b/system/application/views/themes/boxy/.svn/all-wcprops
new file mode 100644
index 0000000..6739b92
--- /dev/null
+++ b/system/application/views/themes/boxy/.svn/all-wcprops
@@ -0,0 +1,65 @@
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/!svn/ver/122/trunk/system/application/views/themes/boxy
+END
+rss_feed.php
+K 25
+svn:wc:ra_dav:version-url
+V 73
+/svn/!svn/ver/122/trunk/system/application/views/themes/boxy/rss_feed.php
+END
+contact.php
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/contact.php
+END
+_footer.php
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/!svn/ver/93/trunk/system/application/views/themes/boxy/_footer.php
+END
+_activity_feed.php
+K 25
+svn:wc:ra_dav:version-url
+V 78
+/svn/!svn/ver/91/trunk/system/application/views/themes/boxy/_activity_feed.php
+END
+items.php
+K 25
+svn:wc:ra_dav:version-url
+V 69
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/items.php
+END
+single.php
+K 25
+svn:wc:ra_dav:version-url
+V 70
+/svn/!svn/ver/94/trunk/system/application/views/themes/boxy/single.php
+END
+main.css
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/!svn/ver/88/trunk/system/application/views/themes/boxy/main.css
+END
+_header.php
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/!svn/ver/92/trunk/system/application/views/themes/boxy/_header.php
+END
+_sidebar.php
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/_sidebar.php
+END
+home.php
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/home.php
+END
diff --git a/system/application/views/themes/boxy/.svn/entries b/system/application/views/themes/boxy/.svn/entries
new file mode 100644
index 0000000..6676b91
--- /dev/null
+++ b/system/application/views/themes/boxy/.svn/entries
@@ -0,0 +1,371 @@
+10
+
+dir
+124
+http://sweetcron.googlecode.com/svn/trunk/system/application/views/themes/boxy
+http://sweetcron.googlecode.com/svn
+
+
+
+2008-11-30T08:10:34.779286Z
+122
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+51b50d7d-0b4b-0410-974b-f188aa86c7d9
+
+rss_feed.php
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+c87610c0e43b2534ae90bf0767dd494f
+2008-11-30T08:10:34.779286Z
+122
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1291
+
+contact.php
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+613a47d0e1add2aab9293e62ebf63df0
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+265
+
+_footer.php
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+a1178d283cbd3b83b70e77911b1c9c87
+2008-09-08T16:05:27.804169Z
+93
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+419
+
+_activity_feed.php
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+f74369bbe59aff6afe535e79c8103727
+2008-09-07T15:15:11.804117Z
+91
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4972
+
+images
+dir
+
+items.php
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+c01153ae65a874f44daa573af69ba38a
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+161
+
+single.php
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+f93b4819fe337876db7e266c35846f3f
+2008-09-08T23:39:43.153801Z
+94
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2108
+
+main.css
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+a4e86c66ab0be96ef65bbc4ff81e2a76
+2008-09-07T15:10:46.295258Z
+88
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+10675
+
+_header.php
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+799d60497aee5926feb7bcf625cc6e92
+2008-09-07T15:28:33.621296Z
+92
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2249
+
+_sidebar.php
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+5849a2d0463071d1209b8f94b56b5f23
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+989
+
+home.php
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+c01153ae65a874f44daa573af69ba38a
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+161
+
diff --git a/system/application/views/themes/boxy/.svn/text-base/_activity_feed.php.svn-base b/system/application/views/themes/boxy/.svn/text-base/_activity_feed.php.svn-base
new file mode 100644
index 0000000..9dacd3b
--- /dev/null
+++ b/system/application/views/themes/boxy/.svn/text-base/_activity_feed.php.svn-base
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+ -
+
I posted to get_feed_domain()?>
+
+
+
+
+ get_feed_domain() == 'opensourcefood.com'): ?>
+
+
+ get_title()?>get_content()), 28)?>
+
+ get_feed_domain() == 'twitter.com'): ?>
+
+ get_title()?>
+
+ get_feed_domain() == 'vimeo.com'): ?>
+ get_video()?>
+
+
+ get_feed_domain() == 'youtube.com'): ?>
+ get_video()?>
+
+ get_content()), 8)?>
+
+ get_feed_domain() == 'digg.com'): ?>
+
+
+ get_content()), 38)?>
+
+
+ get_feed_domain() == 'flickr.com'): ?>
+
+
+
+ feed_id): //this means it came from Sweetcron itself ?>
+
+
+ A blog post
+
+
+
+
+ The Boxy theme does not have a custom style for this type of item.
+ You can create one by editing the _activity_feed.php
and main.css
files.
+ Please read the Theme Docs and API for more information.
+
+
+
+
+
+ get_human_date()?> | Comments »
+
+
+
+
+
+
+ Page:
+
+
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/.svn/text-base/_footer.php.svn-base b/system/application/views/themes/boxy/.svn/text-base/_footer.php.svn-base
new file mode 100644
index 0000000..112a60d
--- /dev/null
+++ b/system/application/views/themes/boxy/.svn/text-base/_footer.php.svn-base
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/.svn/text-base/_header.php.svn-base b/system/application/views/themes/boxy/.svn/text-base/_header.php.svn-base
new file mode 100644
index 0000000..04d783e
--- /dev/null
+++ b/system/application/views/themes/boxy/.svn/text-base/_header.php.svn-base
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+ › config->item('lifestream_title')?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/system/application/views/themes/boxy/.svn/text-base/_sidebar.php.svn-base b/system/application/views/themes/boxy/.svn/text-base/_sidebar.php.svn-base
new file mode 100644
index 0000000..08fb3ea
--- /dev/null
+++ b/system/application/views/themes/boxy/.svn/text-base/_sidebar.php.svn-base
@@ -0,0 +1,23 @@
+
+
+
+ I recommend www.wufoo.com to create a contact form and paste it here!
+
+
+
+load->view('themes/'.$this->config->item('theme').'/_sidebar')?>
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/.svn/text-base/home.php.svn-base b/system/application/views/themes/boxy/.svn/text-base/home.php.svn-base
new file mode 100644
index 0000000..da80f3e
--- /dev/null
+++ b/system/application/views/themes/boxy/.svn/text-base/home.php.svn-base
@@ -0,0 +1,2 @@
+load->view('themes/'.$this->config->item('theme').'/_activity_feed')?>
+load->view('themes/'.$this->config->item('theme').'/_sidebar')?>
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/.svn/text-base/items.php.svn-base b/system/application/views/themes/boxy/.svn/text-base/items.php.svn-base
new file mode 100644
index 0000000..da80f3e
--- /dev/null
+++ b/system/application/views/themes/boxy/.svn/text-base/items.php.svn-base
@@ -0,0 +1,2 @@
+load->view('themes/'.$this->config->item('theme').'/_activity_feed')?>
+load->view('themes/'.$this->config->item('theme').'/_sidebar')?>
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/.svn/text-base/main.css.svn-base b/system/application/views/themes/boxy/.svn/text-base/main.css.svn-base
new file mode 100644
index 0000000..cadef23
--- /dev/null
+++ b/system/application/views/themes/boxy/.svn/text-base/main.css.svn-base
@@ -0,0 +1,567 @@
+/* Sweetcron Boxy CSS - 08/09/2008
+
+ Table of Contents:
+ Reset
+ Typography
+ Positioning
+ Per-Domain Styling
+ IE Fixes
+ 3rd Party
+
+*/
+
+/* Reset
+---------------------------------------------------------------------------------------- */
+
+* {
+ margin: 0;
+ padding: 0;
+}
+
+/* now I'm working with a clean slate! */
+
+
+/* Typography
+---------------------------------------------------------------------------------------- */
+
+body {
+ font-family: "Lucida Grande", Arial, Helvetica, sans serif;
+ font-size: 12px;
+ color: #000;
+ line-height: 1.7em;
+}
+
+ul#activity_list li.item.yongfook_com div.item_inner {
+ font-family: Georgia, 'Times New Roman', Times, serif;
+}
+
+h1 {
+ font-size: 28px;
+}
+
+a {
+ color: #3399ff;
+}
+
+a:hover {
+ color: #003399;
+}
+
+div#aboutme h3 {
+ color: #333;
+}
+
+ul#navigation li.current a, ul#navigation li a:hover {
+ color: black;
+}
+
+ul#activity_list li.item p.date, p.original_link a, p.activity_image_text span, p.site_info a, div#aboutme, p.blog_cite, div#single_header p, ul#navigation li a, p.osf_recipe {
+ color: #999;
+}
+
+p.vimeo_title a, li.item.digg_com div.item_inner a, ul#activity_list li.item.youtube_com div.item_inner a, p.osf_recipe a, div#header h1 a {
+ color: white;
+}
+
+ul#activity_list li.item.youtube_com div.item_inner {
+ color: #fd8585;
+}
+
+li.item.digg_com div.item_inner {
+ color: #7698b7;
+}
+
+div#explanation {
+ color: #999933;
+}
+
+div#explanation strong {
+ color: #666633;
+}
+
+input.text_input {
+ font-size: 13px;
+}
+
+h2, div#explanation, div#single_container, ul#navigation li, p.osf_recipe {
+ font-size: 15px;
+}
+
+p#pagination, ul#activity_list li.item.yongfook_com div.item_inner, div#single_container h3, div#single_container h4, div#single_container h5 {
+ font-size: 20px;
+}
+
+div#single_container h2 {
+ font-size: 25px;
+}
+
+ul#activity_list li.item p.date {
+ font-size: 9px;
+}
+
+p.blog_cite, p.site_info, p.date, p.original_link, p.activity_image_text, div#aboutme, div#footer, ul#activity_list li.item.youtube_com div.item_inner, p.osf_recipe span {
+ font-size: 10px;
+}
+
+p.activity_image_text a, p.twitter_tweet, p.vimeo_title, li.item.digg_com div.item_inner a, div#explanation strong, p#pagination, ul#activity_list li.item.youtube_com div.item_inner a, ul#activity_list li.item.yongfook_com div.item_inner, div#single_header, div#single_container strong, ul.item_tag_list, ul#navigation li, p.osf_recipe, div.instructions strong {
+ font-weight: bold;
+}
+
+ul#activity_list li.item.yongfook_com div.item_inner p.blog_cite {
+ font-weight: normal;
+}
+
+p.original_link a, p.activity_image_text a, p.site_info a, p.vimeo_title a, li.item.digg_com div.item_inner a, ul#activity_list li.item.youtube_com div.item_inner a, ul#navigation li a, p.osf_recipe a, div#header h1 a {
+ text-decoration: none;
+}
+
+p.original_link a:hover, p.activity_image_text a:hover, li.item.digg_com div.item_inner a:hover {
+ text-decoration: underline;
+}
+
+p.vimeo_title, ul#activity_list li.item.youtube_com div.item_inner, ul#activity_list li.item.yongfook_com div.item_inner {
+ text-align: center;
+}
+
+div#single_header h2 {
+ line-height: 1.1em;
+}
+
+p.activity_image_text {
+ line-height: 1.5em;
+}
+
+p.twitter_tweet, div#aboutme, ul#activity_list li.item.youtube_com div.item_inner {
+ line-height: 1.6em;
+}
+
+
+/* Positioning
+---------------------------------------------------------------------------------------- */
+
+body {
+ background: white;
+}
+
+div.center_box {
+ width: 980px;
+ margin: 0 auto;
+ position: relative;
+}
+
+div#header {
+ background: #99ccff;
+}
+
+div#header div.center_box {
+ height: 150px;
+}
+
+div#header h1 {
+ position: absolute;
+ top: 50px;
+ left: 0;
+}
+
+div#header h1 a {
+ border: 1px solid #b8dbfe;
+ border-style: none none solid none;
+}
+
+div#header h1 a:hover {
+ border: 1px solid white;
+ border-style: none none solid none;
+}
+
+ul#navigation {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+}
+
+ul#navigation li {
+ float: left;
+ margin-right: 1px;
+}
+
+ul#navigation li a {
+ float: left;
+ padding: 8px 15px;
+ background: white url(images/blogback.jpg) bottom left no-repeat;
+}
+
+ul#navigation li.current a {
+ background: white;
+}
+
+div#main_container {
+ margin: 15px 0 0 0;
+ width: 663px;
+ float: left;
+}
+
+div#sidebar_container {
+ display: inline;
+ width: 300px;
+ float: left;
+ margin: 15px 0 0 15px;
+}
+
+p.site_info {
+ padding: 3px 3px 3px 22px;
+}
+
+ul#activity_list {
+ float: left;
+}
+
+ul#activity_list li.item {
+ width: 211px;
+ margin: 0 15px 15px 0;
+ float: left;
+ overflow: hidden;
+}
+
+div.item_inner {
+ border: 1px solid #CCC;
+ height: 250px;
+ overflow: hidden;
+ position: relative;
+}
+
+ul#activity_list li.item.last {
+ margin-right: 0;
+}
+
+li.item img, div#single_container img {
+ display: block;
+}
+
+ul.item_tag_list li {
+ display: inline;
+}
+
+div.clear {
+ clear: both;
+}
+
+p#breadcrumb, p#pagination {
+ margin-bottom: 15px;
+ padding: 3px;
+ border: 1px solid #CCC;
+ border-style: dotted none;
+}
+
+p#pagination {
+ padding: 10px 0;
+}
+
+div#sidebar_container h3 {
+ border: 1px solid #CCC;
+ border-style: none none solid none;
+ margin: 10px 0 5px 0;
+}
+
+div#sidebar_container div#aboutme_blurb h3 {
+ margin-top: 0;
+ border: none;
+}
+
+ul.tag_list li {
+ display: inline;
+ margin: 0 5px 0 0;
+}
+
+div#comments_container {
+ border: 1px solid #EEE;
+ border-style: solid none none none;
+ padding: 10px 0;
+ margin-top: 20px;
+}
+
+div.ad_container img {
+ display: block;
+}
+
+div.ad_container.bottom {
+ margin: 15px 0;
+}
+
+form#search_form {
+ margin: 8px 0 0 0;
+}
+
+form#mailing_list {
+ margin-top: 15px;
+ background: white url(images/mailinglist.gif) 0 0 no-repeat;
+ border: 1px solid #CCC;
+}
+
+form#mailing_list p {
+ padding: 70px 10px 10px 10px;
+}
+
+input.text_input {
+ background: #FFFFCC;
+ width: 180px;
+}
+
+div#explanation {
+ background: #FFFFCC;
+ padding: 10px;
+ margin: 15px 0;
+}
+
+div#aboutme_blurb {
+ width: 180px;
+ border: 1px solid #EEE;
+ border-style: none solid none none;
+ padding: 0 15px 0 0;
+ float: left;
+ margin-right: 15px;
+}
+
+div#aboutme ul {
+ list-style-type: disc;
+}
+
+div#aboutme ul li {
+ padding-bottom: 5px;
+}
+
+div#aboutme h3, div#aboutme ul, div#aboutme p {
+ margin-left: 20px;
+}
+
+div#aboutme h3 {
+ margin-bottom: 5px;
+}
+
+p.sidebar_small_banner img {
+ display: block;
+ margin-bottom: 10px;
+}
+
+div#footer {
+ clear: both;
+}
+
+div#footer {
+ background: #EEE;
+ padding: 8px;
+ position: relative;
+}
+
+a#credits {
+ position: absolute;
+ right: 10px;
+ top: 6px;
+}
+
+div#single_header {
+ padding: 10px 0 15px 0;
+}
+
+div#single_content p, div#single_container object, div#single_container img, div#single_container ul, div#single_container ol {
+ margin-bottom: 15px;
+}
+
+div#single_container img {
+ border: 1px solid #CCC;
+ padding: 5px;
+}
+
+div#single_container h3, div#single_container h4, div#single_container h5 {
+ border: 1px solid #CCC;
+ border-style: none none dotted none;
+ padding-bottom: 8px;
+ margin-bottom: 8px;
+ margin-top: 25px;
+}
+
+p#original_permalink span {
+ background: #FFFFCC;
+}
+
+div.activity_list_inner img {
+ float: left;
+ margin-right: 10px;
+}
+
+li.activity_item {
+ clear: both;
+}
+
+/* Per-Domain Styling
+---------------------------------------------------------------------------------------- */
+
+li.item.flickr_com {
+ background: white url(images/flickrlogo.gif) center center no-repeat;
+}
+
+li.item.flickr_com p.site_info {
+ background: blue;
+}
+
+li.item.vimeo_com div.item_inner {
+ background: #80ceff url(images/vimeoback.jpg) bottom center no-repeat;
+}
+
+li.item.vimeo_com div.item_inner object {
+ border: 1px solid white;
+ border-style: none none solid none;
+}
+
+ul#activity_list li.item.twitter_com div.item_inner {
+ background: url(images/twitterback.jpg);
+}
+
+p.vimeo_title a {
+ border: 1px solid #a7dafa;
+ border-style: none none solid none;
+}
+
+p.vimeo_title a:hover {
+ border: 1px solid white;
+ border-style: none none solid none;
+}
+
+p.twitter_user {
+ margin: 10px 0 0 10px;
+ padding-bottom: 10px;
+ background: transparent url(images/twittertail.gif) bottom 60px no-repeat;
+}
+
+p.twitter_user img {
+ display: block;
+ border: 1px solid #999;
+}
+
+p.twitter_tweet {
+ background: white;
+ padding: 8px 10px;
+ overflow: hidden;
+ background: white url(images/twitterdither.gif) bottom left repeat-x;
+ border: 1px solid #DDD;
+ border-style: none none solid none;
+ margin: 0 10px;
+}
+
+ul#activity_list li.item.digg_com div.item_inner {
+ background: #1b5790 url(images/diggback.gif) bottom right no-repeat;
+}
+
+li.item.digg_com div.item_inner a {
+ border: 1px solid #7698b7;
+ border-style: none none dotted none;
+ display: block;
+ padding-bottom: 5px;
+ margin-bottom: 5px;
+}
+
+div.inner_container {
+ padding: 8px 10px;
+}
+
+ul#activity_list li.item.youtube_com div.item_inner {
+ background: #FE3333 url(images/youtubeback.gif) bottom left repeat-x;
+}
+
+ul#activity_list li.item.youtube_com div.item_inner object {
+ border: 1px solid white;
+ border-style: none none solid none;
+ margin-bottom: 7px;
+}
+
+ul#activity_list li.item.youtube_com div.item_inner p {
+ padding: 0 10px;
+}
+
+ul#activity_list li.item.youtube_com div.item_inner a {
+ border: 1px solid #f07777;
+ border-style: none none solid none;
+}
+
+ul#activity_list li.item.youtube_com div.item_inner a:hover {
+ border: 1px solid white;
+ border-style: none none solid none;
+}
+
+ul#activity_list li.item.yongfook_com div.item_inner {
+ background: white url(images/blogback.jpg) bottom left no-repeat;
+}
+
+p.blog_title, p.blog_cite {
+ margin: 15px 0 20px 0;
+}
+
+ul#activity_list li.item.yongfook_com div.item_inner img {
+ display: inline;
+}
+
+li.item.opensourcefood_com img {
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ z-index: 0;
+}
+
+div.osf_fold a {
+ height: 250px;
+ width: 211px;
+ background: transparent url(images/osfback.png) bottom right no-repeat;
+ z-index: 1000;
+ position: absolute;
+}
+
+p.osf_recipe {
+ position: absolute;
+ z-index: 1001;
+ top: 10px;
+ left: 10px;
+ width: 190px;
+}
+
+p.osf_recipe a {
+ border: 1px solid #333;
+ border-style: none none solid none;
+}
+
+p.osf_recipe a:hover {
+ border: 1px solid white;
+ border-style: none none solid none;
+}
+
+p.osf_recipe span {
+ margin-top: 3px;
+ display: block;
+ width: 180px;
+}
+
+a.activity_image {
+ display: block;
+ height: 250px;
+}
+
+p.activity_image_text {
+ position: absolute;
+ top: 0;
+ padding: 3px 5px;
+ background: black;
+}
+
+div.instructions code {
+ background: #FFFFCC;
+}
+
+
+/* IE Fixes (lulz)
+---------------------------------------------------------------------------------------- */
+
+body {
+ word-wrap: break-word;
+}
+
+
+/* 3rd Party
+---------------------------------------------------------------------------------------- */
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/.svn/text-base/rss_feed.php.svn-base b/system/application/views/themes/boxy/.svn/text-base/rss_feed.php.svn-base
new file mode 100644
index 0000000..2ba3a05
--- /dev/null
+++ b/system/application/views/themes/boxy/.svn/text-base/rss_feed.php.svn-base
@@ -0,0 +1,27 @@
+
+
+ config->item('lifestream_title')?>
+ config->item('base_url')?>feed
+
+ en-us
+ http://blogs.law.harvard.edu/tech/rss
+ Sweetcron
+ config->item('admin_email')?>
+
+ -
+
get_title()))?>
+ get_permalink()?>/get_name()?>
+ get_content()?>
+ has_image() && !$item->has_video()): ?>
+
+
+ has_video()): ?>
+ get_video()?>
+
+ ]]>
+
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/.svn/text-base/contact.php.svn-base b/system/application/views/themes/boxy/.svn/text-base/contact.php.svn-base
new file mode 100644
index 0000000..65d32b7
--- /dev/null
+++ b/system/application/views/themes/boxy/.svn/text-base/contact.php.svn-base
@@ -0,0 +1,8 @@
+get_date())?>
+ get_permalink()?>/get_name()?>
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/.svn/text-base/single.php.svn-base b/system/application/views/themes/boxy/.svn/text-base/single.php.svn-base
new file mode 100644
index 0000000..092b724
--- /dev/null
+++ b/system/application/views/themes/boxy/.svn/text-base/single.php.svn-base
@@ -0,0 +1,52 @@
+
+config->item('base_url');
+endif; ?>
+
+
+ get_title()?>
+ get_human_date()?>
+
+
+ has_content()): ?>
+ get_content()?>
+
+ has_image() && !$item->has_video()): ?>
+ item_data[$item->get_feed_class()]['image']['m']) && !empty($item->item_data[$item->get_feed_class()]['image']['m'])): ?>
+ ]['image']['m']?>)
+
+ ?>)
+
+
+ has_video()): ?>
+
+ get_video());
+ $video = str_replace('height="159"', 'height="375"', $video);
+ $video = str_replace('height="178"', 'height="415"', $video);
+ echo $video?>
+
+
+ has_tags()): ?>
+
+ - Tags:
+ get_tags() as $tag): ?>
+ - name?>
+
+
+
+ get_original_permalink()): ?>
+
+
+
+
+
+ Your favourite external commenting service goes here! I recommend http://www.disqus.com
+
+
+
+load->view('themes/'.$this->config->item('theme').'/_sidebar')?>
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/_activity_feed.php b/system/application/views/themes/boxy/_activity_feed.php
new file mode 100644
index 0000000..9dacd3b
--- /dev/null
+++ b/system/application/views/themes/boxy/_activity_feed.php
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+ -
+
I posted to get_feed_domain()?>
+
+
+
+
+ get_feed_domain() == 'opensourcefood.com'): ?>
+
+
+ get_title()?>get_content()), 28)?>
+
+ get_feed_domain() == 'twitter.com'): ?>
+
+ get_title()?>
+
+ get_feed_domain() == 'vimeo.com'): ?>
+ get_video()?>
+
+
+ get_feed_domain() == 'youtube.com'): ?>
+ get_video()?>
+
+ get_content()), 8)?>
+
+ get_feed_domain() == 'digg.com'): ?>
+
+
+ get_content()), 38)?>
+
+
+ get_feed_domain() == 'flickr.com'): ?>
+
+
+
+ feed_id): //this means it came from Sweetcron itself ?>
+
+
+ A blog post
+
+
+
+
+ The Boxy theme does not have a custom style for this type of item.
+ You can create one by editing the _activity_feed.php
and main.css
files.
+ Please read the Theme Docs and API for more information.
+
+
+
+
+
+ get_human_date()?> | Comments »
+
+
+
+
+
+
+ Page:
+
+
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/_footer.php b/system/application/views/themes/boxy/_footer.php
new file mode 100644
index 0000000..112a60d
--- /dev/null
+++ b/system/application/views/themes/boxy/_footer.php
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/_header.php b/system/application/views/themes/boxy/_header.php
new file mode 100644
index 0000000..04d783e
--- /dev/null
+++ b/system/application/views/themes/boxy/_header.php
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+ › config->item('lifestream_title')?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/system/application/views/themes/boxy/_sidebar.php b/system/application/views/themes/boxy/_sidebar.php
new file mode 100644
index 0000000..08fb3ea
--- /dev/null
+++ b/system/application/views/themes/boxy/_sidebar.php
@@ -0,0 +1,23 @@
+
+
+
+ I recommend www.wufoo.com to create a contact form and paste it here!
+
+
+
+load->view('themes/'.$this->config->item('theme').'/_sidebar')?>
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/home.php b/system/application/views/themes/boxy/home.php
new file mode 100644
index 0000000..da80f3e
--- /dev/null
+++ b/system/application/views/themes/boxy/home.php
@@ -0,0 +1,2 @@
+load->view('themes/'.$this->config->item('theme').'/_activity_feed')?>
+load->view('themes/'.$this->config->item('theme').'/_sidebar')?>
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/images/.svn/all-wcprops b/system/application/views/themes/boxy/images/.svn/all-wcprops
new file mode 100644
index 0000000..4e235d2
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/all-wcprops
@@ -0,0 +1,71 @@
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/images
+END
+diggback.gif
+K 25
+svn:wc:ra_dav:version-url
+V 79
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/images/diggback.gif
+END
+vimeoback.jpg
+K 25
+svn:wc:ra_dav:version-url
+V 80
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/images/vimeoback.jpg
+END
+twittertail.gif
+K 25
+svn:wc:ra_dav:version-url
+V 82
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/images/twittertail.gif
+END
+credits.gif
+K 25
+svn:wc:ra_dav:version-url
+V 78
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/images/credits.gif
+END
+youtubeback.gif
+K 25
+svn:wc:ra_dav:version-url
+V 82
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/images/youtubeback.gif
+END
+twitterback.jpg
+K 25
+svn:wc:ra_dav:version-url
+V 82
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/images/twitterback.jpg
+END
+me_twitter.jpg
+K 25
+svn:wc:ra_dav:version-url
+V 81
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/images/me_twitter.jpg
+END
+ad.jpg
+K 25
+svn:wc:ra_dav:version-url
+V 73
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/images/ad.jpg
+END
+blogback.jpg
+K 25
+svn:wc:ra_dav:version-url
+V 79
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/images/blogback.jpg
+END
+twitterdither.gif
+K 25
+svn:wc:ra_dav:version-url
+V 84
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/images/twitterdither.gif
+END
+osfback.png
+K 25
+svn:wc:ra_dav:version-url
+V 78
+/svn/!svn/ver/86/trunk/system/application/views/themes/boxy/images/osfback.png
+END
diff --git a/system/application/views/themes/boxy/images/.svn/entries b/system/application/views/themes/boxy/images/.svn/entries
new file mode 100644
index 0000000..cff06a6
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/entries
@@ -0,0 +1,402 @@
+10
+
+dir
+124
+http://sweetcron.googlecode.com/svn/trunk/system/application/views/themes/boxy/images
+http://sweetcron.googlecode.com/svn
+
+
+
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+51b50d7d-0b4b-0410-974b-f188aa86c7d9
+
+diggback.gif
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+2c9e7a574ae6b16e0cd7932880f9a507
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1014
+
+vimeoback.jpg
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+50c12cc1fa77b83aa97038940f4f4306
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+7141
+
+twittertail.gif
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+1d4936b6d9114b2c28d6d2fd16207df1
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+334
+
+credits.gif
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+a07cda127cc38e51ab48ee9335529ace
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1561
+
+youtubeback.gif
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+3f84ad471b3ea3a86569c79b26f37471
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2940
+
+twitterback.jpg
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+52bec52662a6775da9aa2a631c800b56
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+11371
+
+me_twitter.jpg
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+3fffbc138a39233ea19610535df8635e
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1246
+
+ad.jpg
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+f59c7bc12870e980957e53d0f21d3b83
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+15285
+
+blogback.jpg
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+da5aa90b8fa055d17c4d4a247d8e4817
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1096
+
+twitterdither.gif
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+b0178b2c4c8724bec3325eb51038eea7
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+131
+
+osfback.png
+file
+
+
+
+
+2009-09-15T00:18:03.000000Z
+aeaec7f905b09eb9640404a3e84632a2
+2008-09-07T02:09:53.708186Z
+86
+yongfook
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1981
+
diff --git a/system/application/views/themes/boxy/images/.svn/prop-base/ad.jpg.svn-base b/system/application/views/themes/boxy/images/.svn/prop-base/ad.jpg.svn-base
new file mode 100644
index 0000000..5e9587e
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/prop-base/ad.jpg.svn-base
@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
diff --git a/system/application/views/themes/boxy/images/.svn/prop-base/blogback.jpg.svn-base b/system/application/views/themes/boxy/images/.svn/prop-base/blogback.jpg.svn-base
new file mode 100644
index 0000000..5e9587e
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/prop-base/blogback.jpg.svn-base
@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
diff --git a/system/application/views/themes/boxy/images/.svn/prop-base/credits.gif.svn-base b/system/application/views/themes/boxy/images/.svn/prop-base/credits.gif.svn-base
new file mode 100644
index 0000000..5e9587e
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/prop-base/credits.gif.svn-base
@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
diff --git a/system/application/views/themes/boxy/images/.svn/prop-base/diggback.gif.svn-base b/system/application/views/themes/boxy/images/.svn/prop-base/diggback.gif.svn-base
new file mode 100644
index 0000000..5e9587e
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/prop-base/diggback.gif.svn-base
@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
diff --git a/system/application/views/themes/boxy/images/.svn/prop-base/me_twitter.jpg.svn-base b/system/application/views/themes/boxy/images/.svn/prop-base/me_twitter.jpg.svn-base
new file mode 100644
index 0000000..5e9587e
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/prop-base/me_twitter.jpg.svn-base
@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
diff --git a/system/application/views/themes/boxy/images/.svn/prop-base/osfback.png.svn-base b/system/application/views/themes/boxy/images/.svn/prop-base/osfback.png.svn-base
new file mode 100644
index 0000000..5e9587e
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/prop-base/osfback.png.svn-base
@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
diff --git a/system/application/views/themes/boxy/images/.svn/prop-base/twitterback.jpg.svn-base b/system/application/views/themes/boxy/images/.svn/prop-base/twitterback.jpg.svn-base
new file mode 100644
index 0000000..5e9587e
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/prop-base/twitterback.jpg.svn-base
@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
diff --git a/system/application/views/themes/boxy/images/.svn/prop-base/twitterdither.gif.svn-base b/system/application/views/themes/boxy/images/.svn/prop-base/twitterdither.gif.svn-base
new file mode 100644
index 0000000..5e9587e
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/prop-base/twitterdither.gif.svn-base
@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
diff --git a/system/application/views/themes/boxy/images/.svn/prop-base/twittertail.gif.svn-base b/system/application/views/themes/boxy/images/.svn/prop-base/twittertail.gif.svn-base
new file mode 100644
index 0000000..5e9587e
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/prop-base/twittertail.gif.svn-base
@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
diff --git a/system/application/views/themes/boxy/images/.svn/prop-base/vimeoback.jpg.svn-base b/system/application/views/themes/boxy/images/.svn/prop-base/vimeoback.jpg.svn-base
new file mode 100644
index 0000000..5e9587e
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/prop-base/vimeoback.jpg.svn-base
@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
diff --git a/system/application/views/themes/boxy/images/.svn/prop-base/youtubeback.gif.svn-base b/system/application/views/themes/boxy/images/.svn/prop-base/youtubeback.gif.svn-base
new file mode 100644
index 0000000..5e9587e
--- /dev/null
+++ b/system/application/views/themes/boxy/images/.svn/prop-base/youtubeback.gif.svn-base
@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END
diff --git a/system/application/views/themes/boxy/images/.svn/text-base/ad.jpg.svn-base b/system/application/views/themes/boxy/images/.svn/text-base/ad.jpg.svn-base
new file mode 100644
index 0000000000000000000000000000000000000000..045ea84d1351deec5f1ef77a40042400edca975f
GIT binary patch
literal 15285
zcmeHucUV(hvu~&>hzJ4#Qltc>D!oXN4xvdxuSy972)#Eu5IUiUCMEPDEulzJklsU0
z00pEsktQH;dEayIckXkabME*3bI$$ePLj3PvwnN_o|(1w?46m}m(!Qu0k=VFnrZ+d
zVgSJI>I1mk0??@V*g6LQhybJj0KnvGXa{gh(az1r9$?pgH9~Yr0K5Yb{ey_Fdc?$6
zEip04)%L0-CHb33uZZmGNB%cm|BG(?gZ^T<+Up7@yG~9<{=Xsr*yaD;xoii}TnC&I
z36K!c0ElUbNN9*II{~d%ViS@5E!&l-e-k;`wd*%1NGVDF5)?r4SM%>ge(gFLDamaB
zfQ*=wl$eBy^corYwJVtDN((Y_8ro~uIrQ(`5Pm_&K%vMvR@+JMlPqBrrk?5{Qg;{3
zB`T)+Rqb_xk~lP%8)#q8X!GWa@_U{KG*>c^5R(xTUn9Ft^7pxjX#P4Lhp-|ox&E~m
zoF1KNU#@#Ipb;|Axwy~G1k0Bkq))s)Zp!qI$&XzfHE
z9T5^Fw=~iFhNY+%Cx1yq=odfNfElSm`%VVLHaX$fa|G)eH)(+;64B&dJj|M}_
zA+0Wlwqx?H2RwnSFLisz*O&V<9^G{Bz6B71zdvH`Kjq2#BLmR-_l5YM_sm`nD|~sm
z0su;a3;$5MOTc3y{*M#|to2`JCy$6e6C0Dy;fS?Hw8~e+NoDnvQz1R{HX4M*02)
zU5K160Z-Z}{(K@W{dz{@5JIo_mldA=3!H-1t9}dCsjraJea0mce(XO>Uv}OnE&6|A
zfxoP6HrxGYtD8-}Ecg>?cGuY*hjV(p-|qlPul@yH>f5qjzHhZ6*0*H}Om^721W*?J
zQ38NGgq|~|KEA1yMj22RSX+dmFO*!Var%m5?#Ee*ptUQkrnKwrZRll4pqrKaHx2UJ
zKZ3w&Xf{$6sNGZfptGr?F07odwGW=*t2b(XOpdRx#|K5V@26z=+1oHp@jF5*QWs0X
z@RHV$m?S8>HN6w`$Gj`v(|iuK-vJD=Xr=uJ=l?gG|Hl9WmiEHu_ay**
zHCyU-AyIYmQGZX>)g*g8*><#)gg4@EZNGNu3lx<2)#g%axi@P1A+x~8I!(iiny%CW
zD*T8<7U03PwYDxle3;Y3lVln+1dTJQ&O{plVHH{KC2eWW$IYZugYi7MOFUVi49Jkg
z*q&Bw?sX9(mqK>ktp20X>9C!HZL=4ZXI6Et89pgGD3Qc=!4_;&?8NF-H|Z~jpdymIyIdrrL+!PzLB;Pb?+${e>@2p=*GM1zXd%=vxq
zRcAzW=pYwMrZmPDqnrFax@oCi`MuwzDU{3g-c^6Z|4plC6BuO14_Qw+Ox7u_)(9z1
zD(?K#*ypp74FsZ_`U5m&b-u{@KYtOUBq+k^_%#b;sQw9-S2h*5MKEmM7MfV%GDX!78^n2}uQCzl*6Qx1ZAsuO!^DB=16Q
zI+jdTnD?*BWU3|k3wA1Jk&C)9Yat$#M+d~;!eMZYa*T5;5z|k?3Fn(^7h@F~Vc_k)
zea2jvSTP|`EXDB6bm)^3h-+O9ki*XIx!C$#9G(TQ=iDEC;J3ot96sBoSVAwzojVAn
z1Ch|ujKAW_XWB;LzaL
zY)J@u6hiIb;4!>pf}=J#37$=Er{2vXd}~DVLE|6`-Zg!A!qU01Zyw7fm3A-<=NjXq
zmoDQHQ+>}8owONwrOpj*H8e9=&3G(*D0xI+;glZ4t!L``(4Lx&keVT?
zR6jIfav#qarjrTq9W-PGGC>fGHrVG{_`*`y~reDG4c0QV<6R(*z;by@BMxY2o%BlRCPR7
z;YLK2t}KJHSg#
zEjHFU=J~O~8r^X-i=+-1YL-wU25gp4q8W!3FYBZ@DY5G3@`I619W3aG;
zNClRD)QTpq?VVAg=r=c}Sg`_JvXz|ir!>Jq2H1fYk|z^-F)upCRkK4Q%WqPZ?`mHE
z%_?lGsl8wh-w*a_PFa4TRd>*rm0}1jICJFk5advMmx~$C1AeLnX$`7r%5--HOS*rn
zm$Vr(XHC%?MD8#USow#e4>0@+#`K6E^2WI{-bX*ihljm`G3xg!bHasaCZP$3KVe{p
zI>ZgyY!#}kCp;7ecAeo>KR#|G4C)j{FL3`ssGq6UJA6!qtjyXxSO{yw9@_30-3^+8
z`#U*lXVm=%TX&9j-=hzmZVu8-n0<+n7_5h+%$|l=eh~;1et-#!nD1b@
z=TXPpwlEM(%GKXeHjB}|Q;hjN{v5k!>7s4v*0l+B2=C&7O(Mdh&JwXZC;4QPLpO21
zZPv>ze@2zCgx;aCN`^xBkF`KEt#2%3c1`QJtse`XB=y9akJ@wI8Da$~*`if8Bg{17
zojQMe(CFRS>pvds8l+F>Vwt8G)?-Vd#A=azCuD(0eeX-%%EuY${TRZQiB
zoKbQQ@G5W8V>x+-=0b@ckry<+1Qx}73f3tYO+hLMte&ZZzr7IJUTXOIGO=U(+~h2i
z(6Wj7Bqpnnan`0AdbD$7{Ao^P{wSfyzpflT|^}Oi`9aec^O*1RuA9%}M&C}mD
z@HCXA%Rc61u%71TPgKXFca~gNcYd==z);SYOMnp3!y5Uocy?9X1qT3l1qe$9XUO4L
z&*0`JzWHTY8k4c*5Rj#?vr3UqfQ3lcimj&$D$8GbAkL&C-{0;FYktVIwUfI8>!;|1Kd-~Xm9MA
z1B+{r=+40i#Hcn=`v$!%xOY^DQ}>f~T}L8Km=P-XQg;)Yt$NN{$8;W6`Ri5OnqLt!8tUrx8<;b8L*+xi(bo
z4F57{RSjFFP?{{>9ybZ+;Xd+ASWN2miBJj9OaGmAOWX18U|Z!`9(qImr}(Y9GHU}j
z^38kUe;7=}2H@
zobyVOYQ)jEM?Fo!gM7}vmOgze_*!9@$N`2*ibwyb?}3ErGF$8kam2~@!+V{rgJvdT
zVw~xzn)hALrg0mC{9x}f$gm`Nk;LSeYO*OAO1NF&jH}Z1u{>FZ;HS>1Ern4qp}A(X
z>%OWO-xoxoj9yVPN`+sh`_0m>>YLHg`!YMKy&h9~rN1T@7V{VLJHkjwT89Saa+_VJ
zBoqnXe3RiN&kA>VjgoWx%M6S~iq?y~)VQ@=UuvThnZ{0U*jdUpq`soE^6Q(O@G?HG
z_gP0d>9QiQU1=W(b(vk-e}0?^_LTIB`8z=Rc%m->d3d#)qh`0Sxij1SdWWLJKDfyQ
zQHJhOT?Ora$)LmryGhq6o2pZPE)3U_@Ez}S@r45wiEw;kUG`i(we#dkv#U{`oO+W_
zGJ0^pG>&3`7h=iG|JM*o+3`I7*pdxt%*#w6-(2nsY&MGR)1Y3oxr%T%eJ+H+QwdR
zo4Y>QiL?&+v=eI(alw2Epyvst^TkxT_|7pbTml|6d78RR_6se$oDN)JGDh;KM&LZ!
z2cP}ZPgVLC_owqqfbXg%Q@TxL#`(;!*y;6f_T~3fKQKCHn9B9dluN*%
zP?|60%p=to>ujkTM@xo~Msd&YC#5Uz6~muNdG~RtIi}Kbj*PMw2;fr7on#x*(ZCLo
z5{1Xd&hE{|89KS!wPY=m+5<+Ljh(}6`d4mP>M%#6;gd0em8!|YEXKiSrgFPAK`bh;
z(|uLGeql_`A)EDLM|WXPV!Ph$S&?pF2y0UvN+=8B#hk$KRy#m{L2Qij^}Tm$8xfz3
z>e-uwawzb7@O$z%89G(xs(to1Lq^RDLu2)SMi^LGHvX8Cw3w+(&j>0caE%e52{Z@$
zInn)P6*1d)VBrJcK($Hnt`0I=c@9WI2d}>s^TiL%|I2!JTWhlC7H|WzQ
zhZ8kPj}?YLc&GlbNZ#|uTOXMxrZX2C^^Y`peP$j=g7}Ml2b#dp&aWyWu5bx`UPgOw
zlsOcdOOP;bfx65`|_hS5;3q(9e{L|tmc$0i&=lCEWVXX!fvcaYnRs0`!7$rK*Ipr)D-Geu9
zU--OFs*c;j*VAgZ6WFgyz~xHz#JHKl}lS5H^=hZ@?L7rPj48Q$2u4(Y!
zHBSkt(m-o92%RSR_Vx}#KFD@Z#@!KSrrnH+M*;<+ktStiOtiW?`&9y2Z=JIY)6RZb
zdYiiFJ#4apVtoo!^sX<-a)pa4EM$w`n_p&j-rcGZ%-Bg=)kup}2MyXr|61)%d>*ob
zxq%JI!3UCfJIayUSC$p3f)l*IB(>~{frT^H&4{H8w%~lQDg%Qs8e!SM{R*jI
zCWWoJ-VpEeg-%GHff3usOsKs4p^yx!&nQpGiJLp_=yqJtG0hxS&kTBzdeq;tRWR(@
zBx8K{kX82Pua>K40EV{xqMvR3uQUbTr<nu!
zp=h=!rCha8d#7sN@oHvnjbcf*fK>*&B#t`naWvC+6_Yed=K{0kyeEkt@onDfkcvSV
zuC%d*vC@o8SKJA;frN&enoXOHfP}aU_~S%~_JKzwVs{)+B(w5wRq
z^%-Ve%}bP(jZ>RrB*gi_-ILuQ6ydN<9r@W-_`|I_?V6eK7kS(}DHgQWzu&1(y!N+w
zDn6lNh4nMsp|o#r;z_nP#d-uj>TwXO;wVZ&fclUHIRf^eQoxhaov&J
zhrz3YwuTH5Wl2tG1s(3smC{f3t>E{-_dos!y9D?b)DQ+GqC@se6&ZN!o<7l^y;~bK
z{m7{a;^pkSkkxRIuLY;$Fl@$@6^r8S`MrPD^=p6(mWG-tsp{|s_3WexY1FjM%13h_
zpIEvLTb)^smrgC2r;qd(W+*o5`)XAxmMXnLmZIOOdn0sO!5oRsN=RMqeTjmE^mytV
z=x6vG*6K+=AuFSKLcG&|4xz%{GZ#qe`HRGk@L@+HK0>#tMe?A3F0(!w$|E5(v|YkWx6)RK#6+uPl%
zwr_guinftl0!m;Cr&O}na1ON@E?wIY!bI^PM@n0guS^a1M}Z*-6L|Ot6+Q5$-6MA{
zZ?JMYq!X*9S0S>*UumILfn%}a(fv~Scy`j@tpY7~b87fiaH~P=TbR=l&tPGOLvl;)
z0YNOM5%sBCM+zIGZOO8;b6OdZb~cxA^mcL+Vu~Tb?i!aygUZ%pn8ncnW6$z7+l!xp
z^+!_U)gyH#X$d6?K73qsFHvirFl_XGuzRofw>z76Jr)jhY&R^knJT+W@Q;0mS$w}H
zvL(9RQqTs6Vk}L9@(4S{PVoJFv!Jphtv1NPbaji%G`M%hJt9fNI=scJu$H?qej-6l
z(}>*v7EeBG^7&_Ia6=`Q^%4-a9((8foPRjKwrI{fVE@}&HgnfrhsB6&;qy6If7z<}
zC&Z@i4pzzJw-f!+C7?`$xv2Zl%awqR(>4kMoUBz%KzPYjrrSd?fu@m-y9BU)Lz#uU#ho_f|6w>EIl*igfR3Ve$j`9Ok5B#BQs*WZ
zaWCZ6-xQ2JsNews{n2XQ;+oVWrtpGYgGOQfd7&0*OIuBo&n6vr$2K2fY*)I2S%G
zpA;}x!JMHfCT7jH2KZ7lnb#nMVg4Z8t{~CV9LQUr&fa1U`bw#}2a4$V9p8Pr&1T7y
z&vP?DYpcm7v}${moxFNvQ+T89$e~-j<~Jg)>P%YiYkQn`h+Dl+Tj;&FtpX)m6N1nU
zk9E4h4vL|H&XK%&qHcmI6Ec3Oym%zd^@%Z_stWxIZo?Im#v^$VRY=z;dsB9++#6i~SsU!^J|IkM%{^R*4sp5g
zyN7WIX7CuO%e?&prgzTTy$OV4cVLZT91zx9XwPH*kwhyuznmM+0+b(*avM
z4gF`m<9<3f%m>!DwNc*vcQpA*bO%(=+&OrT6ZIvxrt{i%%}?CaTMEAtnwL>8>lILw
zenINLs9JakY*Gx8^g+KRRIF!MvQUE#Cjx)QkU?J^d{eb9f?C%Uu5xDWqG^;bGA{v{
zS3znVyATnuCbY{;LACuV6_NM~0GN#P%W85>^=&4af;Yp-f91`{RFt~U6b@%ug#32V
z#ZE5p73o4D*S$V$O+rS8>X;PA_koAqoh7Q>@aJ0~=q9E$~L?
zy7{ypdTH|Mb?WB>D3y>7VP0JAf3E)ql*8L*j&}Ax4MOxPgMu0lT&X&qRE2KpmT~Hk
zrf*7F2I$r+TmooO3yV&lF)2<8^fYYu<zT6JoV@8<6)1eklK=O3xX
z
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
LxzoyPWwS`DTH~
literal 0
HcmV?d00001
diff --git a/system/application/views/themes/boxy/images/.svn/text-base/blogback.jpg.svn-base b/system/application/views/themes/boxy/images/.svn/text-base/blogback.jpg.svn-base
new file mode 100644
index 0000000000000000000000000000000000000000..ce7ed7ed7267d5fd24a78cc1fcfee48d98ef22bc
GIT binary patch
literal 1096
zcmex=J1_m4;zzGK+EkIR3c~%ZKRyHIV
zxDxz~{|6WZIT)rfOk-vgWMC3xWEN!ne}o|elbXh49G
zfr*KMm5B|g0Rotq850E+4Fek;Cl)T;c=2P<2O*`0f-qUQ_W!pScz}AC1epaH>>2+3
zgG*48!7ee)_~RQs2V^r@3O9e^eQfvV;~lB5&l`|s>iERopU`TZ{qPH`;ryO&Y(M51
zuW8EM=e`VcOuFO?ge8ohPrZA2M(ldo!4%#5
zH^iLoKVPBMx^GWS(~O&sw>j=fKfZp43CvK&PgP*G<$ejX?2YK5yMG%)
zbp9}P_-~)XoZ~I|;~RSdLMkaVe+gRlMQd
zI46C9B~UZ_G{y7>qE2^zvKDMl*d$(!X}=!O8z-XQ08J1GWGphPKhrcL`tWsNtn9UO00xa%c-g@mJ$MKJeQ@fM98gS^LMRaL
z(A}mJQCthtm!A+hcFvkraQ+&FxxFz^5N_Bg{b%lUfo1>rpB
zH)yXnt6Q*5a`OgVAY&)%)@SFhKj2<{cK!+wf5EmrH-9zVNIQ36ljP>rKP;Q
zysN9L5D*ZbpP$0Q!ok78k&%(q)YR+i>rhZo(b3V)&d%lK<+irAp`oGQ-`_AWFd!fx
zvCQXiaB#B7+JmXc!qVVCi`HOZU;3+~Mcz16!&A
zW5fYry`jV9REoDmf3X8wtO8-Y!PV*nTBreHzW`;*AbHUOUa|sUx)ord;pgtL%Haf8
zp8{UA;ppxFWyl0rq6Jr-Aa~7Clhi_n#*((ybDqPo%jJTq&M<=06k?`Agus)t&VjDk
zGJeJbU9W=Tec*FoDoOiqvwU%%Q>Ik+<2Ax#C2Bvm|S#6K1lZ!sD^b<}-J-B6GnKX}Sbi
zrUh1;Qjf@SrP$Kk41ejE#B^_0|0^o
zH1wk(KrbG3T9hb3q|Ki&AwrlCAiy1mB_svlcrhrX7cVJ8$Xi5DP_=82aOHwXNY_GL
z!5(NUsOz8~5rR56oCx91E?|G4%y40Y1c?+Xij=q$Q5+P|znq
z1)CTD`ZQ1=p+cXx5&A^lGj)RsIP}a>aVi!#h0fPpr#qy~XfyT$UFD-{az
zMhz?+QHT*b=rD#LXIw?aAY^#O0d+XU^FnrMEg*;meJEg{AO5U&B9ci%Kp%sUH)S6@<`v$30cHwmO_~N+
zjh2$#1mHCZT-FC;is;;L$Yq&5KnxZ+ACKDpuwVlIOiAgm!;$Wa3r
zf=KZj8iPDR)fY*m(87y3T?lJ+Iy3CRqL4>@9!69=BvV*W76rx6*RtTa5iDnE!#|R^E!NpWn2$F>VM$0j3
zO?TggcNuwNHju!1;OdCr#t{ra*nj&;`4-6ig(_Elj}6A7J%>ObTAP9tqf1k|`LWF(
zvN15r0~0ir8bBCW6cMn3z#uFPf2;t*2Y@}Hp2^26`x2N*OC6*2(R`<%0dKVvhj}<_GmN$7v0IDY+Xo$}Y1kG>Iu5d`}
z)2~XD3k9C#vH>%<{lSbx2Y4W?0c#9wfD>99z;)CH%&~(WOrRiy5`Ta}b`yg10Pz-S
zX*p9O-y(v+XR;EKTId(%qR<}*1pVs2L?f?3IL+_$hZCm@i$vC253)jb>!*MJhZVMK
zAqXEbL?K1+!z)5w0(T!`VXol}f%0O8^i&0H3&O=;DH7E
z0|-3effW=21P}Z`1gl2D2#TQ#T@XVe2vDy09ijk&F`)`q$if!7@P#mpp$un8!y4M~
LhB%BwAOHY6z{<=<
literal 0
HcmV?d00001
diff --git a/system/application/views/themes/boxy/images/.svn/text-base/diggback.gif.svn-base b/system/application/views/themes/boxy/images/.svn/text-base/diggback.gif.svn-base
new file mode 100644
index 0000000000000000000000000000000000000000..d811b51b8fb1be9e78c82541ef4a5e93b1ddd8c7
GIT binary patch
literal 1014
zcmV`Nk%w1VbcID0OkMy*5T_rZl9;V)TO=C3rmRa^Y=Duod7j?J#wN?gs;BO
z;3Qs@fTF=ebfbQtz>loRi>k&EP>bH?@6p}q5l@RKVU}5ht|42J99WSTRE{fTnJQzL
zB3zUlSCBz-q9k3E8di`MQjIrkp5^TF4^E02R*zPLtqo0y{{H^L(&4<$-XdI+l(EY(
zXq!rUr}p^zt;5%;z||R6kDRv8@bvhGro<9ai~v7?=k4Ct#L(p1=J4{*F@Q3r^UF-+&OTeI&-8aUzV`N*xKanwaMFXl(=%3y8Hb74NQqcd8hOD`AvMNG-;co
zyVCdh`ttSotHRbqd8h(Kge6~=MRui@vCRMf{uEJ+9$Ask+~^)!l2L!EG-;fmxzVY=
z)xXf-I&`Jz?(^pC^WEp~5mAhrwa+bPnm=`<3`~g@Q;z@t{~K43A^8LV00000EC2ui
z0Mh_1000O7fPaF6goTEOh>41ejE#JTm+30RJEn5f8-$DfK+qh?GM^7YztD
z>^YMoU^Ea)LWD2^reFmv0|q?Vps{4hb$v{h%mJi~n*>x6=;2}U83-UlM2OJwrr?ka
zRhU%3u)u)MqauWq5Q6k52N_c^&^dBs1I?PvY>A{CzXJ$M}k?pzT2{=F&dg^!q2-p!nUYTYm
z0ItMSgM0aC8WTW)ni%m&0KgXX)rSlPU&!Uh1z6Oh!)Rqir=bwNED(Iku7Ha6Bh$gD2Ab|h?JM?+iF;o{=v;^GnD0RsUZK7IjyJ|1CV5fNcw
z8EI*08F@HhWM^mR<>8eO5Ri}(6%>_%OAyQWe}F-dgTaWwh?!B4fk}{&S&;Gn5r%r8
z`&bznfzE^hRz_wPHg+bUcbFMbBp8{P8CX~a7?>EDSQ$8(SXm*ufWm?-42p(Atd4<+
zg-S-k#%v!%8W%d5m`>cNJh_D(Xc-g8B!nG|f=r5r%#K1VM*nXy@Gvt1UBfKMV9%g&
zioa{eOqagtg)fg8^er#1_cLr|xHR>k!GhAR$1I`FQ9X^vn8g!cA7f}NzPz77$=F@$
z-GsMNA&({dkE$>U>vUXM_GF=C-^1W_;x7!COZV@6sxU9r`Peb(dO7ZO-|d{9R5r-6
zJYKf-p#7R@=cK;(N0)Bj*Q%E*G9{fk=fu^e&RsJ7j;E!*_&cm!F!{`%^0&&~r#*ST
z2{Q!wdR*vSSKMZr+&$!Jpi>qd9!8^Exh4_-y!!nQ_Ac)vcF4O_tx`&!})zu1@~Y
z44)qBvo)JLA5UF#OH(y>`IU+j(gCw%*WM^vCtKXJ;iC0J(c5ulk)E?o{`FX#yfxy2
z@Rc)~SG%vBoV4FMJi|P(*z{Cq-IJqRjJ9r4V7wh1rtnYXFh}?D!~24Bt?$)T&a<54
zkd*P_-lB6GH|LptxO~VhHo~u4$d;|{?tcdT^Fs1$nU(eC$|p=d&$>|GD{i}>Zer_c
zmPv2*A9>_O32!*&wTR!K%qygH&WFmCX*)9iX=k4Oqi5Z1Zgk)2&3CbhQ+Z!r|K&0jOkI>Rqm3d8+=!^_U~#0);kFx4eyVW<6Sd
zHJ(>$k|~4wW*h%kTit#4`+Fy3KQ=2XIGD59WxZJ*r|6x7n@lBhWNp)B{^~uQv^H>2
zVUhCfxr;Ww)slF1HeT@0hCSEZHmm0N?J1dTc)QzdTWSF>t3X%&z2)&{k-@w|Ei)2k
z-*)D`Fiq(Ud)JcYfRf8PTH6$RS<+`$haL!ydaI(J>tJ%oRIb(d!d;ajv6FKhu5Q1)
ztzly4n*~*;-et;P-EpVmaM|*jMqdWePd%RxwDfNF{n71No^@GNTWZw;mVi8F1M4k^
zi`Jz!y+82%Hc!ON>2dYU;uW7?ulK(mC$;~=dI!;O{~6?Zt?Js;z6BqMeg0>z-Md}=
z3)=+ee3ZNSt)~6ky=ObTdjpP6fA6;M!guTa+tib~-S&Q*|8UW#jM~1>>+>{YH|41Q
K`(v^E|4jgR(&az^
literal 0
HcmV?d00001
diff --git a/system/application/views/themes/boxy/images/.svn/text-base/osfback.png.svn-base b/system/application/views/themes/boxy/images/.svn/text-base/osfback.png.svn-base
new file mode 100644
index 0000000000000000000000000000000000000000..cb710045baf0167b957c4aef5ed8247c07167180
GIT binary patch
literal 1981
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
literal 0
HcmV?d00001
diff --git a/system/application/views/themes/boxy/images/.svn/text-base/twitterdither.gif.svn-base b/system/application/views/themes/boxy/images/.svn/text-base/twitterdither.gif.svn-base
new file mode 100644
index 0000000000000000000000000000000000000000..d1fd5f15b544ffa2b6aa2261861e41413c9d1325
GIT binary patch
literal 131
zcmZ?wbhEHbWMv3o*v!E2?c2AnU%&qR`SZt*AHRS9{`2S0-@ku<{rdI&`}cqU{{8>|
zp8*vp{$v3Q=zvI&84N520Vh3I@3nY+cK81TjlPu3c`v4~$$2eRpd((AD_pTozUDo*
U!-E717m0q4h9JodGi3&A03Jj-g8%>k
literal 0
HcmV?d00001
diff --git a/system/application/views/themes/boxy/images/.svn/text-base/twittertail.gif.svn-base b/system/application/views/themes/boxy/images/.svn/text-base/twittertail.gif.svn-base
new file mode 100644
index 0000000000000000000000000000000000000000..0045e9ffa0aaa10dd4c7c34eeb19312e85894cea
GIT binary patch
literal 334
zcmaja%`1a(0KoCzvpuF14z%)6TFmPh+JRiqGHW+EI-og;liMz2ii0>j4s5tQhOx91
zTXOdj7Djn#CkMq-LX7g&{sN!#_wseQJDXejD@3kHIz$Wtun0-`f;HHNPk4oA_<;~S
z!WE?99^N1f8l1ur+(8@?@B}Nc56iF%=kN{(a10-C0(%gJ8(4)DT*5c#@C!Sz1rKlw
zOYj0`WGsOAk0mWjLO6si6K0--X{fDWxXY%@9+pSOr8+gS9&HL(omm^^qQ0KZu-oei
z4GyI29oID;>(r=n(HNVboaoi#bGplv-T3HOQuU_RM}c)7%5bPvRz1C
WV^GV>H#c+}>a|F9rBd83TK@oEq`lh!
literal 0
HcmV?d00001
diff --git a/system/application/views/themes/boxy/images/.svn/text-base/vimeoback.jpg.svn-base b/system/application/views/themes/boxy/images/.svn/text-base/vimeoback.jpg.svn-base
new file mode 100644
index 0000000000000000000000000000000000000000..780a524a400749c19da28fa263759d705c1c583e
GIT binary patch
literal 7141
zcmbVv1yEegw(bCf>)-_U-~^WtG{8V`f(LiP;I6@)!68@(?ry<#umtyk5F`*_a3{dy
zKUL?{t$O#pTXnxxyLZ>Jy}I}6?$u9APa6ONC3&zs00|iYuzV)K(;)yP=V9UC13&@*
z0RVvBGwTR|CvE9uZUwOHedZuNtpdUTNdE!ya}OE$xkW}sd44~)K$L$0_zcwN2kl?L
z_y?H(!9OO?TF-J+3^Y`<|04O1%KyLf)C&M%0Av7g6eJJ;8H9uaLV6kmv^~cML_tD&
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
OrS!dg&en{l<^KaY$WK%N
literal 0
HcmV?d00001
diff --git a/system/application/views/themes/boxy/images/.svn/text-base/youtubeback.gif.svn-base b/system/application/views/themes/boxy/images/.svn/text-base/youtubeback.gif.svn-base
new file mode 100644
index 0000000000000000000000000000000000000000..7e37eca4ab45401215e9ca780cc5b379d50ab0b5
GIT binary patch
literal 2940
zcmV-?3xo7WNk%w1VbcIn0OkMy(J1|J3G*Xgrp`WyDKZqgM+hK9IRRp!FN;j^>A9v;bqgWj^Ty&oU9
z8ymbB@0${!!d9v;OV9mE_Q#vL8sCnwn@CF3Y4@GULpDk}CcFyJRA?JO+SBO~oC
zE!!m}?kz3YBqZr8EAlQb>MJYyGBWirFytvI?=3CnDk|bADBdS0+9f6WF)`gHChIIL
z)*~a=BqZ!CEa)mK^Di&dBO~D`DEKik)FL9&A|lTrA<`lu&LAMmA0NygAIBaZ$sQiV
z9300T9mpRa#vUHpqoc_mAIBgd`0ww-9UaagA=8G2#2p>clas$59>N_R!&q3+g@x(D
z!p$Hc&>41ejE#&prN9pq@|{(sHv)}
ztgWuEu(7hUw6(UkxVf!S;(-V!-o(f
zN}NcsqQ#3CGiuz(v11cGAVZ2ANwTELlPFWFT*(BTJr4xw2&=c`|F>
z%(=7Y&!9t#9!C>oFt6t5zwd>cgW6Pd>nu_h)xO3~?&AYen-@t
\ No newline at end of file
diff --git a/system/application/views/themes/boxy/contact.php b/system/application/views/themes/boxy/contact.php
new file mode 100644
index 0000000..65d32b7
--- /dev/null
+++ b/system/application/views/themes/boxy/contact.php
@@ -0,0 +1,8 @@
+